跳至主要内容

异方差性:不等方差的完整指南

探索异方差性的概念及其在统计建模中的影响。学习如何检测与处理它,并掌握改进回归模型的技术。
· 9分钟 阅读

使用 AI 探索

如果要我推荐一件事深入学习,从而成为更优秀的数据分析师或数据科学家,那就是回归。而学习回归的关键部分之一,就是准确理解什么是“异方差性”。

在本文中,我们将探讨异方差性的现象,了解其重要性、如何识别以及如何处理。我会尽量全面但节奏较快。无论您是资深分析师还是初学者,都希望您能从中获得有趣且有用的内容。想了解更多并踏上专家之路,您可以学习我们的R 回归入门课程,或Python 回归入门课程。如果您需要快速回顾,我还有一篇关于简单线性回归的教程。

什么是异方差性?

那么,异方差性到底是什么?在看示例前,先把技术性定义讲清楚。如果这个词拗口,您也可以说“不等方差”,意思相同。

异方差性指的是,因变量的变异性在自变量取值范围内不相等。或者,从模型构建的角度,更贴近的定义是:当模型(如回归模型或时间序列模型)中的残差的离散程度并非常数时,就发生了异方差性。

某种程度上,我更喜欢第二个定义,因为它提醒我们:异方差性实际上是统计建模中常见(但也是常见问题)的一个方面。不过需要明确的是,虽然异方差性最常被放在回归等模型语境中讨论,它既可能源于模型设定,也可能是数据本身的性质。

异方差性示例

我们用 R 看一些例子,并选择一个领域——比如家庭财务。F首先,我会展示经典的漏斗形或扇形图案,这是我一想到不等方差就会联想到的形状。

这种异方差性可能出现在收入与支出数据中:低收入家庭每月支出更稳定,主要集中在房租和食物等必需品上,因此变异性较低;而高收入家庭的支出变异性更大,因为只有部分高收入家庭会选择昂贵的可自由支配消费,如度假或奢侈品,另一些则选择储蓄。因此,在这个例子中,随着收入增加,每月支出的变异性也增加,于是形成扇形。

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"  )

funnel shape heteroscedasticity

残差中的漏斗形。图片作者自制

再看一个例子,仍在家庭财务领域。假设我们要建立一个回归模型,展示储蓄的变异性与家庭成员年龄之间的关系。

我们怀疑这个数据会表现出异方差性,因为较年轻的家庭可能由于收入不稳定(如零工、实习)或计划外支出(如助学贷款或组建家庭)而具有较高的储蓄变异性。但随着家庭年龄增长、财务更稳定,储蓄行为会更一致,形成一个反漏斗形,即变异性随年龄降低。

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"  )

inverse funnel shape heteroscedasticity

残差中的反漏斗形。图片作者自制

最后我们再看一个关于家庭收入的例子。这里我们关注的是周期性方差,具体来说是跨季节的支出方差。如果您上过我们的某门预测课程,比如非常受欢迎的R 语言预测,您可能对这种模式很熟悉。

我们知道,家庭支出在一年中常常呈周期性波动。例如,节假日期间,由于买礼物或探亲旅行,方差可能增加;而在节日较少的月份(比如三月或九月)则会降低。下面的图展示了异方差性,但形式更复杂,会在不同阶段增加或减少。

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"  )

cyclical heteroscedasticity

残差中的周期性模式。图片作者自制

如您所见,异方差性可以有多种形态。现在我们来看看为什么这很重要。

在统计建模中的重要性

我斗胆说一句,一般而言,如果不了解一些关于异方差性的知识,您就无法正确地做回归,因为异方差性非常常见,并且会对结果造成很大的扭曲。

也许正因为如此,同方差性——也就是异方差性的反面——实际上是回归模型的主要假设之一,和线性、误差的 独立性、残差的正态性,以及不存在 多重共线性一道被讨论。

这些回归假设之所以重要,是因为它们帮助确保模型的预测与推断是有意义的。当这些假设被违反时,我们的估计(包括标准误和置信区间)的可靠性会下降,我们的假设检验也会不那么有效。

异方差性的成因

异方差性并非无缘无故出现。它的根源往往在于数据的采集或变换方式。我们分别看看数据变换问题与数据采集问题。

数据变换问题

有时,数据准备过程中采取的步骤反而会引入异方差性。我想到的是,不当的缩放或非线性变换可能会带来意料之外的变异性。

设想我们研究公寓面积与月租金的关系。通常我们可能预期面积与租金呈线性关系,因为更大的公寓更贵;而租金的方差不一定随面积增加(关系可能是成比例的)。可能是这样的:

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")

scatterplot with no heteroscedasticity

无异方差性。图片作者自制

当我们按面积缩放会发生什么?

