使用随机和固定模型绘制面板数据混合效应模型

时间:2019-11-22 08:47:45

标签: r ggplot2 time-series rstudio panel-data

我正在研究面板数据模型,现在使用lme4包中的混合模型,我还使用了基于随机,固定,LSDV,Fisrt_diff等的模型。

我有一个绘制所有模型系数的函数。在ggplot中,但是从lme4绘制系数是一个我可以解决的问题:

是否有一种方法可以使下面的代码适用于所有模型,包括混合模型?

library(plm)
library(lme4)
library(ggplot2)

mixed <- lmer(Reaction ~ Days + (Days | Subject), sleepstudy)
fixed = plm(Reaction ~ Days, data = sleepstudy, index = c("Subject", "Days"), model = "within")
random = plm(Reaction ~ Days, data = sleepstudy, index = c("Subject", "Days"), model = "random")
pool = plm(Reaction ~ Days, data = sleepstudy, index = c("Subject", "Days"), model = "pooling")
first_diff = plm(Reaction ~ Days, data = sleepstudy, index = c("Subject", "Days"), model = "fd")
# Function to extract point estimates
ce <- function(model.obj) {
  extract <- summary(get(model.obj))$coefficients[2:nrow(summary(get(model.obj))$coefficients), 1:2]
  return(data.frame(extract, vars = row.names(extract), model = model.obj))
}

# Run function on the three models and bind into single data frame
coefs <- do.call(rbind, sapply(paste0(list(
  "fixed", "random", "pool", "first_diff"
)), ce, simplify = FALSE))

names(coefs)[2] <- "se"

gg_coef <- ggplot(coefs, aes(vars, Estimate)) +
  geom_hline(yintercept = 0, lty = 1, lwd = 0.5, colour = "red") +
  geom_errorbar(aes(ymin = Estimate - se, ymax = Estimate + se, colour = vars),
                lwd = 1, width = 0
  ) +
  geom_point(size = 3, aes(colour = vars)) +
  facet_grid(model ~ ., scales="free") +
  coord_flip() +
  guides(colour = FALSE) +
  labs(x = "Coefficient", y = "Value") +
  ggtitle("Raw models coefficients")

gg_coef

1 个答案:

答案 0 :(得分:1)

当前代码存在的错误是

data(sleepstudy)
mixed <- lmer(Reaction ~ Days + (Days | Subject), sleepstudy)
coefficients(summary(mixed))
             Estimate Std. Error   t value
(Intercept) 251.40510   6.823773 36.842535
Days         10.46729   1.545958  6.770744

在睡眠研究数据集中,天是数字,并使用连续的预测变量。使用您的ce函数,这将返回错误,因为行名已被删除,并带有2:nrow(..)。

要获得与其他模型相似的估计,请将天数设置为因数,将随机效应设置为(1 |天数)。我认为(天|主题)没有道理。

sleepstudy$Days = factor(sleepstudy$Days)
mixed <- lmer(Reaction ~ Days + (1 | Subject), sleepstudy)

我们会使用drop = FALSE稍微更改您的ce代码,以防止空行名。

ce <- function(model.obj) {
  summ.model <- summary(get(model.obj))$coefficients
  extract <- summ.model[2:nrow(summ.model),drop=FALSE, 1:2]
  return(data.frame(extract, vars = row.names(extract), model = model.obj))
}

coefs <- do.call(rbind, sapply(paste0(list(
  "fixed", "random", "pool", "first_diff","mixed"
)), ce, simplify = FALSE))

names(coefs)[2] <- "se"

运行剩下的所有东西:

gg_coef <- ggplot(coefs, aes(vars, Estimate)) +
  geom_hline(yintercept = 0, lty = 1, lwd = 0.5, colour = "red") +
  geom_errorbar(aes(ymin = Estimate - se, ymax = Estimate + se, colour = vars),
                lwd = 1, width = 0
  ) +
  geom_point(size = 3, aes(colour = vars)) +
  facet_grid(model ~ ., scales="free") +
  coord_flip() +
  guides(colour = FALSE) +
  labs(x = "Coefficient", y = "Value") +
  ggtitle("Raw models coefficients")

gg_coef

enter image description here