我想对调查数据中受访者的4个不同社会经济水平进行同样的回归。
例如:
educational_level (of subset 1) = ß0 + ß1*educational_level_father + ß2*race + ... +u
educational_level (of subset 2)= ß0 + ß1*educational_level_father + ß2*race + ... +u
......等等。如何基于其中一个特定变量(列)的值来划分data.frame
?
答案 0 :(得分:0)
一种方法涉及循环子集列中的唯一值。请查看for
和subset
:
> data("iris") ## A data set
> unique_species <- unique(iris$Species) ## Get the unique values of the subsetting column
> results <- list() ## Set up a list to store the regressions you will run within the loop
> for (species in unique_species) { ## Loop over each unique value
+ data_subset <- subset(iris, iris$Species == species) ## Subset based on the desired value
+ results[[species]] <- lm(Sepal.Length ~ Sepal.Width + Petal.Length + Petal.Width,
data=data_subset) ## Run each regression
+ }
这将产生:
> results
$setosa
Call:
lm(formula = Sepal.Length ~ Sepal.Width + Petal.Length + Petal.Width,
data = data_subset)
Coefficients:
(Intercept) Sepal.Width Petal.Length Petal.Width
2.3519 0.6548 0.2376 0.2521
$versicolor
Call:
lm(formula = Sepal.Length ~ Sepal.Width + Petal.Length + Petal.Width,
data = data_subset)
Coefficients:
(Intercept) Sepal.Width Petal.Length Petal.Width
1.8955 0.3869 0.9083 -0.6792
$virginica
Call:
lm(formula = Sepal.Length ~ Sepal.Width + Petal.Length + Petal.Width,
data = data_subset)
Coefficients:
(Intercept) Sepal.Width Petal.Length Petal.Width
0.6999 0.3303 0.9455 -0.1698
只有4个级别,这应该是合理有效的。
答案 1 :(得分:0)
base-R解决方案是:
dat.list <- split(x=YourData, f = as.factor(YourData$YourCharacter)
summary(lm(educ ~ educ_father, data=dat.list[[1]]))
summary(lm(educ ~ educ_father, data=dat.list[[2]]))
summary(lm(educ ~ educ_father, data=dat.list[[3]]))
summary(lm(educ ~ educ_father, data=dat.list[[4]]))
或者,您可以将回归结果分配给带有一个for
循环的列表。
如果您正在寻找更有效的解决方案(例如,您有大数据),则应实施nest-map-unnest
工作流程。我个人希望实现此目标是依靠tidyverse
的一部分broom
,purr
和dplyr
软件包。您可以检查来自this vignette的一些代码。其他解决方案当然是可能的。