Python 如何使scipy IQR使用阵列两半的中间点的差异?
我试图用scipy的IQR函数计算出一些数字的IQR。然而,当我自己解决这个问题时,我对IQR得到了一个不同的结果,我认为这是因为它不是基于中间值来解决的。我已经看过了,但在那里什么也看不见 例如,我有以下列表:Python 如何使scipy IQR使用阵列两半的中间点的差异?,python,numpy,scipy,Python,Numpy,Scipy,我试图用scipy的IQR函数计算出一些数字的IQR。然而,当我自己解决这个问题时,我对IQR得到了一个不同的结果,我认为这是因为它不是基于中间值来解决的。我已经看过了,但在那里什么也看不见 例如,我有以下列表: list1 = [7.4, 7.9, 4.1, 8.1, 6.2, 7.1, 7.4, 6.7] 如果我自己计算IQR,从上半部分和下半部分取中间值,我得到1.2。如果我使用iqrlist1,我得到0.95。在这个特定的例子中,我尝试了iqrlist1,插值为“中点”,这给了我正确的
list1 = [7.4, 7.9, 4.1, 8.1, 6.2, 7.1, 7.4, 6.7]
如果我自己计算IQR,从上半部分和下半部分取中间值,我得到1.2。如果我使用iqrlist1,我得到0.95。在这个特定的例子中,我尝试了iqrlist1,插值为“中点”,这给了我正确的答案
然而,我有第二份清单:
列表2=[5,7,2,1,3,4,8,8,6,6]
还有iqrlist2,插值为“中点”,但它给了我3.0作为答案,但我计算出它是4.0。这是我在做的一个在线测试中的一个选择题,我的答案是对还是错并不重要,因为3.0不是一个可用的答案
如果我计算出75%-25%的IQR,得到的结果与IQR相同,这与上中位数和下中位数不同。是否有一个参数我遗漏了,或者我可以在IQR中更改以获得一致的答案 以下返回您想要的IQR类型:
iqr(x, interpolation=('nearest' if len(x) % 4 == 2 else 'midpoint'))
使用100个不同数组大小的测试对数组进行排序,因此通过切片很容易找到中间值的差异:
for k in range(1, 100):
x = np.sqrt(np.arange(k)) # some not-too-regular, but sorted, numbers
diff_medians = np.median(x[len(x)//2:]) - np.median(x[:(len(x)+1)//2])
my_iqr = iqr(x, interpolation=('nearest' if len(x) % 4 == 2 else 'midpoint'))
assert diff_medians == my_iqr
请注意,当您的示例中没有包含数组的奇数大小时,两半都包括中间元素,例如在[1,2,3]中,两半是[1,2]和[2,3];这似乎是一个自然的选择,否则我们将完全忽略中间的一个。如果我计算出IQR为75%-25%,我会得到与IQR相同的结果,这与上中位数和下中位数不同。-四分位范围为第75百分位和第25百分位之间的差值。“我不太清楚你从上四分位和下四分位取中间值是什么意思,但无论你在计算什么,它都与IQR不一样。”ali_m写道……四分位之间的范围被定义为第75百分位和第25百分位之间的差值。。。这个定义对于连续分布来说是明确的,但是对于一组离散的值来说,确切的含义并不那么清楚。jceg316想要的是使用排序数据的后半部分和前半部分的中间值的差异作为IQR。@WarrenWeckesser是的,这是正确的,我正在寻找排序数据的前半部分和后半部分的中间值。