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

constructing a model on a subset of a dataframe

考虑使用 R 的主要设置安装的 "iris" 数据框:

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。为什么我错了?!!

现在我再次构建我的模型,但这次附加 "iris":

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 说不!谢谢。

在子集上进行线性模型的两种方法:

正在手动创建子集

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 是等价的。但是,如果您在 lm() 调用中使用 iris$R 会忽略传递给 data(也可能是 subset)的内容,因为您明确给出了向量到函数而不是数据帧。这是使用 lm().

的不正确方法

这是一个范围界定问题。如果你这样做:

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 会忽略它。如评论中所述,提供 data = foo 时无需使用 foo$bar,这种情况看起来是为什么不这样做的一个很好的例子。