R 在glm()中使用样条线包中的ns()函数

R 在glm()中使用样条线包中的ns()函数,r,model,glm,spline,R,Model,Glm,Spline,我正在尝试使用ns()函数,该函数来自样条曲线软件包,带有泊松GLM,用于测试颗粒物浓度(pm.lag0)对健康结果(Freq)的显著性: 我找回了这些错误: 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 intro

我正在尝试使用
ns()
函数,该函数来自样条曲线软件包,带有泊松GLM,用于测试颗粒物浓度(
pm.lag0
)对健康结果(
Freq
)的显著性:

我找回了这些错误:

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

我看不出为什么原则上不能在
glm()
中使用
ns()
。要了解原因,请研究
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
这表明它为
高度
变量的自然样条曲线提供了B样条曲线基础。这里没什么特别的

因此,我怀疑您的
date
变量不是数字,或者不是R可以通过强制将其设置为数字而不引入
NA
来处理的东西-请参阅警告消息。但是,如果没有可复制的示例和数据信息,就无法判断


此外,您可能希望查看包mgcv中的
gam()
函数,该函数作为推荐包随R一起分发。它旨在以您描述的方式拟合半参数化模型,可以包括参数化术语以及其他术语的平滑/样条曲线。该软件包相当全面,可以适应大量类型的样条曲线。请参阅其手册。

阅读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
指定一个更大的数字,它应该适合您。

欢迎使用StackOverflow!在您提出更多问题之前,我建议您花几分钟阅读本手册的某一部分。@joran-我当然会-我绝对不想违反StackOverflow策略。你有没有特别指出我做错了什么?也许@mEvans一个可复制的例子的要点是,它允许其他人(比如我)复制你的问题。然后我可以阅读源代码,阅读帮助页面等。如果你发布了一个可复制的示例,我可能已经调查过了。但既然你没有,我就不想花时间构建我自己的示例并追踪问题。所以我忽略了这个问题,继续前进。关键是你可能很幸运,有人碰巧知道答案。或者,您可以提供更多信息,并可能让有足够兴趣的人来帮助您。@mEvans请不要假定知道什么时候有一个可复制的示例是有帮助的还是没有帮助的。根据我对所涉及的功能的现有知识,我冒险进行了猜测。其他人会愿意跟踪示例的执行以识别错误,即使他们不知道错误可能是什么。如Andrie points所示,如果没有可复制的示例,您将失去社区中大部分人的输入,从而将自己限制在拥有(或像我认为他们可能拥有)所需领域特定知识的更小子集。
One can supply ‘df’ rather than knots;
          ‘ns()’ then chooses ‘df - 1 - intercept’ knots at suitably
          chosen quantiles of ‘x’