在数据帧的子集上构建模型

时间:2016-06-25 19:47:15

标签: r linear-regression

例如考虑" 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说不!感谢。

2 个答案:

答案 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")

t1t2是等效的。但是,如果您在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,这种情况看起来是一个很好的例子,说明为什么不这样做。