天道酬勤,学无止境

按国家/地区拆分 data.frame,并在每个子集上创建线性回归模型 [重复](Split data.frame by country, and create linear regression model on each subset [duplicate])

问题

我有一个来自世界银行的 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 in lm.fit(x, y, offset = offset, singular.ok = singular.ok, ...) : 
  0 (non-NA) cases

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

谢谢

乔希

回答1

这是对@BondedDust 评论的轻微修改。

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)

这会生成一个命名的模型列表,因此您可以将 Aruba 模型提取为:

models[["Aruba"]]
回答2

看看nlme包的lmList函数:

library(nlme)
lmList(BirthRate ~ US. | country, df)

在这里, | country | country用于为每个国家/地区创建回归。

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