我正在尝试使用 splines 包中的ns()
函数和我使用的泊松GLM来测试颗粒物质浓度(pm.lag0
)的重要性健康结果(Freq
):
> gfit4 = glm(Freq ~ pm.lag0 + ns(date, df=2), family = poisson(),
data = dt, offset = log(pop))
我收到了这些错误:
Error in splineDesign(knots, x, ord, derivs, outer.ok = outer.ok) :
must have at least 'ord' knots
In addition: Warning message:
In sort(as.numeric(knots)) : NAs introduced by coercion
这不是ns()
的有效用途吗?有人可以帮我解码这个错误信息吗? R提供的样条文档似乎与此错误不匹配(?ns
)。
答案 0 :(得分:6)
我无法理解为什么原则上无法在ns()
中使用glm()
的原因。要了解原因,请研究ns()
在公式中的作用。来自?ns
> model.frame(weight ~ ns(height, df = 5), data = women)
weight ns(height, df = 5).1 ns(height, df = 5).2 ns(height, df = 5).3 ns(height, df = 5).4 ns(height, df = 5).5
1 115 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
2 117 7.592323e-03 0.000000e+00 -8.670223e-02 2.601067e-01 -1.734045e-01
3 120 6.073858e-02 0.000000e+00 -1.503044e-01 4.509132e-01 -3.006088e-01
4 123 2.047498e-01 6.073858e-05 -1.677834e-01 5.033503e-01 -3.355669e-01
5 126 4.334305e-01 1.311953e-02 -1.324404e-01 3.973211e-01 -2.648807e-01
6 129 6.256681e-01 8.084305e-02 -7.399720e-02 2.219916e-01 -1.479944e-01
7 132 6.477162e-01 2.468416e-01 -2.616007e-02 7.993794e-02 -5.329196e-02
8 135 4.791667e-01 4.791667e-01 1.406302e-02 2.031093e-02 -1.354062e-02
9 139 2.468416e-01 6.477162e-01 9.733619e-02 2.286023e-02 -1.524015e-02
10 142 8.084305e-02 6.256681e-01 2.707683e-01 6.324188e-02 -4.052131e-02
11 146 1.311953e-02 4.334305e-01 4.805984e-01 1.252603e-01 -5.240872e-02
12 150 6.073858e-05 2.047498e-01 5.954160e-01 1.989926e-01 7.809246e-04
13 154 0.000000e+00 6.073858e-02 5.009718e-01 2.755102e-01 1.627794e-01
14 159 0.000000e+00 7.592323e-03 2.246113e-01 3.520408e-01 4.157556e-01
15 164 0.000000e+00 0.000000e+00 -1.428571e-01 4.285714e-01 7.142857e-01
这表明它为height
变量的自然样条线提供了B样条基础。这里没什么特别的。
因此,我怀疑您的date
变量不是数字,或者R不能通过将其强制为数字而不引入NA
来处理这些变量 - 请参阅警告消息。如果没有可重复的示例和数据信息,则无法分辨出来!
此外,您可能希望查看 mgcv 包中的gam()
函数,其中推荐包随R一起发布。它旨在以您描述的方式拟合半参数模型,并且可以包括参数项以及其他项的平滑/样条。该软件包相当全面,可以适应大量类型的样条。请参阅手册。
答案 1 :(得分:1)
阅读ns函数?ns
的帮助页面,在其包含的df
参数部分下:
One can supply ‘df’ rather than knots;
‘ns()’ then chooses ‘df - 1 - intercept’ knots at suitably
chosen quantiles of ‘x’
并且由于你指定了2个自由度并且没有压制默认拦截,这意味着你要求它适合一个0节的样条,它不知道该怎么做。尝试为df
指定一个更大的数字,它应该适合你。