python计算非线性相关的一些笔记
在Scipy中,相关系数的范围是介于-1到1之间。其中,1表示完全正相关,-1表示完全负相关,0表示无相关关系。因此,相关性最高是1,最低是-1。
在计算非线性相关时,样本量的大小对于结果的准确性有重要影响。根据搜索结果,虽然没有一个固定的“最佳”样本量,但是有一些指导性的建议:
-
样本量与p值的准确性:对于斯皮尔曼相关系数,p值的计算并未对样本背后的分布做出强有力的假设,但它仅对于非常大的样本(> 500个观测值)才准确。
-
样本量估计:在进行相关分析时,样本量是在“经验参数”的基础上估计的,这些参数可能是预试验得到的,可能是文献资料,也可能是根据经验猜测的。实际工作中,样本量估计是较为复杂的,许多参数并不是想获得就能获得的,因此,如果“经验参数”估计不准,根据统计学公式计算的样本量也就不准了。
-
样本量的增加:在估计样本量时,如果没有考虑研究中可能的失访或脱落,则应在原估计值的基础上增加一定的比例,如10%、20%。
-
样本量与相关系数的关系:相关系数的绝对值越小,要达到相关确实存在的统计学意义所要求的样本含量就越多。
综上所述,虽然没有一个具体的数字可以作为所有情况下的最佳样本量,但是一般来说,样本量越大,结果越准确,特别是当样本量超过500时,p值的估计结果基本还是合理的。同时,考虑到可能的数据丢失或脱落,实际需要的样本量可能需要比理论上计算的样本量更大。因此,在实际操作中,应该根据具体情况和可用资源来确定样本量,并尽可能地增加样本量以提高分析结果的准确性。
报错: An input array is constant; the correlation coefficent is not defined.
warnings.warn(SpearmanRConstantInputWarning())
遇到“An input array is constant; the correlation coefficient is not defined.”这个警告时,意味着您尝试计算相关性的数据中有一个或多个输入数组是常数数组,即数组中的所有值都是相同的。在斯皮尔曼等级相关系数的计算中,如果输入数据没有变异性(即所有值都相同),那么相关系数是未定义的,因此会返回NaN作为结果。
要解决这个问题,您可以采取以下几种方法:
-
检查数据:请确保输入的数据是正确的,并且您想要分析的变量确实具有变异性。如果数据集中的变量都是常数,那么您可能需要重新审视数据收集或处理的过程。
-
移除常数变量:如果确实存在常数输入变量,您可以选择将其从计算中排除掉。在计算前检查变量是否是常数,并进行相应的处理,例如删除该变量或选择其他适当的方法分析变量间的关系。
-
使用其他相关性测量方法:如果您遇到了常数输入变量问题,还可以尝试使用其他相关性测量方法来分析变量之间的关系,如皮尔逊相关系数(Pearson's correlation coefficient)或肯德尔等级相关系数(Kendall's tau)等。这些方法对于处理常数输入变量的情况可能更具鲁棒性。
-
更新Scipy库:如果您的Scipy版本是1.3.X或更高版本,那么
spearmanr()
函数会抛出一个警告,告诉您这个问题。如果您的Scipy版本较低,考虑更新到最新版本,以便获得更好的警告信息和错误处理。 -
使用
nan_policy
参数:在scipy.stats.spearmanr()
函数中,您可以使用nan_policy
参数来定义如何处理NaN值。选项包括'propagate'
(默认,返回NaN)、'raise'
(抛出错误)和'omit'
(忽略NaN值进行计算)。
请根据您的具体情况选择合适的解决方案。