如何找到平滑样条/黄土回归的 p 值?

机器算法验证 r 回归 样条 黄土
2022-03-07 07:36:14

我有一些变量,我有兴趣找到它们之间的非线性关系。所以我决定拟合一些样条曲线或黄土,并打印出漂亮的图(见下面的代码)。但是,我还想要一些统计数据,让我知道这种关系是随机问题的可能性有多大……即,我需要一些整体 p 值,例如线性回归。换句话说,我需要知道拟合曲线是否有意义,因为我的代码会将曲线拟合到任何数据。

x <- rnorm(1000)
y <- sin(x) + rnorm(1000, 0, 0.5)

cor.test(x,y)
plot(x, y, xlab = xlab, ylab = ylab)
spl1 <- smooth.spline(x, y, tol = 1e-6, df = 8)
lines(spl1, col = "green", lwd = 2)

spl2 <- loess(y ~ x)
x.pr <- seq(min(x), max(x), length.out = 100)
lines(x.pr, predict(spl2, x.pr), col = "blue", lwd = 2)
1个回答

样条库具有函数bsns将创建样条基础以与该lm函数一起使用,然后您可以拟合线性模型和包含样条的模型,并使用该anova函数进行完整和简化的模型测试,以查看样条模型是否拟合得更好比线性模型。

这是一些示例代码:

x <- rnorm(1000)
y <- sin(x) + rnorm(1000, 0, 0.5)

library(splines)

fit1 <- lm(y~x)
fit0 <- lm(y~1)
fit2 <- lm(y~bs(x,5))

anova(fit1,fit2)
anova(fit0,fit2)

plot(x,y, pch='.')
abline(fit1, col='red')
xx <- seq(min(x),max(x), length.out=250)
yy <- predict(fit2, data.frame(x=xx))
lines(xx,yy, col='blue')

您还可以使用该poly函数进行多项式拟合并测试非线性项作为曲率测试。

对于黄土拟合,它有点复杂。黄土平滑参数有一些等效自由度估计值,可与R2要构建的线性模型和黄土模型的值以及 F 检验。我认为基于引导和置换测试的方法可能更直观。

有一些技术可以计算和绘制 loess 拟合的置信区间(我认为 ggplot2 包中可能有内置方法),您可以绘制置信带并查看直线是否适合该带(这个不是 p 值,但仍然给出是/否。

您可以拟合线性模型并取残差并将黄土模型拟合到残差作为响应(并将感兴趣的变量作为预测变量),如果真实模型是线性的,那么这种拟合应该接近一条平线并重新排序点相对于预测器不应该有任何区别。您可以使用它来创建置换测试。拟合黄土,找到离0最远的预测值,现在随机置换点并拟合新的黄土,找到离0最远的预测点,重复一堆,p值是更远的置换值的比例从 0 比原始值。

您可能还希望将交叉验证视为选择黄土带宽的一种方法。这没有给出 p 值,但无限带宽对应于完美的线性模型,如果交叉验证表明带宽非常大,那么这表明线性模型可能是合理的,如果更高的带宽明显不如某些带宽越小,这表明明确的曲率和线性是不够的。