scipy 多二元变量卡方假设检验

7jmck4yq  于 2022-12-18  发布在  其他
关注(0)|答案(1)|浏览(111)

我有一个关于苗圃中生长的植物的数据。我有一个植物健康的变量和几个因素。
我想测试是否有任何因素影响植物健康,所以我认为最好的方法是使用卡方检验。
我的方法如下所示,但是在交叉选项卡之后我会卡住

# Example Data
df = pd.DataFrame({'plant_health': ['a','b','c','a','b','b'],
                   'factor_1': ['yes','no','no','no','yes','yes'],
                   'factor_2': ['yes','yes','no','no','yes','yes'],
                   'factor_3': ['yes','no','no','yes','yes','yes'],
                   'factor_4': ['yes','yes','no','no','yes','yes'],
                   'factor_5': ['yes','no','yes','no','yes','yes'],
                   'factor_6': ['yes','no','no','no','yes','yes'],
                   'factor_7': ['yes','yes','no','yes','yes','yes'],
                   'factor_8': ['yes','no','yes','no','yes','yes'],
                   'factor_9': ['yes','yes','yes','yes','yes','yes'],
                   })

# Melt dataframe
df = df.melt(id_vars='plant_health', 
         value_vars=['factor_1', 'factor_2', 'factor_3', 'factor_4', 'factor_5',
       'factor_6', 'factor_7', 'factor_8', 'factor_9'])

# Create cross tab
pd.crosstab(df.plant_health, columns=[df.variable, df.value])

我可以用一个因子做测试,但不知道如何扩展到所有因子。

from scipy.stats import chisquare
from scipy import stats
from scipy.stats import chi2_contingency

# Example with only the first factor
tab_data = [[1,1], [1,2],[1,0]]
chi2_contingency(tab_data)
vuktfyat

vuktfyat1#

请尝试这个,让我知道如果它是你所期望的:

tab = pd.crosstab(df.plant_health, columns=[df.variable, df.value])

chi2_contingency(tab)

产出

(20.666666666666668,
 0.9387023859836788,
 32,
 array([[1.        , 1.        , 0.66666667, 1.33333333, 0.66666667,
         1.33333333, 0.66666667, 1.33333333, 0.66666667, 1.33333333,
         1.        , 1.        , 0.33333333, 1.66666667, 0.66666667,
         1.33333333, 2.        ],
        [1.5       , 1.5       , 1.        , 2.        , 1.        ,
         2.        , 1.        , 2.        , 1.        , 2.        ,
         1.5       , 1.5       , 0.5       , 2.5       , 1.        ,
         2.        , 3.        ],
        [0.5       , 0.5       , 0.33333333, 0.66666667, 0.33333333,
         0.66666667, 0.33333333, 0.66666667, 0.33333333, 0.66666667,
         0.5       , 0.5       , 0.16666667, 0.83333333, 0.33333333,
         0.66666667, 1.        ]]))

编辑

您可以使用以下函数执行单个卡方检验:

# we can use this to first df (without melt)

def  chi_squared_test(plant_health, factor_n):

    tab = pd.crosstab(plant_health, factor_n)

    return chi2_contingency(tab)

chi_squared_test(df.plant_health, df.factor_9)

产出

(1.3333333333333333,
 0.5134171190325922,
 2,
 array([[1. , 1. ],
        [1.5, 1.5],
        [0.5, 0.5]]))

相关问题