在 ggplot2 中可视化多级模型 (HLM)

机器算法验证 r 数据可视化 多层次分析 ggplot2
2022-03-12 00:50:03

我有几个国家的纵向数据,关注 GDP 和二氧化碳排放量。在 ggplot2 中,通过为每个国家/地区分别绘制关系,很容易使软件做一些 HLM-ish:

 ggplot(dat, aes(x=CO2.Emissions, y=GDP, color=as.factor(Country))) + 
   geom_point(shape=20) + 
   geom_smooth(method=lm) + 
   theme(legend.position="none") + 
   scale_y_log10(name="Log10(GDP)") +
   scale_x_log10(name="Log10(CO2 Emissions)")

我得到以下情节: 在此处输入图像描述

但是,这不是多级模型的真实图。我很想做这样的事情,但可视化多级模型的结果。具体来说,模型是:

 lmer(GDP ~ 1 + CO2.Emissions + (1 + CO2.Emissions | Country), data=dat )

这会为每个国家/地区生成随机斜率和截距。问题:我可以绘制这些并获得类似于(并且在美学上令人愉悦)上面的 ggplot 的东西吗?我想可视化模型中描述的关系,而 ggplot2 没有这样做。

任何帮助表示赞赏!

2个回答

拟合lmer模型时,可以使用该coef()函数从模型中提取系数。您的代码将类似于:

mod1 <- lmer(GDP ~ 1 + CO2.Emissions + (1 + CO2.Emissions | Country), data=dat)

然后您可以coef()通过指定调用并提取每个组的系数:

coef(mod1)$Country

这将为您提供一个截距向量(您在随机项中指定的“1”)和斜率(用于“C02.Emissions”)。

然后,您可以将它们中的每一个保存到它们自己的向量中:

intercepts <- coef(mod1)$Country[,1] # Specifying the first column only
slopes <- coef(mod1)$Country[,2] # Specifying the second column only

geom_smooth()然后,您可以通过将其添加到绘图中来指定特定的斜率和截距,而不是调用:

geom_abline(slope=slopes, intercept=intercepts)

这样做的好处是它使用了模型隐含的斜率和截距。缺点是它将推断超出每个集群的值的线(在本例中为“国家”)。

然后我会添加另一个geom_abline是平均斜率和截距,您可以从中获得:

summary(mod1)$coef

另一种方法(不使用模型隐含的斜率和截距)是指定group=cluster. 使用它,它为每个集群拟合不同的 OLS 线(显然,这不是多级模型所适合的lmer())。

我以前做过这个,它适应你的变量看起来像:

ggplot(datalong, aes(x=CO2.Emissions, y=GDP, group=Country))+
  stat_smooth(method="lm", se=FALSE, size=.5, color="springgreen") + # slopes for different countries
  stat_smooth(aes(group=1), method="lm", color="blue", size=1.5) + # average slope with SE

这可能会稍微容易一些,但它与您从该coef(lmer(...))$cluster方法中获得的模型隐含的斜率和截距不匹配。

当您想绘制lmer()对象时,我发现它最容易使用predict(). 首先你适合你的模型:

random.coef.model <- lmer(GDP ~ 1 + CO2.Emissions + (1 + CO2.Emissions | Country), 
                          data=dat)

然后您预测GDP与您的预测变量 ( CO2.Emissions) 相对应的值:

dat$random.coefficients.predictions <- predict(random.coef.model)

然后您可以使用geom_smooth(se=FALSE)或随意绘制它们geom_line()如果你想同时有一个散点图,你需要提供geom_point()new aes(),因为现有的 y 值将是预测值。所以:

random.coef.graph <- ggplot(aes(x = CO2.Emissions, y = random.coefficients.predictions, 
                                color = as.factor(Country)), data = dat) +
geom_line(size=.3) +
geom_point(aes(y = GDP)) +
ggthemes::theme_tufte() #just to make it nice!