我尝试拟合非线性模型,但是使用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
答案 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()
被应用于整个数据集。