为何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
相关产品推荐
相关产品推荐

