按国家/地区拆分data.frame,并在每个子集上创建线性回归模型[重复]
Posted
技术标签:
【中文标题】按国家/地区拆分data.frame,并在每个子集上创建线性回归模型[重复]【英文标题】:Split data.frame by country, and create linear regression model on each subset [duplicate] 【发布时间】:2015-01-29 21:52:55 【问题描述】:我有一个来自世界银行的数据的 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。任何帮助将不胜感激。
谢谢
乔什
【问题讨论】:
去掉i
周围的引号和括号。 R 是不是宏语言。另外,您需要停止覆盖循环中的值。要么使用 lapply 返回列表中的值,要么学习索引列表元素。
@BondedDust,谢谢。这解决了我的问题。您能否提供一种方法来执行我正在尝试使用 lapply 执行的任务?
mods <- lapply( highnames, function(nm) lm(BirthRate~US., data = high.sub, subset = (country == nm)) ); mods[["Andorra"]]
我想知道来自nlme
的lmList
是否适合你。
【参考方案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
用于为每个国家/地区创建回归。
【讨论】:
以上是关于按国家/地区拆分data.frame,并在每个子集上创建线性回归模型[重复]的主要内容,如果未能解决你的问题,请参考以下文章