如果我们按面积缩放租金,计算“每平方英尺租金”,就得到一个新指标。若再尝试用租金去预测每平方英尺租金,可能会发现这种变换会产生或夸大异方差性。需要明确的是,一般来说,我也承认这样做并不好——即用自变量去除以因变量——因为这会让 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")

inverse fan heteroscedasticity

由函数依赖引入的异方差性。图片作者自制


我们看到该图呈漏斗形,即每平方英尺租金的变异性随面积增大而减小。于是,我们凭空制造了异方差性。
再看另一个例子,我们把两个变量都平方:

unequal_variance_df$size_squared <- unequal_variance_df$size^2ggplot(unequal_variance_df, aes(x = size ^ 2, y = rent ^ 2)) +	geom_point(color = '#203147', alpha = 0.7) +	geom_smooth(method = "lm", color = '#01ef63', se = FALSE) +	labs(title = "Size Squared vs. Rent Squared",	     x = "Size Squared",	     y = "Rent Squared")

heteroscedasticity as a result of squaring and amplifying differences

平方操作引入的异方差性。图片作者自制

我们再次在本不存在异方差的情况下,通过坚持把 x 与 y 同时平方而制造了异方差。在某些情境下这没问题,但在这里我预料到平方会引入异方差,因为我认为这种变换会在变量取值增大时放大方差差异。

第二个例子也稍显刻意,因为我们本不应做这样的模型——难以解释且没有必要。不过在真实的建模流程中,无意间造成异方差性的变换可能更隐蔽,尤其当流程包含多步时,您很容易忽略它。

更准确地说,这里的异方差性源于使用比率的特征工程。“每平方英尺租金”这类比率在特征工程中确实常见。然而,如果分母在观测之间变化很大,就可能引入异方差性。对数或指数变换也常被用于稳定方差或线性化关系,但不一致地应用会适得其反。比如,您在模型中对收入取对数,却没有相应调整相关特征(如支出)。这种不匹配是异方差性的常见来源,因此请确保各部分一致,避免引入虚假动态。

数据采集的差异

异方差性也可能源于不一致的数据采集实践。例如,在研究中途更换测量工具可能引入异方差。研究中分组规模不同、从而样本量不同,也可能造成异方差性。保持一致的方法很重要。

检测异方差性

检测异方差性是解决问题的第一步,所幸我们既有可视化手段,也有统计工具可以帮助完成这一步。

可视化检查技术

散点图可以揭示数据中的模式,帮助发现异方差性。我喜欢用拟合值与残差图。需要说明的是,残差直方图或残差Q-Q 图并不足以检测异方差性,因为这两种图主要用于检验正态性。

y_funnel <- x + rnorm(length(x), mean = 0, sd = x * 0.5)heteroscedasticity_data <- data.frame(x, y_funnel)unequal_variance_model <- lm(y_funnel ~ x, heteroscedasticity_data)fitted_values_vs_residuals <- ggplot(data = unequal_variance_model, aes(x = .fitted, y = .resid)) +    geom_point(color = '#203147') +    geom_hline(yintercept = 0, linetype = "dashed", color = '#01ef63', size = 1) +    xlab("fitted values") +    ylab("residuals") +    labs(title = "Heteroscedasticity Data") +    labs(subtitle = "Fitted Values vs Residuals")

fitted values vs residuals plot to detect heteroscedasticity拟合值 vs. 残差的诊断图。图片作者自制

统计检验

诸如Breusch–Pagan 检验等统计检验提供了更量化的途径。Breusch–Pagan通过考察模型的残差平方是否与自变量相关来工作。要实施该检验,我们先拟合模型,再使用bptest()函数(来自lmtest库)。需要知道的是,该检验假设残差正态。

library(lmtest)model <- lm(rent ~ size, data = unequal_variance_df)bp_test <- bptest(model)print(bp_test)

处理异方差性

一旦识别了异方差性,下一步就是用行之有效的方法来应对它。

数据变换方法

简单的变换(如取对数)常常可以减弱或消除异方差性。前面我们从一个没有不等方差的模型出发,通过变换制造了问题,但在实践中更常见的流程是反过来:我们用对数、平方根或倒数等变换来压缩较大值、展开较小值。例如,若租金随面积呈指数增长,对租金取对数会压平指数增长,使关系线性化,并(或许)具有相等方差。

另外想强调的是,在数据预处理时,我们常考虑修正偏度。例如,对右偏数据,我们可能用平方根变换使数据更接近高斯分布。但我们可能没有充分意识到,在偏斜的数据中,较大取值往往也伴随更大的变异性,这同样违背了同方差性的假设。

稳健回归技术

