我有来自世界银行的数据数据框,看起来像这样;
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。任何帮助将不胜感激。
由于
约什
答案 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
用于为每个国家/地区创建回归。