我不确定什么是最好的/最具统计性的完成我想要的东西的方法,但我基本上试图采用p值的分布并将其与通过排列我的原始数据而创建的更大的p值分布。我正在处理小的p值,所以我实际上比较了p值的log10。Python不同长度的两个分布的QQ和PP图
我一直在试图找出一个很好的通用方法来比较两个数组具有相似值但长度不相等的方法。我真正想要的是类似于scipy.qqplot(dataset1, dataset2)
的东西,但不存在,Q-Q图只会将您的分布与已建立的分布进行比较(此问题已被要求为R:https://stats.stackexchange.com/questions/12392/how-to-compare-two-datasets-with-q-q-plot-using-ggplot2)。
本质上这等于比较两个直方图。我可以使用np.linspace强制完全相同的仓每个分发:
bins = 100
mx = max(np.max(vector1), np.max(vector2))
mn = min(np.min(vector2), np.max(vector2))
boundaries = np.linspace(mn, mx, bins, endpoint=True)
labels = [(boundaries[i]+boundaries[i+1])/2 for i in range(len(boundaries)-1)]
我然后可以很容易地使用这些边界和标签,让两个直方图,由原始向量的长度加权。最简单的方法就是使用几个bin并将它们绘制在同一轴上的直方图上,就像这个问题一样:
但是,我真的想要更像是一个QQ图的东西,我想用很多的箱子,所以我可以看到即使是1对1线的小偏差。只绘制两个柱状图的问题是,他们是这样的:
两个地块都恰到好处彼此的顶部,我什么都看不到。
所以我想弄清楚的是如何比较这两个直方图同时保持bin标签。我可以很容易地画出两个对彼此的分布图,但最终由盒频率被索引:
我真正想要的是什么,是只比较两个直方图,或使这是一个有关差异的QQ图,但我无法想出一个很好的统计方法。我找不到能让我用两个数据集而不是一个数据集和一个内置分布生成Q-Q图的方法,而且我找不到任何绘制两个不相等长度的分布的方法。
仅供参考,这里有两个柱状图是走进创建的情节,你可以看到,他们都非常相似:
我知道一定有这样做的一个很好的方式,因为看起来如此明显,但我对这种事情很陌生,而且对于scipy,pandas和statsmodels也是比较新的。
我故意没有在这里提供一个示例发布,因为我不确定如何创建一个非正态分布的最小集合并捕获我正在尝试执行的操作;加上要点是能够为任何两个重叠的不等长数组执行此操作。
我想知道的是什么是以统计学方式在python中处理这个问题的正确/最好的方法?是否有某种方法可以从排列后的数据中创建一个可用于statsmodels或scipy Q-Q图的分布?有没有办法像这样直观地比较两个直方图?有没有制作我不知道的概率图的方法?
编辑:尝试的累积和手动QQ图
感谢@ user333700的答案,我想通了,如何创建一个用于数据的手动QQ情节,也是一个累积概率曲线。我创建使用的数据有重叠的最小值/最大值以下发行的情节,但:
QQ情节:
q = np.linspace(0, 100, 101)
fig, ax = plt.subplots()
ax.scatter(np.percentile(ytest, q), np.percentile(xtest, q))
因此,与简单的数据确实很好,累计情节是相似的:
# Pick bins
x = ytest
y = xtest
boundaries = sorted(x)[::round(len(x)/bins)+1]
labels = [(boundaries[i]+boundaries[i+1])/2 for i in range(len(boundaries)-1)]
# Bin two series into equal bins
xb = pd.cut(x, bins=boundaries, labels=labels)
yb = pd.cut(y, bins=boundaries, labels=labels)
# Get value counts for each bin and sort by bin
xhist = xb.value_counts().sort_index(ascending=True)/len(xb)
yhist = yb.value_counts().sort_index(ascending=True)/len(yb)
# Make cumulative
for ser in [xhist, yhist]:
ttl = 0
for idx, val in ser.iteritems():
ttl += val
ser.loc[idx] = ttl
# Plot it
fig, ax = plt.subplots(figsize=(6,6))
ax.scatter(xhist, yhist)
plt.show()
要回到我的实际偏斜数据(其中两个分布在不同的长度各方面极其相似),并加入1对1线,我得到这个对于那些二:
所以这两个工作很好,累积概率图很清楚地表明数据没有很大的差异,但QQ图表显示尾部有小的差异。
为PP-积小的变化:直方图具有相等的长度箱(长度在原始值而言),所以PP-情节仍然不等间距。我们用于pp图的是等重量箱。例如,使用由每个第k个观测值x,bin都定义的箱边界与这些箱相连,然后绘图。在这种情况下,x累积直方图频率将在[0,1]中等间隔。 – user333700
@ user333700:请你澄清一下吗?恐怕在这种情况下,我不会按照同等重量的垃圾箱来追踪你的意思。你能否提供一个伪代码来说明我将如何做到这一点? –
在您的概率图你点的x坐标对应的累积概率每个箱。由于仓具有不同的频率或数量,x坐标的点被朝着端部,其中大部分的概率是,例如移动你只有中位数以下的两个垃圾箱。相反,如果你选择箱边界,这样的垃圾箱对x变量频率相等,则积点会是在x轴上等间隔。类似于'边界=排序(x)[:: k]'和调整端点。对于“相等的权重”,我的意思是在每个bin中x的频率相等。 – user333700