【问题标题】:looping regressions on unblanced data set in R (using apply functions)R中不平衡数据集的循环回归(使用应用函数)
【发布时间】: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 &lt;- 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


【解决方案1】:

将所有为 NA 的列替换为零:

Coef <- function(x) {
    DF <- setNames(as.data.frame(t(x[-(1:2)])), x$Variable)
    DF[colSums(is.na(DF)) == nrow(DF)] <- 0
    coef(lm(var1 ~., DF))
}
do.call(rbind, by(Q, Q$Country, Coef))

给予:

         (Intercept)        var2       var3
CountryA  0.01863015          NA -0.1982462
CountryB  0.26296826 -0.35416216         NA
CountryC  0.11098809 -0.07225439  0.1439667

【讨论】:

  • 谢谢!简短的问题:我必须在代码中进行哪些更改才能显示每个参数的标准错误? (或某种等效的统计显着性度量)
  • Coef 的最后一行替换为c(coef(summary(lm(var1 ~., DF)))[, 1:2]) 并在之后修复列名,或者将Coef 的最后一行替换为coef(summary(lm(var1 ~., DF)))[, 1:2] 以获得略有不同的输出。
  • 您能否简短地告诉我,如何在您的输出左侧添加每个国家/地区的名称 'coef(summary(lm(var1 ~., DF)))[, 1:2] '?
猜你喜欢
  • 2021-08-24
  • 1970-01-01
  • 2015-08-15
  • 1970-01-01
  • 2020-12-09
  • 2014-05-07
  • 2021-04-15
  • 2019-12-08
  • 2021-08-25
相关资源
最近更新 更多