我有一些数据,我正在使用受限的三次样条建模.我正在使用rms包中的rcs转换函数来生成线性模型的转换变量.这是一个使用5节的例子.
library('rms')
my_df <- data.frame(
y = -4 * -100:100 + -1.5 * (-100:100)**2 + 3 * (-100:100)**3 + rnorm(201, 0, 1e5),
x = -100:100
)
mod <- lm(y ~ rcs(x, 5), data = my_df)
在我拟合数据之后,我想找到x值的特定域的预测y值.这是我现在正在做的事情:
new_data <- data.frame(x = -3:3)
predict(mod, newdata = new_data)
但是,这会生成一条警告消息:
Warning message:
In rcspline.eval(x, nk = nknots, inclx = TRUE, pc = pc, fractied = fractied) :
5 knots requested with 7 unique values of x. knots set to 5 interior values.
这意味着什么,以及发生了什么?我预计结点位置应该已经在mod中定义,所以我不明白为什么它似乎试图找到我给它的七个x值的新结.我可以通过在new_data中提供更多x值来避免警告消息,而忽略那些我不需要的值,但我担心预测实际上在做什么.
最佳答案 根据Hadley对此
question的评论,你不应该期望lm与rcs合作.快速演示为什么会出现问题:
mod <- lm(y ~ rcs(x, 5), data = my_df)
new_data <- data.frame(x = -3:3)
new_data2 <- data.frame(x = -300:300/100)
plot(new_data2$x, predict(mod, newdata = new_data2), type='l')
lines(new_data$x,predict(mod, newdata = new_data), col='red')
预测取决于x值的数量,即使是相同的范围,因此结合这些功能绝对不是一个好主意.