Select 和 运行 对所有唯一变量对的回归
Select and run regression on all unique pairs of variables
假设我有以下数据:
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
这是一个使用双循环的蛮力方法:
# 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)
我借用了@DMC 的部分代码,但使用了combn
而不是嵌套循环。如果变量的数量很大,它可能会更有效,因为它只适合每个案例一次。
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)
假设我有以下数据:
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
这是一个使用双循环的蛮力方法:
# 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)
我借用了@DMC 的部分代码,但使用了combn
而不是嵌套循环。如果变量的数量很大,它可能会更有效,因为它只适合每个案例一次。
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)