R语言入门之切尾均值(trimmed mean)与绝对中位差(median absolute deviation,mad)

2020-08-06 09:46:35 浏览数 (1)

切尾均值

尾均值(trimmed mean)又称“截尾均值”,是指在一个数列中,去掉两端的极端值后所计算的算术平均数,其计算和下式中的a(切尾比例)有关,从它的定义可以看出,切尾均值能够有效避免极端值对整体数据的影响,能够使数据的描述结果更加合理与稳定,在生活中最常见的是选秀比赛或者扣篮比赛中除掉最高分和最低分来计算选手的最终得分。psych包默认切尾比例是0.1,也就是将数据排序后分别去掉两端10%的数据。当然,切尾均值的计算会比这种直接去掉最大值和最小值的计算方法要稍微复杂一点,但仔细看也并不难理解。如下是具体的计算公式:

上式中n表示样本量,a(假定为10%)就是切尾比例,第一个数是从去掉前10%的数开始算起,最后一个数是到90%终止。

具体的R代码实现如下:

代码语言:javascript复制
#创建数据,设定切尾比例
library(psych)
d <- c(1,2,3,5)  #将上一期内容里的变量a去除NA值
d <- sort(d) #排序
r <- 0.1 #设置切尾比例是0.1,与psych包的缺省值一致
count <- length(d) #计算初始数据个数
lower <- round(count*r 1) #切尾后的第一个数的位置
upper <- round(count-count*r) #切尾后最后一个数的位置
mean(d[lower:upper]) #切尾均值,和psych包计算结果一致
# [1] 2.75
describe.by(d)

可以看出最终的计算结果和我们上一期psych包的计算一致。

接下来我们换一组较大的数据试试:

代码语言:javascript复制
e <- rnorm(100) #使用rnorm(100)生成100个服从标准正态分布的随机数
e <- sort(e) #将随机数排好序
r <- 0.1 #设置切尾比例是0.1,与psych包的缺省值一致
count <- length(e) #计算初始数据个数
lower <- round(count*r 1) #切尾后的第一个数的位置
upper <- round(count-count*r) #切尾后最后一个数的位置
mean(e[lower:upper]) #切尾均值,和psych包计算结果一致
# [1] -0.02388169
describe.by(e)

这里可以看出,换了数据的计算结果四舍五入后也一致,当然这里由于使用的是随机数,所以你做出来的值可能和我的不一样,这个没有关系,只要你用基本函数计算出的切尾均值和psych包计算的一致即可。

接下来更换切尾比例试试:

代码语言:javascript复制
r <- 0.15 #设置切尾比例是0.15
count <- length(e) #计算初始数据个数
lower <- round(count*r 1) #切尾后的第一个数的位置
upper <- round(count-count*r) #切尾后最后一个数的位置
mean(e[lower:upper]) #切尾均值,和psych包计算结果一致
# [1] -0.02015876
describe.by(e)

计算结果依然一致!而且我们可以发现切尾比例为0.1和0.15时的计算结果几乎一致,这是因为数据e本身是一组来自正态分布的数据,其数据间的偏差非常小,所以统计结果稳定。

今天我用R语言和大家详细介绍了切尾均值的含义以及它的意义,希望大家能够完全理解切尾均值的计算和意义,并能用R语言熟练计算。

绝对中位差

绝对中位差(median absolute deviation)是指数据点到中位数的绝对偏差的中位数,实际上就是偏差的中位数。从它的定义中我们不难发现,这是一个用于描述数据变异程度的一个量,它的估计和标准差具有一致性。

具体的R代码实现如下:

代码语言:javascript复制
d <- c(1,2,3,5)  #将a去除NA值
d <- sort(d)
median(abs(d-median(d))) # 计算绝对中位数
# [1] 1

上述结果和psych的计算结果不一致,这是因为R语言里mad的计算在上述结果的计算上乘了一个比例因子1.4826,为了达到渐进正态一致性。

代码语言:javascript复制
median(abs(d-median(d)))*1.4826 # 计算绝对中位数(乘上比例因子)
# [1] 1.4826

当然我们同样可以使用之前的变量e来计算一下:

代码语言:javascript复制
median(abs(e-median(e)))*1.4826
# [1] 1.081142

这个和上面psych包的结果一致。

在这一期中我们详细了解了切尾均值和绝对中位差的含义和计算,并用R语言的基本函数和psych包里的函数分别实现了一遍,相信大家应该对此有了更深刻的认识了,在下一期中我们将详细介绍偏度和峰度,敬请期待!

0 人点赞