2024-09-30 08:16:29 发布
网友
有没有办法计算熊猫的加权相关系数?我看到R有这样的方法。 另外,我想得到相关性的p值。我在R也没找到这个。 链接到维基百科以解释加权相关:https://en.wikipedia.org/wiki/Pearson_product-moment_correlation_coefficient#Weighted_correlation_coefficient
我不知道有什么Python包实现了这一点,但是滚动自己的实现应该相当简单。使用维基百科文章的命名约定:
def m(x, w): """Weighted Mean""" return np.sum(x * w) / np.sum(w) def cov(x, y, w): """Weighted Covariance""" return np.sum(w * (x - m(x, w)) * (y - m(y, w))) / np.sum(w) def corr(x, y, w): """Weighted Correlation""" return cov(x, y, w) / np.sqrt(cov(x, x, w) * cov(y, y, w))
我试图使上面的函数尽可能与wikipedia中的公式匹配,但是有一些潜在的简化和性能改进。例如,正如@Alberto Garcia Raboso所指出的,m(x, w)实际上只是np.average(x, weights=w),因此不需要实际为它编写函数。
m(x, w)
np.average(x, weights=w)
函数很简单,只是做计算。您可能需要考虑在执行计算之前强制输入为数组,即x = np.asarray(x),因为如果传递列表,这些函数将不起作用。还可以执行其他检查,以验证所有输入具有相等的长度、非空值等。
x = np.asarray(x)
示例用法:
# Initialize a DataFrame. np.random.seed([3,1415]) n = 10**6 df = pd.DataFrame({ 'x': np.random.choice(3, size=n), 'y': np.random.choice(4, size=n), 'w': np.random.random(size=n) }) # Compute the correlation. r = corr(df['x'], df['y'], df['w'])
有一个关于p值的讨论here。它看起来不像是一个通用的计算,它取决于你如何得到权重。
statsmodels包有一个implementation of weighted correlation。
我不知道有什么Python包实现了这一点,但是滚动自己的实现应该相当简单。使用维基百科文章的命名约定:
我试图使上面的函数尽可能与wikipedia中的公式匹配,但是有一些潜在的简化和性能改进。例如,正如@Alberto Garcia Raboso所指出的,
m(x, w)
实际上只是np.average(x, weights=w)
,因此不需要实际为它编写函数。函数很简单,只是做计算。您可能需要考虑在执行计算之前强制输入为数组,即
x = np.asarray(x)
,因为如果传递列表,这些函数将不起作用。还可以执行其他检查,以验证所有输入具有相等的长度、非空值等。示例用法:
有一个关于p值的讨论here。它看起来不像是一个通用的计算,它取决于你如何得到权重。
statsmodels包有一个implementation of weighted correlation。
相关问题 更多 >
编程相关推荐