使用ns()进行样条预测

时间:2012-10-22 23:28:44

标签: r statistics

我正在尝试重现Hastie等人(2008)的“统计学习要素”的图5.4(第147页)的左上图。

这样做很容易:

library(splines)
library(gam)
sa=read.table("http://www-stat.stanford.edu/~tibs/ElemStatLearn/datasets/SAheart.data",
    sep=",",head=T,row.names=1)
mdl=glm(chd~ns(sbp,4)+ns(tobacco,4)+ns(ldl,4)+famhist+ns(obesity,4)+ns(age,4),data=sa,family=binomial())
plot.gam(mdl,terms="ns(sbp, 4)")

给出了所需的情节。

但是,如果我尝试直接应用我对该方法的粗略理解:

xvar=seq(min(sa$sbp),max(sa$sbp),length.out=200)
basis=ns(xvar,4)
sbpnames=c("ns(sbp, 4)1",  "ns(sbp, 4)2",  "ns(sbp, 4)3",  "ns(sbp, 4)4")
plot(xvar,basis%*%mdl$coef[sbpnames],type="l")
情节不一样。谁会知道为什么会这样?所有反馈都非常赞赏。

1 个答案:

答案 0 :(得分:1)

我认为他们以y值的不同价值观为中心的事实与西蒙伍德在上周回答R-help的问题有关。关于在gam的公式中使用'+ 0'的含义,以及(希望这是一个相当准确的摘要......){} {}}假设spline拟合具有其Intercept值的问题从拟合值中减去。我认为他会为绘制例程做出类似的假设。他基本上暗示添加+0只会让事情变得混乱,并建议不要这样做。

“水平移位”与选择结点位置以产生结点位置的相等分位数并且您的“新数据”均匀分布在血压范围内的事实有关,而原始数据是右倾斜的中位数在不同的位置。这是ns函数的效果,如果您为两次运行指定了相同的结,则可以“修复”。