如何在Python中计算相关比或Eta?

时间:2018-08-29 17:52:19

标签: python-3.x pandas statistics correlation categorical-data

根据对此post的回答,

  

名义变量和区间变量(“数值”)之间最经典的“相关”度量是Eta,也称为相关比,等于单向方差分析的根R平方(其中p值= ANOVA)。 Eta可以看作是一种对称关联度量,就像相关性一样,因为ANOVA的Eta(标称值是独立的,数值是相关的)等于Pillai的多元回归轨迹(数值是独立的,对应于Pillai的一组虚拟变量)。名义上有依赖性)。

如果您能让我知道如何在python中计算Eta,我将不胜感激。

事实上,我有一个带有一些数字变量和一些名义变量的数据框。

此外,如何像绘制图一样绘制热图?

2 个答案:

答案 0 :(得分:1)

提供了答案here

def correlation_ratio(categories, measurements):
        fcat, _ = pd.factorize(categories)
        cat_num = np.max(fcat)+1
        y_avg_array = np.zeros(cat_num)
        n_array = np.zeros(cat_num)
        for i in range(0,cat_num):
            cat_measures = measurements[np.argwhere(fcat == i).flatten()]
            n_array[i] = len(cat_measures)
            y_avg_array[i] = np.average(cat_measures)
        y_total_avg = np.sum(np.multiply(y_avg_array,n_array))/np.sum(n_array)
        numerator = np.sum(np.multiply(n_array,np.power(np.subtract(y_avg_array,y_total_avg),2)))
        denominator = np.sum(np.power(np.subtract(measurements,y_total_avg),2))
        if numerator == 0:
            eta = 0.0
        else:
            eta = numerator/denominator
        return eta

答案 1 :(得分:0)

上面的答案是缺少根提取,因此,您将收到一个 eta 平方。但是,在主 article(由 User777 使用)中,该问题已修复。
所以,维基百科上有一篇关于 correlation ratio is 以及如何计算它的文章。我创建了一个更简单的计算版本,并将使用来自 wiki 的 example

import pandas as pd
import numpy as np

data = {'subjects': ['algebra'] * 5 + ['geometry'] * 4 + ['statistics'] * 6,
        'scores': [45, 70, 29, 15, 21, 40, 20, 30, 42, 65, 95, 80, 70, 85, 73]}
df = pd.DataFrame(data=data)

print(df.head(10))

>>> subjects    scores
  0 algebra     45
  1 algebra     70
  2 algebra     29
  3 algebra     15
  4 algebra     21
  5 geometry    40
  6 geometry    20
  7 geometry    30
  8 geometry    42
  9 statistics  65

def corr_ratio(categories, values):
    cat = pd.factorize(categories)[0]
    values = np.array(values)
    
    ssw = 0
    ssb = 0
    for i in np.unique(cat):
        subgroup = values[np.argwhere(cat == i).flatten()]
        ssw += np.sum((subgroup-np.mean(subgroup))**2)
        ssb += len(subgroup)*(np.mean(subgroup)-np.mean(values))**2

    return (ssb / (ssb + ssw))**.5

coef = corr_ratio(df['subjects'], df['scores'])

print('Eta_squared: {:.4f}\nEta: {:.4f}'.format(coef**2, coef)))

>>> Eta_squared: 0.7033
    Eta: 0.8386