【问题标题】:Predicted values for new data using restricted cubic splines使用受限三次样条的新数据的预测值
【发布时间】:2017-05-07 09:24:48
【问题描述】:

我有一些数据正在使用受限三次样条进行建模。我正在使用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 实际在做什么。

【问题讨论】:

    标签: r lm rms


    【解决方案1】:

    根据 Hadley 对此 question 的评论,您不应期望 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')
    

    预测会因 x 值的数量而异,即使对于相同的范围也是如此,因此组合这些函数绝对不是一个好主意。

    【讨论】:

    • 这是否记录在任何地方?
    【解决方案2】:

    我相信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 公式包含节点位置,曲线应该是相同的形状。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-07-29
      • 2015-05-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多