在数据框的子集上构建模型
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")
t1
和 t2
是等价的。但是,如果您在 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
,这种情况看起来是为什么不这样做的一个很好的例子。
考虑使用 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")
t1
和 t2
是等价的。但是,如果您在 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
,这种情况看起来是为什么不这样做的一个很好的例子。