我继承了一些旧的Stata代码(Stata11),它使用xtile
函数按照分位数对矢量中的观测值进行分类(在这种情况下,只有标准的5个五分位数,20%,40%,60 %,80%,100%)。
我正在尝试在Python中复制一段代码,我正在使用SciPy.stats.mstats函数mquantiles()
进行计算。
尽管我从Stata文档和在线搜索中可以看出,Stata xtile
方法试图反转数据的经验CDF,并使用CDF平坦的所有观测值的等加权平均值制作切点。这似乎是对分位数进行分类的一种非常差的方法,但它就是这样,我确信有些情况下这是正确的事情。
我的问题是如何让mquantiles()
产生同样的破坏惯例。我注意到这个函数有两个参数,alphap
和betap
(文档称它们为alpha
和beta
,但你需要额外的'p'来使它工作,至少我这样做...如果我只使用Python 2.7.1和SciPy 0.10.0的'alpha'和'beta',我会收到错误。但即使在SciPy文档中,我也看不出是否存在这些参数的组合产生平均CDF范围的平均值。
我看到看起来像计算选项作为此范围的中位数或模式,但不是平均值(也不清楚这些具有alpha和beta的SciPy中位数/模式选项是否计算为<的中位数/模式em>观察或产生平坦CDF值的范围。)
任何帮助消除这些不同选项的歧义并找到一些文档可以帮助我在Python中重新创建Stata约定会很棒。请不要只说“编写自己的分位数函数”的答案。首先,这并不能帮助我理解Stata或SciPy的惯例,其次,给定这些数值库,编写我自己的分位数函数应该是最后的手段。我当然可以这样做,但如果我需要的话,它会很糟糕。
答案 0 :(得分:7)
scipy.stats.mquantiles文档很差,并且错误在某些地方,现在已修复,因此可能会有帮助... http://docs.scipy.org/scipy/docs/scipy.stats.mstats_basic.mquantiles/。当您指出alpha / beta,alphap / betap差异时,该过程就开始了。谢谢。
mquantiles的实现遵循R。
最大的区别在于R有9个离散类型,因为scipy.stats.mquantiles从'alphap'和'betap'计算'm',scipy有一系列连续的“类型”(因为缺乏更好的字)。
我承认我不了解所涉统计数据的所有细节,所以我决定进行暴力评估。我在http://www.biostat.sdu.dk/~biostat/StataReferenceManual/StataRef.pdf找到了一个xtile示例,并且能够将结果与alphap = 0.5和betap = 0.5(分段线性)匹配。不是确定的,也不是详尽无遗的,但我现在所拥有的只是。
In [1]: import scipy.stats as st
In [9]: st.mstats.mquantiles([23,56,67,123,99,17],prob=[0.5],alphap=0.5,betap=.5)
Out[9]: array([ 61.5])
In [10]: st.mstats.mquantiles([23,56,67,123,99,17],prob=[0.33,0.66],alphap=0.5,betap=.5)
Out[10]: array([ 38.84, 81.72])
In [11]: st.mstats.mquantiles([23,56,67,123,99,17],prob=[0.25,0.5,0.75],alphap=0.5,betap=.5)
Out[11]: array([ 23. , 61.5, 99. ])
最后一个有点问题,因为两个分割点正好在数据集中的值上。 Stata / xtile(至少在我发现的例子中)不给出分位数的分裂点,而是给出分位数本身。给定排序数据集[17,23,56,67,99,123],Stata / xtile给出的分类为[1,1,2,3,3,4],这意味着scipy.stat.mquantiles匹配上层分位数的界限大于或等于该分位数中的所有值。