假设我有2个数据框,一个用于2015年,一个用于2016年。我想为每个数据框运行回归,并为每个回归绘制系数之一及其各自的置信区间。例如:
set.seed(1020022316)
library(dplyr)
library(stargazer)
df16 <- data.frame(
x1 = rnorm(1000, 0, 2),
t = sample(c(0, 1), 1000, T),
e = rnorm(1000, 0, 10)
) %>% mutate(y = 0.5 * x1 + 2 * t + e) %>%
select(-e)
df15 <- data.frame(
x1 = rnorm(1000, 0, 2),
t = sample(c(0, 1), 1000, T),
e = rnorm(1000, 0, 10)
) %>% mutate(y = 0.75 * x1 + 2.5 * t + e) %>%
select(-e)
lm16 <- lm(y ~ x1 + t, data = df16)
lm15 <- lm(y ~ x1 + t, data = df15)
stargazer(lm15, lm16, type="text", style = "aer", ci = TRUE, ci.level = 0.95)
Run Code Online (Sandbox Code Playgroud)
我想作图t=1.558, x=2015,并t=2.797, x=2016带有各自的0.95 CI。最好的方法是什么?
我可以“手工”完成,但是我希望有更好的方法。
library(ggplot2)
df.plot <-
data.frame(
y = c(lm15$coefficients[['t']], lm16$coefficients[['t']]),
x = c(2015, 2016),
lb = c(
confint(lm15, 't', level = 0.95)[1],
confint(lm16, 't', level = 0.95)[1]
),
ub = c(
confint(lm15, 't', level = 0.95)[2],
confint(lm16, 't', level = 0.95)[2]
)
)
df.plot %>% ggplot(aes(x, y)) + geom_point() +
geom_errorbar(aes(ymin = lb, ymax = ub), width = 0.1) +
geom_hline(aes(yintercept=0), linetype="dashed")
Run Code Online (Sandbox Code Playgroud)
最佳:图形质量(看起来不错),代码优美,易于扩展(超过2个回归)
对于评论来说,这太长了,因此我将其发布为部分答案。
从您的帖子中还不清楚您的主要问题是使数据变为正确的形状,还是绘制图本身。但是,为了跟进其中一项评论,让我向您展示如何使用来运行多个模型dplyr,broom这使绘制变得容易。考虑mtcars-dataset:
library(dplyr)
library(broom)
models <- mtcars %>% group_by(cyl) %>%
do(data.frame(tidy(lm(mpg ~ disp, data = .),conf.int=T )))
head(models) # I have abbreviated the following output a bit
cyl term estimate std.error statistic p.value conf.low conf.high
(dbl) (chr) (dbl) (dbl) (dbl) (dbl) (dbl) (dbl)
4 (Intercept) 40.8720 3.5896 11.39 0.0000012 32.752 48.99221
4 disp -0.1351 0.0332 -4.07 0.0027828 -0.210 -0.06010
6 (Intercept) 19.0820 2.9140 6.55 0.0012440 11.591 26.57264
6 disp 0.0036 0.0156 0.23 0.8259297 -0.036 0.04360
Run Code Online (Sandbox Code Playgroud)
您会看到,这在一个不错的数据框中为您提供了所有系数和置信区间,从而使绘制ggplot变得更加容易。例如,如果您的数据集具有相同的内容,则可以向它们添加年份标识符(例如,df1$year <- 2000; df2$year <- 2001等),然后将它们绑定在一起(例如,使用中的bind_rows,可以使用bind_rows的.id选项)。然后,您可以使用年份标识符而不是cyl上面的示例。
这样绘制就很简单。要使用mtcars一次数据,我们绘制的系数disp只(虽然你也可以使用faceting,grouping等):
ggplot(filter(models, term=="disp"), aes(x=cyl, y=estimate)) +
geom_point() + geom_errorbar(aes(ymin=conf.low, ymax=conf.high))
Run Code Online (Sandbox Code Playgroud)
要使用您的数据:
df <- bind_rows(df16, df15, .id = "years")
models <- df %>% group_by(years) %>%
do(data.frame(tidy(lm(y ~ x1+t, data = .),conf.int=T ))) %>%
filter(term == "t") %>%
ggplot(aes(x=years, y=estimate)) + geom_point() +
geom_errorbar(aes(ymin=conf.low, ymax=conf.high))
Run Code Online (Sandbox Code Playgroud)
请注意,仅通过将越来越多的数据绑定到主数据框就可以轻松地添加越来越多的模型。如果要绘制多个系数faceting,还可以轻松地使用grouping或位置dodge来调整相应图的外观。
| 归档时间: |
|
| 查看次数: |
1784 次 |
| 最近记录: |