R:使用子集拟合非线性模型时的结果不同

时间:2019-07-10 13:49:13

标签: r

我尝试拟合非线性模型,但是使用subset时会得到不同的结果

> y = rnorm(10)
> x1 = rnorm(10)
> x2 = rnorm(10)
> d = data.frame(y,x1,x2)
> d
            y         x1          x2
1   1.8523001 -0.3891420 -1.04343175
2   0.1311046 -0.5092278 -0.92223138
3  -0.3290403  0.1925000 -0.06000881
4   0.7460520 -1.9672244  1.66255936
5  -0.5629108 -2.3859084  0.52453508
6   0.1736583  0.7938553  0.85644919
7  -0.2545940  1.3842103  2.26848038
8  -1.1673137  0.3639074 -1.32408201
9   0.3981072  0.2609555 -0.08882323
10 -0.4900220  0.9102555 -1.93401309
> library(splines)
> lm(y~ns(x1,5)+x2,data=d[1:5,])

Call:
lm(formula = y ~ ns(x1, 5) + x2, data = d[1:5, ])

Coefficients:
(Intercept)   ns(x1, 5)1   ns(x1, 5)2   ns(x1, 5)3   ns(x1, 5)4   ns(x1, 5)5           x2  
    -0.5629      11.8762      -3.2407       7.3733       3.6722           NA           NA  

> lm(y~ns(x1,5)+x2,data=d,subset = 1:5)

Call:
lm(formula = y ~ ns(x1, 5) + x2, data = d, subset = 1:5)

Coefficients:
(Intercept)   ns(x1, 5)1   ns(x1, 5)2   ns(x1, 5)3   ns(x1, 5)4   ns(x1, 5)5           x2  
    -0.5629      -3.3477      70.9978   -1454.1317    -494.1910           NA           NA  

1 个答案:

答案 0 :(得分:2)

事实证明,lm()在选择子集之前先运行formula参数中的所有函数。结果不同的原因是公式中的ns()函数。

只需运行即可:

lm(y~x1+x2,data=d[1:5,])

lm(y~x1+x2,data=d,subset =1:5)

您将获得相同的结果。

这意味着,在您的第一次回归中,ns()仅应用于行1:5。在您的第二次回归中,ns()被应用于整个数据集。