r - dplyr 版本的数据框分组然后在每组上创建回归模型

标签 r for-loop group-by dplyr idioms

任何人都可以建议dplyr回答以下问题?
Split data.frame by country, and create linear regression model on each subset

为完整起见,链接中的问题和答案包含在下面。



作为引用,这是乔希的问题:

我有一个来自世界银行的 data.frame 数据,看起来像这样;

  country date BirthRate     US.   
4   Aruba 2011    10.584 25354.8
5   Aruba 2010    10.804 24289.1
6   Aruba 2009    11.060 24639.9
7   Aruba 2008    11.346 27549.3
8   Aruba 2007    11.653 25921.3
9   Aruba 2006    11.977 24015.4

总而言之,我想对这个数据框中的 70 个国家的子集进行线性回归。如果我使用以下内容,我会在一个国家获得不错的 lm;
andora = subset(high.sub, country == "Andorra")

andora.lm = lm(BirthRate~US., data = andora)

anova(andora.lm)
summary(andora.lm)

但是当我尝试在 for 循环中使用相同类型的代码时,我收到一个错误,我将在代码下方打印该错误;
high.sub = subset(highInc, date > 1999 & date < 2012)
high.sub <- na.omit(high.sub)
highnames <- unique(high.sub$country)

for (i in highnames) {
  linmod <- lm(BirthRate~US., data = high.sub, subset = (country == "[i]"))  
}

#Error message:
Error in lm.fit(x, y, offset = offset, singular.ok = singular.ok, ...) : 
  0 (non-NA) cases

如果我可以让这个循环运行,我希望将每个模型的系数甚至更好的 r 平方值附加到一个空的 data.frame 中。任何帮助将不胜感激。

回答

作为引用,这里是 jlhoward 的回答(包含 BondedDust 的评论)利用了这个优秀问题中的 *apply 函数:
R Grouping functions: sapply vs. lapply vs. apply. vs. tapply vs. by vs. aggregate
models <- sapply(unique(as.character(df$country)),
                 function(cntry)lm(BirthRate~US.,df,subset=(country==cntry)),
                 simplify=FALSE,USE.NAMES=TRUE)

# to summarize all the models
lapply(models,summary)
# to run anova on all the models
lapply(models,anova)

#This produces a named list of models, so you could extract the model for Aruba as:
models[["Aruba"]]

最佳答案

返回来自 dplyr 的列表尚不可能。如果您只需要截距和斜率 @jazzurro 的答案就是这样,但是如果您需要整个模型,则需要执行以下操作

library(dplyr)
models <- df %>% group_by(country) %>% do(mod = lm(BirthRate ~ US., data = .))

然后如果你想对每个拟合模型执行方差分析,你可以使用 rowwise
models %>% rowwise %>% do(anova(.$mod))

但结果再次被强制转换为数据帧,与 lapply(models$mod, anova) 不太一样。 .

现在(即直到 dplyr 的下一个版本)如果您需要将整个结果存储在列表中,您可以使用 dlply来自 plyr , 喜欢 plyr::dlply(df, "country", function(d) anova(lm(BirthRate ~ US., data = d))) ,或者当然如果你不是绝对必须使用 dplyr您可以选择@SvenHohenstein 的答案,无论如何,这看起来是一种更好的方法。

关于r - dplyr 版本的数据框分组然后在每组上创建回归模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27274523/

相关文章:

c - 为什么我收到错误 "use of undeclared identifier?"

python-3.x - 重复数组直到一定长度 groupby pandas

sql - 结合使用 string_agg 并在 postgres 中使用

mysql - SQL:查找行之间的差异

R - 按分位数的历史图颜色

RRF 模型给出的测试集 NA

r - 在 R 图形窗口中组合基本图形和 ggplot 图形

java - 检查 HashMap 中的至少 Value 是否匹配?

r - 使用R在Excel工作表中创建图表

python - 使用来自不同数据集的 for 循环进行绘图