2

我正在尝试将splinesns()包中的函数与我用来测试颗粒物浓度 ( ) 对健康结果 ( ) 的显着性的泊松 GLM 一起使用:pm.lag0Freq

   > 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)。

4

2 回答 2

6

我看不出为什么原则上不能使用ns()in的原因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- 请参阅警告消息。但是,如果没有可重复的示例和有关您的数据的信息,则无法分辨!

此外,您可能希望查看mgcvgam()包中的函数,该函数作为推荐包与 R 一起分发。它旨在以您描述的方式拟合半参数模型,并且可以包括参数项以及平滑/样条曲线其他条款。该软件包相当全面,可以适应大量类型的样条。看说明书。

于 2012-03-20T08:40:19.610 回答
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它应该适合你。

于 2012-03-20T20:01:40.257 回答