如何理解Scipy中trim_mean的计算逻辑?与手动计算为何有差异?
关于scipy.stats.trim_mean()的行为解释
你对截尾均值的理解没错,但scipy.stats.trim_mean()的实现逻辑和你预期的按分布百分位剔除完全不一样——它是直接按样本数量的比例来剔除两端的观测值,而且只取整数个数,完全不考虑数据的分布特性。
用你的例子拆解:
- 数据总长度是9,
proportiontocut=0.05意味着两端各要剔除9*0.05=0.45个数据。因为没法剔除0.45个样本,所以会向下取整为0——也就是根本没剔除任何数据,直接计算原始均值:
这就是你得到的结果。(1+2+2+3+4+30+4+4+5)/9 = 55/9 ≈ 6.1111
你手动用numpy按百分位截断的逻辑是另一种截尾均值的计算方式(基于分布分位数),但trim_mean()的设计逻辑就是简单的“按样本数比例删数”,它的参数描述里的“剔除分布两端的比例”属于表述误导,实际是剔除样本两端的比例数量,和分布的分位数没有关系。
如果想要实现你预期的“按百分位截断后求均值”,可以手动实现:
import numpy as np data = np.array([1,2,2,3,4,30,4,4,5]) lower = np.percentile(data, 5) upper = np.percentile(data, 95) trimmed_data = data[(data >= lower) & (data <= upper)] mean = trimmed_data.mean() # 结果为3.4285...
内容的提问来源于stack exchange,提问作者Bing Li
相关产品推荐
相关产品推荐

