在哪里可以找到scipy的疯狂(平均绝对偏差)?

Ton*_*vel 34 python scipy statsmodels

似乎scipy曾经提供了一个函数mad来计算一组数字的平均绝对偏差:

http://projects.scipy.org/scipy/browser/trunk/scipy/stats/models/utils.py?rev=3473

但是,我无法在当前版本的scipy中找到它.当然可以从存储库中复制旧代码,但我更喜欢使用scipy的版本.我在哪里可以找到它,或者它已被替换或删除?

mhs*_*ith 46

[编辑]因为这继续被投票:我知道中位数绝对偏差是一个更常用的统计数据,但提问者要求平均绝对偏差,这里是如何做到的:

from numpy import mean, absolute

def mad(data, axis=None):
    return mean(absolute(data - mean(data, axis)), axis)
Run Code Online (Sandbox Code Playgroud)


Lee*_*Lee 31

为了它的价值,我将它用于MAD:

def mad(arr):
    """ Median Absolute Deviation: a "Robust" version of standard deviation.
        Indices variabililty of the sample.
        https://en.wikipedia.org/wiki/Median_absolute_deviation 
    """
    arr = np.ma.array(arr).compressed() # should be faster to not use masked arrays.
    med = np.median(arr)
    return np.median(np.abs(arr - med))
Run Code Online (Sandbox Code Playgroud)

  • 很好的解决方案;然而,提问者询问的是**平均**绝对偏差。您提供了**中值**绝对偏差。 (3认同)

sfj*_*jac 22

当前版本的statsmodels具有madstatsmodels.robust:

>>> import numpy as np
>>> from statsmodels import robust
>>> a = np.matrix( [
...     [ 80, 76, 77, 78, 79, 81, 76, 77, 79, 84, 75, 79, 76, 78 ],
...     [ 66, 69, 76, 72, 79, 77, 74, 77, 71, 79, 74, 66, 67, 73 ]
...  ], dtype=float )
>>> robust.mad(a, axis=1)
array([ 2.22390333,  5.18910776])
Run Code Online (Sandbox Code Playgroud)

注意,默认情况下,通过将结果缩放比例因子,假设正态分布,计算标准偏差的稳健估计值; 来自help:

Signature: robust.mad(a, 
                      c=0.67448975019608171, 
                      axis=0, 
                      center=<function median at 0x10ba6e5f0>)
Run Code Online (Sandbox Code Playgroud)

版本R进行了类似的规范化.如果你不想要这个,显然只是设置c=1.

(之前的评论提到了这一点statsmodels.robust.scale.实现在statsmodels/robust/scale.py(参见github)但是robust包没有导出scale,而是scale.py明确地导出公共函数.)

  • 请注意,这是**中位数**,而不是**均值**绝对偏差(后者在问题中) (3认同)

mat*_*att 16

看起来scipy.stats.models 在2008年8月因烘焙不足而被删除.发展已迁移到statsmodels.

  • 是的,经过大量清理后,大多数旧的stats.models都是scikits.statsmodels的基础.MAD在底页http://statsmodels.sourceforge.net/rlm.html作为线性模型的稳健估计的一部分,但我从未单独使用它,因为它只是几行. (7认同)
  • 以上链接已被破坏,因此我在statsmodels文档中找到[this one](http://statsmodels.sourceforge.net/devel/generated/statsmodels.robust.scale.mad.html?highlight=median%20absolute%20deviation) . (4认同)

Sam*_*rry 9

如果你喜欢在Pandas工作(就像我一样),它对平均绝对偏差有一个很有用的功能:

import pandas as pd
df = pd.DataFrame()
df['a'] = [1, 1, 2, 2, 4, 6, 9]
df['a'].mad()
Run Code Online (Sandbox Code Playgroud)

输出:2.3673469387755106