我正在使用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)
的等效值是什么?很高兴在需要时提供更多详细信息。
答案 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线程进行了交互。还要在此处放置指向该问题的交叉链接,
答案 2 :(得分:0)
使用更高级的 Scipy 函数进行 spearman 测试可以轻松解决这个问题。
只需执行以下操作:
from scipy.stats.mstats import spearmanr
spearmanr(sequence_1,sequence_2)
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)