You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何R语言中mad()函数与基础代码计算平均绝对偏差结果不一致?

问题原因分析

核心差异在于:R语言的mad()函数计算的是中位数绝对偏差(Median Absolute Deviation),而你手写代码实现的是均值绝对偏差(Mean Absolute Deviation),二者是完全不同的统计量,仅名称相似。

1. mad()函数的计算逻辑

当设置constant=1时,mad(x, center=median(x), constant=1)的计算步骤为:

  • 计算每个数据点与中位数的绝对偏差:abs(x - median(x))
  • 取这些绝对偏差的中位数作为最终结果

用第一个示例验证:

x <- c(2, 3, 6, 8, 11)
median_x <- median(x) # 结果为6
abs_deviations <- abs(x - median_x) # 得到向量 c(4, 3, 0, 2, 5)
median(abs_deviations) # 取中位数,结果为3,与mad()输出一致

2. 手写代码的计算逻辑

你的代码sum(abs(x - mean(x)))/length(x)的计算步骤为:

  • 计算每个数据点与均值的绝对偏差:abs(x - mean(x))
  • 取这些绝对偏差的均值作为最终结果

同样用第一个示例验证:

x <- c(2, 3, 6, 8, 11)
mean_x <- mean(x) # 结果为6
abs_deviations <- abs(x - mean_x) # 得到向量 c(4, 3, 0, 2, 5)
mean(abs_deviations) # 取均值,(4+3+0+2+5)/5 = 2.8,与手写代码输出一致

3. 第二个示例结果一致的原因

第二个示例x=1:10是特殊情况:

  • 该序列的均值和中位数均为5.5
  • 其绝对偏差的中位数与均值恰好相等:
x <- 1:10
abs_deviations <- abs(x - 5.5) # 得到向量 c(4.5,3.5,2.5,1.5,0.5,0.5,1.5,2.5,3.5,4.5)
median(abs_deviations) # 中间两个数的平均:(2.5+1.5)/2 = 2.5
mean(abs_deviations) # 总和25除以10,结果为2.5

这只是巧合,并非两种统计量的逻辑一致。


内容的提问来源于stack exchange,提问作者Rodolfo Leon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 16:47:18