两个回归的系数图

Coefficient plot of two regressions

我正在尝试使用 ggplot 创建一个结合了两个不同回归结果的系数图。每个回归的系数、标准误差和置信区间边界存储为以下形式的数据框:

## regression1: 
   var     betas       crse       upper       lower
1  x1  0.517251974 0.58176862  0.37751553  0.05698842
2  x2 -0.260210445 0.03521915 -0.12118217 -0.25923872
3  x3  0.680752318 0.08844444  0.75410023  0.40740441
4  x4  0.663395004 0.05090350  0.26316403  0.06362598
5  x5 -0.551992451 0.03289870 -0.08751219 -0.21647271

## regression2:
   var     betas       crse       upper       lower
1  x1 -0.343254719 0.05498965  0.01451302 -0.20104246
2  x2  0.126434568 0.02243139  0.17040108  0.08247165
3  x3 -0.178460203 0.06215729 -0.05663415 -0.30028625
4  x4  0.301058265 0.03737595  0.37431378  0.22780275
5  x5 -0.054594805 0.02037967 -0.01465139 -0.09453822

我的方法是使用以下方法将两个回归组合到一个数据框中:

combined <- rbind(regression1, regression2)

然后我使用 ggplot:

ggplot(combined, aes(x=var, y=betas)) +
  geom_point(aes(x=var, y=betas), 
             color="red", 
             shape=15) + 
  geom_errorbar(aes(ymin=lower, ymax=upper), 
                width=.25, 
                size=.65)

然而,两个模型的系数/置信区间的线在图中相互重叠,不容易区分哪个是哪个。有没有办法把线分开,这样就可以区分了?也许我使用了错误的方法,我不应该 rbind 这两个图。

您只需要创建一个新变量来跟踪这两个回归,并允许点/误差线的颜色随该变量变化。躲避允许将两个回归横向分开。所以:

regression1$Reg <- "Regression 1"
regression2$Reg <- "Regression 2"

combined <- rbind(regression1, regression2)

ggplot(combined, aes(x=var, y=betas)) +
  geom_point(aes(x=var, y=betas, colour = Reg), 
             shape=15, position = position_dodge(width = 0.25)) + 
  geom_errorbar(aes(ymin=lower, ymax=upper, colour = Reg), 
                width=.25, position = position_dodge(width = 0.25), 
                size=.65)

@user2602640 的回答得到了要点,但您还可以使用一些额外的快捷方式。

  • dplyr::bind_rows() 将自动设置一个“id”列(您需要命名参数,这有点烦人;否则 id 将恢复为数字索引)
  • 如果您对误差线没有端帽的线没问题(反正 minimalist/Tufte 定量图形学派推荐),那么 geom_pointrange() 将在同时(也许在扩展的 ggplot-verse 的某个地方有一个类似的组合点和误差线 geom?)
  • 您可能对 broomdotwhisker 包感兴趣,它们可以进一步简化类似的任务(例如,如果您有两个回归 dotwhisker::dwplot(r1, r2) 将自动构建组合系数图)

position_dodge() 选择的宽度 (0.25) 是您可能想要调整的美学选择(ggplot 会像箱线图一样自动避开几何图形,但会考虑零宽度的点,因此您需要指定位移量)

library(tidyverse)
combined <- bind_rows(reg1=reg1, reg2=reg2, .id="model")
ggplot(combined, aes(x=var, y=betas, ymin=lower, ymax=upper, colour=model)) +
   geom_pointrange(position=position_dodge(width=0.25))

数据设置

reg1 <- read.table(header=TRUE, text="
   var     betas       crse       upper       lower
 x1  0.517251974 0.58176862  0.37751553  0.05698842
 x2 -0.260210445 0.03521915 -0.12118217 -0.25923872
 x3  0.680752318 0.08844444  0.75410023  0.40740441
 x4  0.663395004 0.05090350  0.26316403  0.06362598
 x5 -0.551992451 0.03289870 -0.08751219 -0.21647271
")

reg2 <- read.table(header=TRUE, text="
   var     betas       crse       upper       lower
 x1 -0.343254719 0.05498965  0.01451302 -0.20104246
 x2  0.126434568 0.02243139  0.17040108  0.08247165
 x3 -0.178460203 0.06215729 -0.05663415 -0.30028625
 x4  0.301058265 0.03737595  0.37431378  0.22780275
 x5 -0.054594805 0.02037967 -0.01465139 -0.09453822
")

您可以使用 matplot。但是,您的回归似乎有缺陷,因为贝塔不在 CI 之间。

matplot(regression1[, c(2, 4:5)], type='l', lty=c(1, 2, 2), col=1)
matlines(regression2[, c(2, 4:5)], type='l', lty=c(1, 2, 2), col=2)
legend('topright', legend=paste('r', 1:2), text.col=1:2, bty='n')