为什么 `ns(0.8)` 或 `ns(c(0.8))` 返回 `在外部函数调用中的NA/NaN/Inf (参数 1)`?

3
为什么 ns(0.8)ns(c(0.8)) 返回 NA/NaN/在外部函数调用中使用的参数1中存在无限值ns(c(0.8, 1.0)) 可以正常工作,但我想知道为什么只给 ns 提供一个值会导致 NA/NaN/在外部函数调用中使用的参数1中存在无限值
例子:
> library(splines)
> ns(0.8)
Error in qr.default(t(const)) : 
  NA/NaN/Inf in foreign function call (arg 1)


> ns(c(0.8, 1.0))
             1
[1,] 0.0000000
[2,] 0.8017837
attr(,"degree")
[1] 3
attr(,"knots")
numeric(0)
attr(,"Boundary.knots")
[1] 0.8 1.0
attr(,"intercept")
[1] FALSE
attr(,"class")
[1] "ns"     "basis"  "matrix"

你能解释一下你认为如何对一个点进行样条拟合的吗?ns()函数的结果取决于第一个参数,因为它可以用来确定节点的位置(包括边界节点)。只有一个数据点是不足以提供足够信息做出明智的选择,因此该方法失败是合理的。 - stephematician
@stephematician 听起来像是更好的错误信息。 - Franck Dernoncourt
2个回答

3

编辑:在用户评论后,我意识到我的回答与问题无关。然而,由于我已经向 R 核心团队发送了有关文档中(非常真实的)差异的电子邮件,并在邮件中引用了这篇文章,因此现在我不会删除它。


ns()函数的第二个参数df在文档中存在差异:

自由度。可以提供 df 而不是 knots;ns() 然后选择 df-1 个相应分位点(将忽略缺失值)处的拟合节点。(which will ignore missing values) 默认情况下是 df = 1,对应于没有节点。

实际上,默认值不是 1,而是 NULL,我们可以在 Usage 部分看到:

ns(x, df = NULL, knots = NULL, intercept = FALSE, Boundary.knots = range(x))


顺便说一下,我刚刚给 R-Core 开发团队发了电子邮件询问这个问题。 - Dominic Comtois
@user20650,我刚刚把它添加到我的答案中了。 - Dominic Comtois
1
哦,好的... 嗯,那让我的回答相当无关紧要了!:D - Dominic Comtois
谢谢您,@Dominic Comtois,但您最好使用公共邮件列表(R-help或..),请访问https://www.r-project.org/mail.html,或者如果您对错误有信心,请以不同的方式进行报告,详情请见https://www.r-project.org/bugs.html。 - Martin Mächler

3

我同意错误信息不够用户友好,所以至少对此进行更改是合理的。我们必须看看是否ns(<1数字>)有意义,比如ns(pi)... 我宁愿在R-devel邮件列表上讨论这个问题(https://stat.ethz.ch/mailman/listinfo/r-devel),而不是在这里。

我也同意@Dominic Comtois的看法,应该修改帮助页面,因为默认值已经不是1很长时间了。

最后但并非最不重要的是,请注意ns()bs()应该被视为一对,因为它们是这样设计的。由于它们主要用于模型公式中生成model.matrix(),我倾向于认为如果我们能够为ns(pi)情况找到一个合理的非错误结果,那将是很好的。谢谢你们提出这个问题!


这让我感到很好奇...然后,我改进了R的ns()函数,现在它可以使用ns(pi),特别是在只有一个观测值的情况下,使用lm(y ~ x1 + ns(x2) + ..., data = myD)也可以正常工作。目前仅适用于R-devel版本,但我将把它移植到“R 3.4.1 patched”版本中,因此它将出现在下一个版本的R中。 - Martin Mächler

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接