按国家/地区分割data.frame,并在每个子集上创建线性回归模型

时间:2014-12-01 19:48:19

标签: r dataframe regression linear

我有来自世界银行的数据数据框,看起来像这样;

  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。任何帮助将不胜感激。

由于

约什

2 个答案:

答案 0 :(得分:3)

这是对@ 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"]]

答案 1 :(得分:2)

查看lmList包的nlme功能:

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

此处,| country用于为每个国家/地区创建回归。