【发布时间】:2014-05-02 12:21:47
【问题描述】:
我有一个包含 100 个不同国家/地区的数据集,每个国家/地区有五个变量。对于每个国家,我想做一个线性回归并在之后存储结果。主要问题是,对于某些国家/地区,我没有某些变量的数据。
我的数据集有这样的结构:
set.seed(1)
Q <- as.data.frame(matrix(rnorm(360),9,40))
colnames(Q)[1]<- "Country"
colnames(Q)[2]<- "Variable"
colnames(Q)[3:40] <- paste(1900:1937)
Q[1:3,1] <- "CountryA"
Q[4:6,1] <- "CountryB"
Q[7:9,1] <- "CountryC"
Q[1:3,2] <- paste("var",1:3,sep="")
Q[4:6,2] <- paste("var",1:3,sep="")
Q[7:9,2] <- paste("var",1:3,sep="")
对于每个国家,我想做回归:
lm(var1~var2+var3)
1.平衡数据集示例
我的做法如下:
# subset the data set for wach country (if someone knows an easier approach, please tell me)
datasets <- list(NA)
j <- 1
for(cat in unique(Q$Country)){
sub <- subset(Q, Country==cat, select=c(2:40))
sub1 <- as.data.frame(t(sub))
colnames(sub1) <- sub[,1 ]
sub1 <- sub1[-1, ]
sub1$var1 <- as.numeric(as.character(sub1$var1))
sub1$var2 <- as.numeric(as.character(sub1$var2))
sub1$var3 <- as.numeric(as.character(sub1$var3))
sub1 <- sub1[,colSums(is.na(sub1))<nrow(sub1)]
datasets[[j]] <- sub1
j <- j+1
}
# apply linear regression to each dataset
regressions <- llply(datasets, lm, formula = var1 ~.)
# extract coefficients from regressions
coefs <- ldply(regressions, coef)
这没问题:
>coefs
(Intercept) var2 var3
1 0.0009635977 0.1627555 -0.1738419
2 0.2571188803 -0.3548750 -0.0248167
3 0.1109881052 -0.0722544 0.1439666
2。不平衡数据集的示例
现在,我将缺失的变量添加到数据集中:
# Add missing variables:
Q[2,3:40] <- rep(NA)
Q[6,3:40] <- rep(NA)
如果我再次执行第 1 步的循环,我会收到一条错误消息(代码运行正常,但最后一条语句 coefs <- ldply(regressions, coef) 失败):
[...]
> coefs <- ldply(regressions, coef)
Error in list_to_dataframe(res, attr(.data, "split_labels"), .id, id_as_factor) :
Results do not have equal lengths
我的问题:如何修改代码,使其适用于不平衡的数据集(缺少一些变量)?
感谢您的任何帮助或建议!
【问题讨论】:
-
一种简单的方法是消除一些值以获得相同长度的集合。另一个选项是检查
ldply函数,手册说它类似于sapply,也许你可以用它来克服这个问题。
标签: r for-loop apply linear-regression lapply