y_funnel <- x + rnorm(length(x), mean =0, sd = x *0.5)y_inverse_funnel <- x + rnorm(length(x), mean =0, sd =(1/ x)*20)y_cyclical <- x + rnorm(length(x), mean =0, sd =10* abs(sin(x /5)))heteroscedasticity_data <- data.frame(x, y_funnel, y_inverse_funnel, y_cyclical)library(ggplot2)ggplot(heteroscedasticity_data, aes(x = x, y = y_funnel))+ geom_point(color ='#203147', alpha =0.7)+ geom_smooth(method ="lm", color ='#01ef63', se =FALSE)+ labs( title ="Funnel Shape", x ="X Values", y ="Y Values")技术支持
ggplot(heteroscedasticity_data, aes(x = x, y = y_inverse_funnel))+ geom_point(color ='#203147', alpha =0.7)+ geom_smooth(method ="lm", color ='#01ef63', se =FALSE)+ labs( title ="Inverse Funnel Shape", x ="X Values", y ="Y Values")技术支持
ggplot(heteroscedasticity_data, aes(x = x, y = y_cyclical))+ geom_point(color ='#203147', alpha =0.7)+ geom_smooth(method ="lm", color ='#01ef63', se =FALSE)+ labs( title ="Cyclical Pattern", x ="X Values", y ="Y Values")技术支持
set.seed(1024)size <- runif(1000,500,2000)# Random sizes between 500 and 2000 sq ftrent <- 20 * size + rnorm(100, mean = 0, sd = 5000) # Linear relation with added noiseunequal_variance_df <- data.frame(size = size, rent = rent)ggplot(unequal_variance_df, aes(x = size, y = rent)) + geom_point(color = '#203147', alpha = 0.7) + geom_smooth(method = "lm", color = '#01ef63', se = FALSE) + labs(title = "Size vs. Rent", x = "Size (sq ft)", y = "Rent")技术支持
无异方差性。图片作者自制
当我们按面积缩放会发生什么?
如果我们按面积缩放租金,计算“每平方英尺租金”,就得到一个新指标。若再尝试用租金去预测每平方英尺租金,可能会发现这种变换会产生或夸大异方差性。需要明确的是,一般来说,我也承认这样做并不好——即用自变量去除以因变量——因为这会让 y 已经受 x 影响,从而造成伪相关。我知道这会带来概念与统计上的挑战。但(请耐心看完)我用它只是为了说明问题:
unequal_variance_df$rent_per_sqft <- unequal_variance_df$rent / unequal_variance_df$sizeggplot(unequal_variance_df, aes(x = size, y = rent_per_sqft))+ geom_point(color ='#203147', alpha =0.7)+ geom_smooth(method ="lm", color ='#01ef63', se =FALSE)+ labs(title ="Size vs. Rent per Square Foot", x ="Size (sq ft)", y ="Rent per Sq Ft")技术支持
如果要我推荐一件事深入学习,从而成为更优秀的数据分析师或数据科学家,那就是回归。而学习回归的关键部分之一,就是准确理解什么是“异方差性”。
在本文中,我们将探讨异方差性的现象,了解其重要性、如何识别以及如何处理。我会尽量全面但节奏较快。无论您是资深分析师还是初学者,都希望您能从中获得有趣且有用的内容。想了解更多并踏上专家之路,您可以学习我们的R 回归入门课程,或Python 回归入门课程。如果您需要快速回顾,我还有一篇关于简单线性回归的教程。
什么是异方差性?
那么,异方差性到底是什么?在看示例前,先把技术性定义讲清楚。如果这个词拗口,您也可以说“不等方差”,意思相同。
异方差性指的是,因变量的变异性在自变量取值范围内不相等。或者,从模型构建的角度,更贴近的定义是:当模型(如回归模型或时间序列模型)中的残差的离散程度并非常数时,就发生了异方差性。
某种程度上,我更喜欢第二个定义,因为它提醒我们:异方差性实际上是统计建模中常见(但也是常见问题)的一个方面。不过需要明确的是,虽然异方差性最常被放在回归等模型语境中讨论,它既可能源于模型设定,也可能是数据本身的性质。
异方差性示例
我们用 R 看一些例子,并选择一个领域——比如家庭财务。F首先,我会展示经典的漏斗形或扇形图案,这是我一想到不等方差就会联想到的形状。
这种异方差性可能出现在收入与支出数据中:低收入家庭每月支出更稳定,主要集中在房租和食物等必需品上,因此变异性较低;而高收入家庭的支出变异性更大,因为只有部分高收入家庭会选择昂贵的可自由支配消费,如度假或奢侈品,另一些则选择储蓄。因此,在这个例子中,随着收入增加,每月支出的变异性也增加,于是形成扇形。
残差中的漏斗形。图片作者自制
再看一个例子,仍在家庭财务领域。假设我们要建立一个回归模型,展示储蓄的变异性与家庭成员年龄之间的关系。
我们怀疑这个数据会表现出异方差性,因为较年轻的家庭可能由于收入不稳定(如零工、实习)或计划外支出(如助学贷款或组建家庭)而具有较高的储蓄变异性。但随着家庭年龄增长、财务更稳定,储蓄行为会更一致,形成一个反漏斗形,即变异性随年龄降低。
残差中的反漏斗形。图片作者自制
最后我们再看一个关于家庭收入的例子。这里我们关注的是周期性方差,具体来说是跨季节的支出方差。如果您上过我们的某门预测课程,比如非常受欢迎的R 语言预测,您可能对这种模式很熟悉。
我们知道,家庭支出在一年中常常呈周期性波动。例如,节假日期间,由于买礼物或探亲旅行,方差可能增加;而在节日较少的月份(比如三月或九月)则会降低。下面的图展示了异方差性,但形式更复杂,会在不同阶段增加或减少。
残差中的周期性模式。图片作者自制
如您所见,异方差性可以有多种形态。现在我们来看看为什么这很重要。
在统计建模中的重要性
我斗胆说一句,一般而言,如果不了解一些关于异方差性的知识,您就无法正确地做回归,因为异方差性非常常见,并且会对结果造成很大的扭曲。
也许正因为如此,同方差性——也就是异方差性的反面——实际上是回归模型的主要假设之一,和线性、误差的 独立性、残差的正态性,以及不存在 多重共线性一道被讨论。
这些回归假设之所以重要,是因为它们帮助确保模型的预测与推断是有意义的。当这些假设被违反时,我们的估计(包括标准误和置信区间)的可靠性会下降,我们的假设检验也会不那么有效。
异方差性的成因
异方差性并非无缘无故出现。它的根源往往在于数据的采集或变换方式。我们分别看看数据变换问题与数据采集问题。
数据变换问题
有时,数据准备过程中采取的步骤反而会引入异方差性。我想到的是,不当的缩放或非线性变换可能会带来意料之外的变异性。
设想我们研究公寓面积与月租金的关系。通常我们可能预期面积与租金呈线性关系,因为更大的公寓更贵;而租金的方差不一定随面积增加(关系可能是成比例的)。可能是这样的:
无异方差性。图片作者自制
当我们按面积缩放会发生什么?
如果我们按面积缩放租金,计算“每平方英尺租金”,就得到一个新指标。若再尝试用租金去预测每平方英尺租金,可能会发现这种变换会产生或夸大异方差性。需要明确的是,一般来说,我也承认这样做并不好——即用自变量去除以因变量——因为这会让 y 已经受 x 影响,从而造成伪相关。我知道这会带来概念与统计上的挑战。但(请耐心看完)我用它只是为了说明问题:
由函数依赖引入的异方差性。图片作者自制
我们看到该图呈漏斗形,即每平方英尺租金的变异性随面积增大而减小。于是,我们凭空制造了异方差性。再看另一个例子,我们把两个变量都平方:
平方操作引入的异方差性。图片作者自制
我们再次在本不存在异方差的情况下,通过坚持把 x 与 y 同时平方而制造了异方差。在某些情境下这没问题,但在这里我预料到平方会引入异方差,因为我认为这种变换会在变量取值增大时放大方差差异。
第二个例子也稍显刻意,因为我们本不应做这样的模型——难以解释且没有必要。不过在真实的建模流程中,无意间造成异方差性的变换可能更隐蔽,尤其当流程包含多步时,您很容易忽略它。
更准确地说,这里的异方差性源于使用比率的特征工程。“每平方英尺租金”这类比率在特征工程中确实常见。然而,如果分母在观测之间变化很大,就可能引入异方差性。对数或指数变换也常被用于稳定方差或线性化关系,但不一致地应用会适得其反。比如,您在模型中对收入取对数,却没有相应调整相关特征(如支出)。这种不匹配是异方差性的常见来源,因此请确保各部分一致,避免引入虚假动态。
数据采集的差异
异方差性也可能源于不一致的数据采集实践。例如,在研究中途更换测量工具可能引入异方差。研究中分组规模不同、从而样本量不同,也可能造成异方差性。保持一致的方法很重要。
检测异方差性
检测异方差性是解决问题的第一步,所幸我们既有可视化手段,也有统计工具可以帮助完成这一步。
可视化检查技术
散点图可以揭示数据中的模式,帮助发现异方差性。我喜欢用拟合值与残差图。需要说明的是,残差直方图或残差Q-Q 图并不足以检测异方差性,因为这两种图主要用于检验正态性。
统计检验
诸如Breusch–Pagan 检验等统计检验提供了更量化的途径。Breusch–Pagan通过考察模型的残差平方是否与自变量相关来工作。要实施该检验,我们先拟合模型,再使用
bptest()函数(来自lmtest库)。需要知道的是,该检验假设残差正态。处理异方差性
一旦识别了异方差性,下一步就是用行之有效的方法来应对它。
数据变换方法
简单的变换(如取对数)常常可以减弱或消除异方差性。前面我们从一个没有不等方差的模型出发,通过变换制造了问题,但在实践中更常见的流程是反过来:我们用对数、平方根或倒数等变换来压缩较大值、展开较小值。例如,若租金随面积呈指数增长,对租金取对数会压平指数增长,使关系线性化,并(或许)具有相等方差。
另外想强调的是,在数据预处理时,我们常考虑修正偏度。例如,对右偏数据,我们可能用平方根变换使数据更接近高斯分布。但我们可能没有充分意识到,在偏斜的数据中,较大取值往往也伴随更大的变异性,这同样违背了同方差性的假设。
稳健回归技术
当变换不够时,像加权最小二乘(WLS)这样的稳健回归方法可以发挥作用。WLS 在这里尤为有趣,因为它专为处理异方差性和离群值等数据问题而设计。具体而言,WLS 根据观测的方差分配权重,从而降低高变异性数据点的影响,获得更稳定的估计。需要注意的是,使用 WLS 时,我们假定权重已被良好地知晓或估计。
忽视异方差性的影响
忽视异方差性看似无伤大雅,但可能导致问题。
对模型准确度的影响
异方差性会扭曲模型对特征重要性的解读。例如,在支出模型中,如果某些特征(如收入)与高变异性群体相关(如高收入家庭的可自由支配消费),它们可能显得更重要。这种错配会让我们高估不太可靠的预测因子、低估更稳定的因子,影响模型的实用性。
对假设检验的后果
如果您假定方差相等而该假设不成立,异方差性会使常见统计检验(如 t 检验或 F 检验)失效。不等方差在时间序列数据中也很麻烦,因为变异模式随时间演变,在分析季节性趋势时会造成混淆。可以使用异方差稳健标准误(HCSE)来帮助实现更可靠的统计推断。
相关概念
本文讨论的是模型中残差方差在自变量不同水平上不恒定的情况。这里我想简要谈一个相关概念,即组层面的方差异质性,它指的是预定义组之间的变异差异,更像是对数据的描述性观察,而非与模型假设紧密相关的统计问题。
我用最后一个例子来说明。这里使用的是模拟的调查数据。设想收入数据采用两种不同的方法采集:问卷与行政记录。这两种方法的精度可能不同(问卷是否“声名在外”?)。我们可以看到,各组内的变异程度并不一致,这在使用ANOVA时可能会产生问题。
组层面的方差异质性。图片作者自制
结语
处理异方差性不仅仅是为了改进回归模型,更是为了确保您的工作经得起检验。要继续学习并成为专家,请学习我们的R 语言统计推断学习路径和R 语言推断基础课程。我也认为我们的R 语言统计学家学习路径是兼顾学习与职业发展的另一优秀选择。