微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么`ns`和`rcs`在R中生成不同的预测?

如何解决为什么`ns`和`rcs`在R中生成不同的预测?

我的理解是rcs()(来自rms包)使用截断幂表示自然(受限)三次样条。另外,我可以使用基于B样条的ns()(来自splines包)。

但是,我注意到训练适合度和测试预测可能会非常不同(尤其是在推断x时)。我试图了解rcs()ns()间的区别,以及是否可以互换使用这些功能

伪造非线性数据。

library(tidyverse)
library(splines)
library(rms)

set.seed(100)

xx <- rnorm(1000)
yy <- 10 + 5*xx - 0.5*xx^2 - 2*xx^3 + rnorm(1000,4)
df <- data.frame(x=xx,y=yy)

ns装配一个模型,并用相同结数的rcs装配另一个模型。

ns_mod <- lm(y ~ ns(x,knots=c(-2,2)),data=df)

ddist <- datadist(df)
options("datadist" = "ddist")

trunc_power_mod <- ols(y ~ rcs(x,data=df)

检查其适合度(MSE)。

mean(ns_mod$residuals^2)
mean(trunc_power_mod$residuals^2)

df$pred_ns <- ns_mod$fitted.values
df$pred_trunc_power <- trunc_power_mod$fitted.values

df_melt <- df %>% 
  gather(key="model",value="predictions",-x,-y)

ggplot(df_melt,aes(x=x,y=y)) +
  geom_point(alpha=0.1) +
  geom_line(aes(x=x,y=predictions,group=model,linetype=model))

enter image description here

生成测试数据集并绘制两个模型之间的预测。

newdata <- data.frame(x=seq(-10,10,0.1))

pred_ns_new <- predict(ns_mod,newdata=newdata)
pred_trunc_new <- predict(trunc_power_mod,newdata=newdata)

newdata$pred_ns_new <- pred_ns_new
newdata$pred_trunc_new <- pred_trunc_new

newdata_melted <- newdata %>% 
  gather(key="model",-x)

ggplot(newdata_melted,linetype=model)) +
  geom_line()

predictions

解决方法

有一个相当简单的解释:knots不是rcs()的参数。它希望使用参数parms指定结。另一个问题是knots的{​​{1}}参数未指定“边界结”,默认情况下为“ ns()”。因此,要获得相同的预测,您需要

range(x)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。