选择并运行所有唯一变量对的回归

时间:2015-04-02 18:41:01

标签: r lapply

说我有以下数据:

set.seed(1)
n=1000
x1=rnorm(n,0,1)
x2=rnorm(n,0,1)
x3=rnorm(n,0,1)
d=cbind(x1,x2,x3)

如何对所有变量组合运行单一单变量回归,然后提取每个组合的斜率和SE的估计值?

这意味着我需要运行:

summary(lm(x1~x2,data=d)) # slope .0018; se .033
summary(lm(x1~x3,data=d)) # slope -.094; se .033
summary(lm(x2~x1,data=d)) # slope .002; se .03
...etc

最终,我希望输出看起来像:

#slopes
      x1   x2     x3
  x1   NA .001  -.094
  x2  ...etc
  x3

 #se
      x1   x2     x3
  x1   NA .033  -.033
  x2  ...etc
  x3

2 个答案:

答案 0 :(得分:1)

这是一种使用双循环的强力方法:

# initialize matrices to store results
slope <- matrix(NA, nrow = ncol(d), ncol = ncol(d))
se <- matrix(NA, nrow = ncol(d), ncol = ncol(d))

for (i in 1:ncol(d)){

  for(j in 1:ncol(d)){

    if (i == j) next

    m <- lm(d[,j] ~ d[,i])
    slope[i,j] <- unname(coef(m)[2])
    se[i,j] <- summary(m)$coef[2, 2]


  }

}

colnames(slope) <- paste("outcome:", 1:ncol(d))
row.names(slope) <- paste("predictor:", 1:ncol(d))

colnames(se) <- colnames(slope)
row.names(se) <- row.names(slope)

答案 1 :(得分:1)

我借用了@ DMC的部分代码,但使用了combn而不是nestes循环。如果变量的数量很大,它可能会更有效,因为它只适合每种情况一次。

nvars <- ncol(d)
slopes <- matrix(NA, nrow = nvars, ncol = nvars)
se <- matrix(NA, nrow = nvars, ncol = nvars)

combs <- combn(nvars, 2) #Possible combinations

for (i in 1:ncol(combs)) {
  fit <- summary(lm(d[,combs[1,i]] ~ d[,combs[2,i]]))
  slopes[combs[1,i],combs[2,i]] <- slopes[combs[2,i],combs[1,i]] <- fit$coef[2,1]
  se[combs[1,i],combs[2,i]] <- se[combs[2,i],combs[1,i]] <- fit$coef[2,2]
}
colnames(se) <- rownames(se) <- colnames(slopes) <- rownames(slopes) <- colnames(d)