使用受限立方样条预测新数据的值

4

我有一些数据,使用受限立方样条进行建模。我在线性模型中使用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值并忽略我不需要的值来避免警告消息,但我担心predict到底在做什么。

2个回答

1
我相信 predict 函数将查找公式并用 newdata 中的变量替换其中的变量。关键在于,rcs 函数根据提供的数据(分布)确定结点的位置。因此,如果 new_data 中的数据与 my_df 中的数据具有不同的分布,则结点将位于不同的位置,并且会改变曲线。无论如何,固定结点位置可以解决问题。
为了固定结点位置,您不能使用 rcs 函数,而是使用 rcspline.eval 函数,该函数将结点位置作为参数。您可以使用相同的函数来计算结点的“应该”位置。请参见下面的代码。
Knots <- rcspline.eval(my_df$x, knots.only = TRUE) # returns only locations of knots
# see ??Hmisc::rcspline.eval for details of how it determines knot locations
mod2 <- lm(y ~ rcspline.eval(x, knots = Knots), data = my_df) # fit model
predict(mod2, newdata = new_data) # predict based on mod2 and new data

由于mod2公式包含结点位置,曲线应该具有相同的形状。


1
根据哈德利在问题上的评论,您不应该期望lmrcs兼容。以下是一个快速演示存在问题的原因:
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')

Graph produced as code output

预测结果因x值数量不同而异,即使范围相同,也不建议将这些函数组合在一起。

1
这个有文档记录吗? - user102162

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接