线性回归和混合模型有什么区别?

机器算法验证 r 回归 混合模式 随机效应模型 固定效应模型
2022-03-12 15:29:21

以下两种模型之间的主要区别是什么?

lmefit = lmer(MathAch ~ SES + (1 |School) , MathScores) 

lmfit = lm(MathAch ~ SES + factor(School) -1 , MathScores) 

对我来说,它们似乎是相同的,除了 lmefit 需要更少的参数(因为它使用正态分布来对组级别的级别进行建模......)

我对吗?


这两种模型有什么区别?

M0 <- lmer (y ~ 1 + (1 | county))
M1 <- lmer (y ~ -1 + (1 | county))
3个回答

主要区别在于您试图通过分析回答哪些类型的问题以及您如何考虑因素学校。

在 lmfit 中,您将学校视为固定效应,这意味着您只对数据集中的学校感兴趣,但您(可能)对学校之间的特定差异感兴趣。使用此模型,您无法对不在样本中的学校的学生发表任何评论(因为您没有关于其固定效应的信息)。

在 lmefit 中,您将学校视为随机效应,或者本质上,您的数据集中的学校是来自较大规模学校的较大群体的随机样本。在这里,您通常对学校之间的具体比较不感兴趣,但可能对原始样本中学校的预测和原始样本中未包含的学校的预测感兴趣。

如果我有来自我所在地区所有学校的数据,并且有兴趣查看我正在考虑将我的孩子送到的两所学校之间是否存在差异(如果有,那么哪个更好),那么我将使用固定效应模型。

如果我有兴趣进行预测并且可能对不在我的数据集中的学校进行预测(因为我只有一部分学校),那么我会使用混合效应模型。

如果我认为学校可能会产生影响,但我并不特别关心学校之间的比较,只是想让模型针对聚类进行调整,但会对 SES 变量进行所有推断,那么我会使用混合效果模型(虽然在这种情况下固定效果会起作用,但作为调整使用随机效果会更自然一些)。

第二个模型实际上是固定效应回归,而第一个模型是随机效应模型当然,这是两个非常不同的模型。

在固定效应模型中,您假设每所学校都有自己的截距,捕捉关于这所学校的某些东西,或以某种方式表征它。这就是为什么这个截距可以与回归设计矩阵相关联,即与其他预测变量相关联。

在随机效应模型中,每所学校的截距也会不同,但它只是随机发生的,几乎就像是从公共分布中随机挑选出来的一样。在这种情况下,截距不能与其他预测变量、设计矩阵相关联。

我提供了一个来自大气科学的 R 小演示。考虑因季节(冬季、夏季……)和地轴倾斜等原因而变化的臭氧层。您可以在下面看到一些每月的变化

在此处输入图像描述 (图片来源在这里。)

在这里可以看到图层中有一些月度函数。如果您询问总趋势(而不是月度数据),您最好使用标准线性回归,而分层/混合模型可以帮助您回答特定于月份的问题,例如

> coef(fitML_)
(Intercept)       Month 
  15.656673    3.677636 
> coef(fitML_hierarchial)
$Month
  (Intercept)
5    25.52226
6    32.48859
7    57.14909
8    57.90293
9    32.40247

attr(,"class")
[1] "coef.mer"

唉 R 的臭氧数据只有半年之久。

小工作示例

library(ggplot2)
library(lme4)
library(forecast)
library(lmerTest)
library(gridExtra)

data(airquality)
ggplot(data=airquality) + aes(y=Ozone, x=as.Date(as.character(paste("20180", airquality$Month, airquality$Day, sep="")), format="%Y%m%d") ) + geom_smooth() 

fitML_ <- lm(data=airquality, Ozone ~ Month)
fitML_hierarchial <- lmerTest::lmer(data=airquality, Ozone ~ 1 + (1|Month))

predLM_            <- predict(fitML_)
predLM_hierarchial <- predict(fitML_hierarchial)
predDates_<-seq.Date(as.Date(as.character("20181001"), format="%Y%m%d"), by = 1, length.out = 116)

#LM
g1<-ggplot(data=airquality) + aes(y=Ozone, x=as.Date(as.character(paste("20180", airquality$Month, airquality$Day, sep="")), format="%Y%m%d") ) + geom_smooth() + geom_smooth(data=data.frame(predDates=predDates_, predML=predLM_), aes(x=predDates_, y=predLM_))
#LM hierarchial
g2<-ggplot(data=airquality) + aes(y=Ozone, x=as.Date(as.character(paste("20180", airquality$Month, airquality$Day, sep="")), format="%Y%m%d") ) + geom_smooth() + geom_smooth(data=data.frame(predDates=predDates_, predML=predLM_), aes(x=predDates_, y=predLM_hierarchial))

grid.arrange(g1, g2)

#ggplot(data=airquality) + aes(y=Ozone, x=as.Date(as.character(paste("20180", airquality$Month, airquality$Day, sep="")), format="%Y%m%d") ) + geom_smooth() + geom_point(aes(x=as.Date("20180701", format="%Y%m%d"), y=25), colour="red")

在此处输入图像描述

在这里你可以看到层次模型试图预测每月的波动,而线性回归只是最小化整个数据的 R2。

唉,如果数据更长,你应该得到更好的预测,这里我们每个月只有一个数据点,因此预测质量很差。