Python 获取SciPy分位数以匹配Stata xtile函数

Python 获取SciPy分位数以匹配Stata xtile函数,python,scipy,stata,quantile,Python,Scipy,Stata,Quantile,我继承了一些旧的Stata代码(Stata11),它使用xtile函数按分位数对向量中的观察值进行分类(在本例中,仅为标准的5个五分位数,20%,40%,60%,80%,100%) 我试图用Python复制一段代码,并使用SciPy.stats.mstats函数mquantiles()进行计算 据我从Stata文档和在线搜索中所知,Stataxtile方法试图反转数据的经验CDF,并使用CDF平坦的所有观测值的相等加权平均值来确定切点。这似乎是一种非常糟糕的分位数分类方法,但事实就是如此,我相信

我继承了一些旧的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中位数/模式选项是否计算为观测值的中位数/模式,或者计算为产生平坦CDF值的范围的中位数/模式。)


任何有助于消除这些不同选项的歧义并找到一些帮助我在Python中重新创建Stata约定的文档都将是非常棒的。请不要只回答“编写自己的分位数函数”。首先,这无助于我理解Stata或SciPy的约定,其次,考虑到这些数字库,编写自己的分位数函数应该是最后的选择。我当然可以这样做,但如果我需要的话,这一切都会很糟糕。

scipy.stats.mquantiles文档在某些地方很糟糕,也有错误,现在已经修复,因此可能会有所帮助。。。 . 当你指出alpha/beta,alphap/betap差异时,这个过程就开始了。多谢各位

mquantiles的实现遵循R

最大的区别在于R有9个离散类型,因为scipy.stats.mquantiles根据“alphap”和“betap”计算“m”,所以scipy有一个连续的“类型”范围(因为没有更好的词)

我承认我不了解所有涉及的统计数据的来龙去脉,所以我决定进行暴力评估。我在上找到了一个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,99123],Stata/xtile将分类为[1,1,2,3,3,4],这意味着scipy.stat.mquantiles匹配分位数上限的值大于或等于该分位数中的所有值。

感谢您深思熟虑的回答和对scipy函数的更新。我将修改您的示例以处理我的特定数据。至少通过这种方式,我可以准确地量化Stata的输出将在哪些方面有所不同,这样,当使用我正在开发的代码的人与Stata的旧结果进行比较时,我可以给他们一些警告。嘿,F先生,那么你能匹配Stata的函数吗?;-)好吧,至少我能重现斯塔塔舞步。如果你现在说R文档很棒,我会绝望地举手;)EMS,我不明白您所指的“糟糕的文档”是什么:不仅是
xtile
开源(它是在ado文件中实现的),而且它在帮助中有大量的文档记录,在“方法和公式”部分有大量的示例、技术说明和一整页的数学解释。从Stata 13开始(2013年6月)Stata的所有文档都可以通过相关的手动输入公开访问。我记录了@EMS对Stata中
xtile
函数的持续和不正确引用的异议。命令和函数都是在Stata中定义的,但非常不相交。Stata中没有
xtile
函数。Stata的术语是肯定的与Stata问题密切相关。出于个人偏好或对其他软件更熟悉而使用一些术语是不合适的。你可以保留你的原始措辞,作为对你的礼貌,作为原始海报,但似乎你没有说服任何人。关于此处相关内容的断言似乎主要是个人观点。Cross com使用不正确的术语无法帮助使用不同语言的人之间的交流;编程就是要准确地获取细节。Stata中可能有
xtile
函数,但没有;这是事实。