为什么我在python的Spearman相关中得到Nan

时间:2019-11-22 22:33:26

标签: python scipy

我正在使用Sub DownloadFile() Dim WinHttpReq As Object Dim oStream As Object Dim myURL As String Dim LocalFilePath As String LocalFilePath = "C:\Temp\test.xlsx" Set WinHttpReq = CreateObject("Microsoft.XMLHTTP") WinHttpReq.Open "GET", gsADDRESS, False, "", "" '("username", "password") WinHttpReq.send If WinHttpReq.Status = 200 Then Set oStream = CreateObject("ADODB.Stream") oStream.Open oStream.Type = 1 oStream.Write WinHttpReq.responseBody oStream.SaveToFile LocalFilePath, 2 oStream.Close End If End Sub 来计算相关性。我的计算Spearman相关性的代码如下。

scipy

我从代码中得到以下结果。

from scipy import stats
sequence_1 = [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]
sequence_2 = [0, 0.009783728115345005, 0, 0, 0.0019759230121848587, 0.0007535430349118562, 0.0002661781514710257, 0, 0, 0.0007835762419683435]
myspearman = stats.spearmanr(sequence_1,sequence_2)
print(myspearman)

尽管在此主题中有一些SO问题,但它们明确地没有回答我的问题。

我的问题如下。

  • 我想以某种方式获得与我的相关性的价值。从这个意义上说 SpearmanrResult(correlation=nan, pvalue=nan) 的等效值是什么?
  • 我的另一个问题是;有没有办法避免这种情况并获得实际 python中的值?

很高兴在需要时提供更多详细信息。

4 个答案:

答案 0 :(得分:2)

  

为什么spearmanr输出NaN

sequence_1中没有没有变化,因此其标准偏差等于0,这将导致spearmanr()函数的除法为零,从而返回{{1} }。

  

在这种情况下,NaN的等效值是多少?

从数学上讲,当两个列表之一中的标准偏差等于零(其中随机变量的所有实例均具有完全相同的值)时,Spearman相关系数未定义。建议您研究公式here  更好地了解为什么这不是那么简单!

  

有没有办法避免这种情况并在Python中获取实际值?

由于未定义实际值,因此您确实会获得带有NaN right 值。但是,您可能需要依靠其他公式来解决此问题,例如两个变量之间的协方差-在这种情况下,该变量等于零。

答案 1 :(得分:1)

这里有2个问题,第一个已经在《混血王子》的答案中进行了评论。

对于该问题,在scipy.stats中选择哪种类型无关紧要,因为要关联的2个序列之一的变异性为0。

我在对帖子的评论中指出,通常将spearmanr()用于排名,并且似乎没有在关联排名数据。我正在基于2个序列的非整数值进行评估-通常,等级是非负整数值。

鉴于第二个问题(看来),我建议使用pearsonr()。如果您的scipy版本为1.3.X或更高版本,则错误消息将为您提供信息,并准确告诉您此问题:

>>> myspearman = stats.pearsonr(sequence_1,sequence_2)
/Users/rlucas/scipy-dev/scipy/scipy/stats/stats.py:3508: PearsonRConstantInputWarning: An input array is constant; the correlation coefficent is not defined.
  warnings.warn(PearsonRConstantInputWarning())

此外,为了保持一致性,scipy.stats.spearmanr()应该向spearmanr()发出类似的警告。我在github仓库中打开了一个问题,提到了这个问题并与此SO线程进行了交互。还要在此处放置指向该问题的交叉链接,

https://github.com/scipy/scipy/issues/11111

答案 2 :(得分:0)

使用更高级的 Scipy 函数进行 spearman 测试可以轻松解决这个问题。

只需执行以下操作:

  1. 导入Scipy的高级功能进行spearman测试:
  • from scipy.stats.mstats import spearmanr
  1. 使用此功能进行 spearman 测试:
  • spearmanr(sequence_1,sequence_2)
  1. 因此你得到:SpearmanrResult(correlation=0.0, pvalue=1.0)

就是这样,我希望它有帮助:)

答案 3 :(得分:-1)

该错误主要是由于第一个序列的标准偏差为零。

只需按如下所示更改第一个序列中的一个值,就可以得到结果,因为现在标准偏差为非零。

NaN

输出

from scipy import stats
sequence_1 = [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 2.0]
sequence_2 = [0, 0.009783728115345005, 0, 0, 0.0019759230121848587, 0.0007535430349118562, 0.0002661781514710257, 0, 0, 0.0007835762419683435]
myspearman = stats.spearmanr(sequence_1,sequence_2)
print(myspearman)