当变换不够时,像加权最小二乘(WLS)这样的稳健回归方法可以发挥作用。WLS 在这里尤为有趣,因为它专为处理异方差性和离群值等数据问题而设计。具体而言,WLS 根据观测的方差分配权重,从而降低高变异性数据点的影响,获得更稳定的估计。需要注意的是,使用 WLS 时,我们假定权重已被良好地知晓或估计。

忽视异方差性的影响

忽视异方差性看似无伤大雅,但可能导致问题。

对模型准确度的影响

异方差性会扭曲模型对特征重要性的解读。例如,在支出模型中,如果某些特征(如收入)与高变异性群体相关(如高收入家庭的可自由支配消费),它们可能显得更重要。这种错配会让我们高估不太可靠的预测因子、低估更稳定的因子,影响模型的实用性。

对假设检验的后果

如果您假定方差相等而该假设不成立,异方差性会使常见统计检验(如 t 检验或 F 检验)失效。不等方差在时间序列数据中也很麻烦,因为变异模式随时间演变,在分析季节性趋势时会造成混淆。可以使用异方差稳健标准误(HCSE)来帮助实现更可靠的统计推断。

相关概念

本文讨论的是模型中残差方差在自变量不同水平上不恒定的情况。这里我想简要谈一个相关概念,即组层面的方差异质性,它指的是预定义组之间的变异差异,更像是对数据的描述性观察,而非与模型假设紧密相关的统计问题。

我用最后一个例子来说明。这里使用的是模拟的调查数据。设想收入数据采用两种不同的方法采集:问卷与行政记录。这两种方法的精度可能不同(问卷是否“声名在外”?)。我们可以看到,各组内的变异程度并不一致,这在使用ANOVA时可能会产生问题。

set.seed(1024)income_admin <- rnorm(500, mean = 50000, sd = 2000) spending_admin <- income_admin * 0.3 + rnorm(500, mean = 0, sd = 1000)income_survey <- rnorm(500, mean = 50000, sd = 8000) # Same mean, higher SDspending_survey <- income_survey * 0.3 + rnorm(500, mean = 0, sd = 5000)income <- c(income_admin, income_survey)spending <- c(spending_admin, spending_survey)method <- rep(c("Administrative Records", "Survey"), each = 500)survey_and_admin_data <- data.frame(income = income, spending = spending, method = method) # Plot the datacustom_colors <- c("Administrative Records" ='#01ef63', "Survey" = '#203147')ggplot(survey_and_admin_data, aes(x = income, y = spending, color = method)) +  geom_point(alpha = 0.7) +  labs( title = "Variability in Data Collection", x = "Income", y = "Spending")+  scale_color_manual(values = custom_colors)

group-level variance heterogeneity

组层面的方差异质性。图片作者自制

结语

处理异方差性不仅仅是为了改进回归模型,更是为了确保您的工作经得起检验。要继续学习并成为专家,请学习我们的R 语言统计推断学习路径和R 语言推断基础课程。我也认为我们的R 语言统计学家学习路径是兼顾学习与职业发展的另一优秀选择。 

Josef Waples

作者

Josef Waples

我是数据科学编辑,曾为科学期刊发表的研究论文撰稿。我的兴趣领域包括线性代数、统计学、R 等相关主题。

关于异方差性的常见问题

什么是异方差性?

异方差性指的是:在自变量的取值范围内,因变量的变异(或离散程度)不是常数。在回归模型中,这意味着模型的残差(误差)具有不等的离散程度,会扭曲统计推断和预测。

异方差性与同方差性有何区别?

异方差性指残差的方差在自变量各水平上不恒定。同方差性则相反,假定残差方差为常数,这是许多回归模型的关键假设。

也就是说: 

  • 异方差性 = 不等方差
  • 同方差性 = 等方差
在进行回归建模时,为什么理解异方差性很重要?

异方差性会导致回归系数估计效率低下,使假设检验不可靠。当残差存在不等方差时,会影响标准误、置信区间以及预测因子的显著性检验,从而导致错误结论。

如何检测异方差性?

一些方法:

  • 可视化检查:绘制残差与拟合值的散点图可以揭示非常数方差。常见的视觉信号是残差呈“扇形”分布。
  • Breusch–Pagan 检验:检验残差平方是否与模型自变量相关的统计方法。
  • White 检验:更通用的检验方法,不依赖正态性假设。
像 WLS 这样的稳健回归方法能解决异方差性问题吗?

当然可以:加权最小二乘(WLS)对处理异方差性非常有效。WLS 根据方差调整观测值的权重,降低高方差数据点的影响,提高回归估计的稳定性。

 

如果我在线性回归模型中直接忽略异方差性,会怎样?

如果在回归模型中忽视异方差性,可能导致低效估计和有偏推断。话虽如此,如果您的模型不用于假设检验或精确预测,其影响可能没那么显著。

主题