rcs在lm()模型中生成错误预测

rcs在lm()模型中生成错误预测,r,linear-regression,R,Linear Regression,我试着在过度拟合的情况下复制。我想探索样条曲线与测试多项式的比较 我的问题:使用rcs()-受限三次样条曲线-从rms软件包中,当应用于常规lm()时,我得到了非常奇怪的预测。ols()工作正常,但我对这种奇怪的行为感到有点惊讶。有人能给我解释一下发生了什么事吗 library(rms) p4 <- poly(1:100, degree=4) true4 <- p4 %*% c(1,2,-6,9) days <- 1:70 noise4 <- true4 + rnorm

我试着在过度拟合的情况下复制。我想探索样条曲线与测试多项式的比较

我的问题:使用rcs()-受限三次样条曲线-从rms软件包中,当应用于常规lm()时,我得到了非常奇怪的预测。ols()工作正常,但我对这种奇怪的行为感到有点惊讶。有人能给我解释一下发生了什么事吗

library(rms)
p4 <- poly(1:100, degree=4)
true4 <- p4 %*% c(1,2,-6,9)
days <- 1:70

noise4 <- true4 + rnorm(100, sd=.5)
reg.n4.4 <- lm(noise4[1:70] ~ poly(days, 4))
reg.n4.4ns <- lm(noise4[1:70] ~ ns(days,5))
reg.n4.4rcs <- lm(noise4[1:70] ~ rcs(days,5))
dd <- datadist(noise4[1:70], days)
options("datadist" = "dd")
reg.n4.4rcs_ols <- ols(noise4[1:70] ~ rcs(days,5))

plot(1:100, noise4)
nd <- data.frame(days=1:100)
lines(1:100, predict(reg.n4.4, newdata=nd), col="orange", lwd=3)
lines(1:100, predict(reg.n4.4ns, newdata=nd), col="red", lwd=3)
lines(1:100, predict(reg.n4.4rcs, newdata=nd), col="darkblue", lwd=3)
lines(1:100, predict(reg.n4.4rcs_ols, newdata=nd), col="grey", lwd=3)

legend("top", fill=c("orange", "red", "darkblue", "grey"), 
       legend=c("Poly", "Natural splines", "RCS - lm", "RCS - ols"))
库(rms)

p4只要指定结,就可以将rcs()与非rms装配器一起使用。对于ols对象,predict默认为predict.ols,这很好,因为它“记住”在拟合模型时将节点放置在何处。predict.lm没有该功能,因此它使用新数据集的分布来确定节点的位置,而不是训练数据的分布。

使用
lm
rcs
是一个坏主意,即使您在
rcs
中指定了节点。下面是一个例子:

伪造数据

库(tidyverse)
图书馆(rms)
种子集(100)

xx
rcs
不是为与
lm
一起工作而设计的-你为什么期望它会这样?@hadley:我知道它不是为lm设计的。我只是认为所有的样条曲线,多项式等只是把一个向量转换成一个矩阵,它不是特定于包的。