例如考虑" iris"与R的主要设置一起安装的数据框:
names(iris)
# [1] "Sepal.Length" "Sepal.Width" "Petal.Length" "Petal.Width" "Species"
levels(iris$Species)
# [1] "setosa" "versicolor" "virginica"
现在我构建了三个模型而没有附加" iris":
t1=lm(iris$Sepal.Length ~ iris$Sepal.Width + iris$Petal.Length , data=iris)
t2=lm(iris$Sepal.Length ~ iris$Sepal.Width + iris$Petal.Length , data=iris[iris$Species=="setosa",])
t3=lm(iris$Sepal.Length ~ iris$Sepal.Width + iris$Petal.Length , data=iris , subset = (iris$Species=="setosa"))
现在我想t2=t3<>t1
但是R说t1=t2<>t3
。为什么我错了?!!
现在我再次构建我的模型,但这次附加了&#34; iris&#34;:
attach(iris)
t1=lm(Sepal.Length ~ Sepal.Width + Petal.Length , data=iris)
t2=lm(Sepal.Length ~ Sepal.Width + Petal.Length , data=iris[iris$Species=="setosa",])
t3=lm(Sepal.Length ~ Sepal.Width + Petal.Length , data=iris , subset = (iris$Species=="setosa"))
现在我和R都认为:t2=t3<>t1
。但是我再次因为附在模特身上的影响而感到困惑!我认为第一组模型相当于第二组模型,但R说不!感谢。
答案 0 :(得分:1)
在子集上进行线性模型的两种方法:
setosa <- subset(iris, subset = Species == "setosa")
t1 <- lm(Sepal.Length ~ Sepal.Width + Petal.Length, data=setosa)
lm()
t2 <- lm(Sepal.Length ~ Sepal.Width + Petal.Length, data=iris, subset = Species == "setosa")
t1
和t2
是等效的。但是,如果您在iris$
调用中使用lm()
,则R
会忽略传递给data
(可能还有subset
)的内容,因为您明确指出矢量到函数而不是数据帧。这是使用lm()
的错误方法。
答案 1 :(得分:1)
这是一个范围问题。如果你这样做:
t1=lm(iris$Sepal.Length ~ iris$Sepal.Width + iris$Petal.Length , data=iris)
t2=lm(Sepal.Length ~ Sepal.Width + Petal.Length , data=iris[iris$Species=="setosa",])
t3=lm(iris$Sepal.Length ~ iris$Sepal.Width + iris$Petal.Length , data=iris , subset = (iris$Species=="setosa"))
您获得了理想的结果。
coef(t1) == coef(t2)
(Intercept) iris$Sepal.Width iris$Petal.Length
FALSE FALSE FALSE
coef(t2) == coef(t3)
(Intercept) Sepal.Width Petal.Length
TRUE TRUE TRUE
当您说iris$Sepal.Length
时,R已经知道在哪里寻找该值。因此subset
参数是多余的,R忽略它。正如评论中所提到的,在提供foo$bar
时不需要使用data = foo
,这种情况看起来是一个很好的例子,说明为什么不这样做。