Answers:
当两个模型针对相同的假设进行检验并使用相同的编码时,ANOVA和线性回归是等效的。这些模型的基本目的有所不同:方差分析主要用于表示数据中类别均值之间的差异,而线性回归主要用于估计样本均值响应和相关的。
从某种程度上说,可以将ANOVA描述为具有虚拟变量的回归。我们可以很容易地看到,在使用分类变量的简单回归中就是这种情况。分类变量将被编码为指标矩阵(0/1
取决于对象是否属于给定组的矩阵),然后直接用于线性回归描述的线性系统的解。让我们看一个5组的例子。为了论证,我将假定均值group1
等于1,均值group2
等于2,...和均值group5
等于5。(我使用MATLAB,但在R中完全相同)。
rng(123); % Fix the seed
X = randi(5,100,1); % Generate 100 random integer U[1,5]
Y = X + randn(100,1); % Generate my response sample
Xcat = categorical(X); % Treat the integers are categories
% One-way ANOVA
[anovaPval,anovatab,stats] = anova1(Y,Xcat);
% Linear regression
fitObj = fitlm(Xcat,Y);
% Get the group means from the ANOVA
ANOVAgroupMeans = stats.means
% ANOVAgroupMeans =
% 1.0953 1.8421 2.7350 4.2321 5.0517
% Get the beta coefficients from the linear regression
LRbetas = [fitObj.Coefficients.Estimate']
% LRbetas =
% 1.0953 0.7468 1.6398 3.1368 3.9565
% Rescale the betas according the intercept
scaledLRbetas = [LRbetas(1) LRbetas(1)+LRbetas(2:5)]
% scaledLRbetas =
% 1.0953 1.8421 2.7350 4.2321 5.0517
% Check if the two results are numerically equivalent
abs(max( scaledLRbetas - ANOVAgroupMeans))
% ans =
% 2.6645e-15
在这种情况下可以看到结果完全相同。微小的数值差异是由于设计未达到完美平衡以及底层估算程序所致;方差分析会更积极地累积数值误差。为此,我们安装了拦截器LRbetas(1)
;我们可以拟合无截距模型,但这不是“标准”线性回归。(在那种情况下,结果甚至更接近方差分析。)
对于上述示例,在方差分析和线性回归的情况下,统计量(均值的比率)也将相同:
abs( fitObj.anova.F(1) - anovatab{2,5} )
% ans =
% 2.9132e-13
这是因为程序检验了相同的假设,但使用了不同的措辞:ANOVA将定性检查“ 比率是否足够高,表明没有分组是不可信的 ”,而线性回归将定性检查“ 比率是否足够高,以表明仅拦截”模型可能不足 ”。
(这是对“ 看到等于或大于在原假设下观察到的值的可能性的可能性 ”的某种自由解释,并不意味着是教科书的定义。)
回到关于“ 方差分析 ”的问题的最后部分,即线性设计的系数(假设均值不相等 ”,您什么都不知道),希望您现在可以在设计的情况下看到方差分析非常简单/ 平衡,可以告诉您线性模型可以做到的所有事情。组均值的置信区间将与等等。显然,当人们开始在他的回归模型中添加多个协变量时,简单的单向方差分析就没有直接等价性。在那种情况下,使用一种方法不能直接获得的信息来扩充用于计算线性回归平均响应的信息。我相信人们可以再次以方差分析的方式表达事物,但这主要是一项学术活动。
关于此事的一篇有趣的论文是盖尔曼(Gelman)在2005年发表的一篇论文:《方差分析-为什么它比以往任何时候都更重要》。提出了一些要点;我不完全支持该论文(我个人更赞同麦卡拉赫的观点),但可以作为有益的阅读。
最后一点:当您有混合效果模型时,图会变厚。在那里,您对数据的分组有什么误解或实际信息有不同的概念。这些问题不在本问题的讨论范围之内,但我认为它们值得我们点头。
让我对带有分类(伪编码)回归的OLS 等同于ANOVA中的因子的想法进行一些说明。在这两种情况下,有水平(或团体在方差分析的情况下)。
在OLS回归中,最通常的是在回归器中也包含连续变量。它们在逻辑上修改了拟合模型中分类变量和因变量(DC)之间的关系。但这并非使平行无法识别的地步。
根据mtcars
数据集,我们可以首先将模型可视lm(mpg ~ wt + as.factor(cyl), data = mtcars)
化为由连续变量wt
(权重)确定的斜率,然后通过不同的截距投影出分类变量cylinder
(四个,六个或八个圆柱体)的效果。这是与单向方差分析平行的最后一部分。
让我们在右侧的子图中以图形方式查看它(包括左侧的三个子图,以便与随后讨论的ANOVA模型进行左右比较):
每个汽缸发动机都用颜色编码,具有不同截距的拟合线与数据云之间的距离等于ANOVA中组内变化的等效值。请注意,在与连续的变量(OLS模型截距weight
)不是数学上相同的不同组内是指在ANOVA的值,由于效果weight
与不同的模型矩阵(见下文):均值mpg
为以4缸汽车为例,mean(mtcars$mpg[mtcars$cyl==4]) #[1] 26.66364
而OLS的“基线”截距(按惯例反映cyl==4
(R中从低到高的数字顺序))截然不同:summary(fit)$coef[1] #[1] 33.99079
。线的斜率是连续变量的系数weight
。
如果您试图weight
通过在脑海上拉直这些线并将它们返回到水平线来抑制的影响,那么最终aov(mtcars$mpg ~ as.factor(mtcars$cyl))
将在左侧的三个子图中获得模型的ANOVA图。该weight
回归是现在,但是从点到不同的截距的关系大致保持-我们简单地旋转逆时针和铺开之前重叠绘制每个不同级别(再次,只能作为一种视觉设备“看到”连接;不是数学上的等式,因为我们正在比较两个不同的模型!)。
cylinder
通过这些垂直部分的总和,我们可以手动计算残差:
mu_mpg <- mean(mtcars$mpg) # Mean mpg in dataset
TSS <- sum((mtcars$mpg - mu_mpg)^2) # Total sum of squares
SumSq=sum((mtcars[mtcars$cyl==4,"mpg"]-mean(mtcars[mtcars$cyl=="4","mpg"]))^2)+
sum((mtcars[mtcars$cyl==6,"mpg"] - mean(mtcars[mtcars$cyl=="6","mpg"]))^2)+
sum((mtcars[mtcars$cyl==8,"mpg"] - mean(mtcars[mtcars$cyl=="8","mpg"]))^2)
结果:SumSq = 301.2626
和TSS - SumSq = 824.7846
。相比于:
Call:
aov(formula = mtcars$mpg ~ as.factor(mtcars$cyl))
Terms:
as.factor(mtcars$cyl) Residuals
Sum of Squares 824.7846 301.2626
Deg. of Freedom 2 29
与仅使用分类cylinder
作为回归变量的线性模型进行方差分析进行测试的结果完全相同:
fit <- lm(mpg ~ as.factor(cyl), data = mtcars)
summary(fit)
anova(fit)
Analysis of Variance Table
Response: mpg
Df Sum Sq Mean Sq F value Pr(>F)
as.factor(cyl) 2 824.78 412.39 39.697 4.979e-09 ***
Residuals 29 301.26 10.39
那么,我们看到的是,无论您调用类型为OLS lm(DV ~ factors)
还是ANOVA(aov(DV ~ factors)
)的残差(模型未解释的总方差的一部分)以及方差都是相同的:连续变量模型最终得到一个相同的系统。同样,当我们全局评估模型或作为综合ANOVA(而不是逐级评估)时,我们自然会得到相同的p值F-statistic: 39.7 on 2 and 29 DF, p-value: 4.979e-09
。
这并不意味着测试各个级别将产生相同的p值。对于OLS,我们可以调用summary(fit)
并获取:
lm(formula = mpg ~ as.factor(cyl), data = mtcars)
Estimate Std. Error t value Pr(>|t|)
(Intercept) 26.6636 0.9718 27.437 < 2e-16 ***
as.factor(cyl)6 -6.9208 1.5583 -4.441 0.000119 ***
as.factor(cyl)8 -11.5636 1.2986 -8.905 8.57e-10 ***
p adjusted
Tukey multiple comparisons of means
95% family-wise confidence level
Fit: aov(formula = mtcars$mpg ~ as.factor(mtcars$cyl))
$`as.factor(mtcars$cyl)`
diff lwr upr p adj
6-4 -6.920779 -10.769350 -3.0722086 0.0003424
8-4 -11.563636 -14.770779 -8.3564942 0.0000000
8-6 -4.642857 -8.327583 -0.9581313 0.0112287
最终,没有什么比放开引擎盖下的引擎更放心的了,除了模型矩阵和列空间中的投影之外,这无非是。对于方差分析,这些实际上非常简单:
cyl 4
cyl 6
cyl 8
另一方面,OLS回归的模型矩阵为:
weight
displacement
lm(mpg ~ wt + as.factor(cyl), data = mtcars)
weight
weight
cyl 4
cyl 4
cyl 6
cyl 8
fit <- lm(mpg ~ wt + as.factor(cyl), data = mtcars)
summary(fit)$coef[3] #[1] -4.255582 (difference between intercepts cyl==4 and cyl==6 in OLS)
fit <- lm(mpg ~ as.factor(cyl), data = mtcars)
summary(fit)$coef[2] #[1] -6.920779 (difference between group mean cyl==4 and cyl==6)
Antoni Parellada和usεr11852的回答很好。我将使用来解决您的编码角度问题R
。
方差分析不会告诉您有关线性模型系数的任何信息。那么线性回归与ANOVA有何相同?
实际上,我们可以使用的aov
功能R
可以与相同lm
。这里有些例子。
> lm_fit=lm(mpg~as.factor(cyl),mtcars)
> aov_fit=aov(mpg~as.factor(cyl),mtcars)
> coef(lm_fit)
(Intercept) as.factor(cyl)6 as.factor(cyl)8
26.663636 -6.920779 -11.563636
> coef(aov_fit)
(Intercept) as.factor(cyl)6 as.factor(cyl)8
26.663636 -6.920779 -11.563636
> all(predict(lm_fit,mtcars)==predict(aov_fit,mtcars))
[1] TRUE
如您所见,就像线性模型一样,我们不仅可以从ANOVA模型获得系数,而且可以将其用于预测。
如果我们检查帮助文件的aov
功能,它会说
这为lm提供了一个包装,用于将线性模型拟合到平衡或不平衡的实验设计中。与lm的主要区别在于打印,摘要等处理拟合的方式:这是用传统的方差分析语言而不是线性模型来表达的。