两个回归的系数图
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?)
- 您可能对
broom
和 dotwhisker
包感兴趣,它们可以进一步简化类似的任务(例如,如果您有两个回归 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')
我正在尝试使用 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?) - 您可能对
broom
和dotwhisker
包感兴趣,它们可以进一步简化类似的任务(例如,如果您有两个回归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')