比较两组以上的比例和统计显着性
Compare proportions and Statistical significance between more than 2 groups
我创建了一个数据框来比较三个或更多组的比例(真实数据有超过 50,000 行)。左栏0表示存活,1表示死亡,右栏0,1,2,3表示分级。
在示例数据框中,各年级的比例似乎没有差异,但我想推导出 p 值,无论这实际上是否具有统计显着性。
从例子中得到的存活率如下。
0 级 57.14%
一年级 66.66%
二年级 50.0%
三年级 60.0%
我尝试同时使用 Kai 和 Anova 测试。但是,我不知道到底哪种方法是正确的。
ex_df = pd.DataFrame({"Survive":[0,0,0,0,0,0,0,1,1,1,0,1,1,1,0,0,0,1,1,1,0,0,0,1],
"grade":[2,1,2,3,0,0,0,3,0,2,1,1,0,0,0,1,2,3,1,2,1,3,3,2]})
我想计算 p 值
p 值:0.xxxx ....
Anova 测试要求您的数据呈正态分布,而您的数据显然不是(只有 0 和 1)。您可以通过将假设的生存概率作为数据中 1 的总数除以测量总数来尝试 binomial test,而不管等级如何。然后对每个年级做二项式检验。我将 python 函数链接到 returns p-value。
这个问题最好用逻辑回归来分析。 (建议的对整个样本使用年级组的二项式检验的方法在统计上是不正确的。)使用 R(因为我不是 pythonista)很容易证明它很容易失败,我怀疑有一个 python模拟。 R 结果可用于检查任何 Python 实现的正确性。如您所见,Pandas 中的数据帧结构是从 R 复制而来的,它的许多统计例程也是如此:
ex_df = data.frame(Survive = c(0,0,0,0,0,0,0,1,1,1,0,1,1,1,0,0,0,1,1,1,0,0,0,1),
grade=factor(c(2,1,2,3,0,0,0,3,0,2,1,1,0,0,0,1,2,3,1,2,1,3,3,2)) )
glm(Survive~grade, data=ex_df, family="binomial")
#--- output---
Call: glm(formula = Survive ~ grade, family = "binomial", data = ex_df)
Coefficients:
(Intercept) grade1 grade2 grade3
-0.2877 -0.4055 0.2877 -0.1178
Degrees of Freedom: 23 Total (i.e. Null); 20 Residual
Null Deviance: 32.6
Residual Deviance: 32.25 AIC: 40.25
#----------
summary( glm(Survive~grade, data=ex_df, family="binomial") )
#-------output------
Call:
glm(formula = Survive ~ grade, family = "binomial", data = ex_df)
Deviance Residuals:
Min 1Q Median 3Q Max
-1.1774 -1.0579 -0.9005 1.3018 1.4823
Coefficients:
Estimate Std. Error z value Pr(>|z|)
(Intercept) -0.2877 0.7638 -0.377 0.706
grade1 -0.4055 1.1547 -0.351 0.725
grade2 0.2877 1.1180 0.257 0.797
grade3 -0.1178 1.1902 -0.099 0.921
(Dispersion parameter for binomial family taken to be 1)
Null deviance: 32.601 on 23 degrees of freedom
Residual deviance: 32.247 on 20 degrees of freedom
AIC: 40.247
Number of Fisher Scoring iterations: 4
我创建了一个数据框来比较三个或更多组的比例(真实数据有超过 50,000 行)。左栏0表示存活,1表示死亡,右栏0,1,2,3表示分级。
在示例数据框中,各年级的比例似乎没有差异,但我想推导出 p 值,无论这实际上是否具有统计显着性。
从例子中得到的存活率如下。
0 级 57.14%
一年级 66.66%
二年级 50.0%
三年级 60.0%
我尝试同时使用 Kai 和 Anova 测试。但是,我不知道到底哪种方法是正确的。
ex_df = pd.DataFrame({"Survive":[0,0,0,0,0,0,0,1,1,1,0,1,1,1,0,0,0,1,1,1,0,0,0,1],
"grade":[2,1,2,3,0,0,0,3,0,2,1,1,0,0,0,1,2,3,1,2,1,3,3,2]})
我想计算 p 值
p 值:0.xxxx ....
Anova 测试要求您的数据呈正态分布,而您的数据显然不是(只有 0 和 1)。您可以通过将假设的生存概率作为数据中 1 的总数除以测量总数来尝试 binomial test,而不管等级如何。然后对每个年级做二项式检验。我将 python 函数链接到 returns p-value。
这个问题最好用逻辑回归来分析。 (建议的对整个样本使用年级组的二项式检验的方法在统计上是不正确的。)使用 R(因为我不是 pythonista)很容易证明它很容易失败,我怀疑有一个 python模拟。 R 结果可用于检查任何 Python 实现的正确性。如您所见,Pandas 中的数据帧结构是从 R 复制而来的,它的许多统计例程也是如此:
ex_df = data.frame(Survive = c(0,0,0,0,0,0,0,1,1,1,0,1,1,1,0,0,0,1,1,1,0,0,0,1),
grade=factor(c(2,1,2,3,0,0,0,3,0,2,1,1,0,0,0,1,2,3,1,2,1,3,3,2)) )
glm(Survive~grade, data=ex_df, family="binomial")
#--- output---
Call: glm(formula = Survive ~ grade, family = "binomial", data = ex_df)
Coefficients:
(Intercept) grade1 grade2 grade3
-0.2877 -0.4055 0.2877 -0.1178
Degrees of Freedom: 23 Total (i.e. Null); 20 Residual
Null Deviance: 32.6
Residual Deviance: 32.25 AIC: 40.25
#----------
summary( glm(Survive~grade, data=ex_df, family="binomial") )
#-------output------
Call:
glm(formula = Survive ~ grade, family = "binomial", data = ex_df)
Deviance Residuals:
Min 1Q Median 3Q Max
-1.1774 -1.0579 -0.9005 1.3018 1.4823
Coefficients:
Estimate Std. Error z value Pr(>|z|)
(Intercept) -0.2877 0.7638 -0.377 0.706
grade1 -0.4055 1.1547 -0.351 0.725
grade2 0.2877 1.1180 0.257 0.797
grade3 -0.1178 1.1902 -0.099 0.921
(Dispersion parameter for binomial family taken to be 1)
Null deviance: 32.601 on 23 degrees of freedom
Residual deviance: 32.247 on 20 degrees of freedom
AIC: 40.247
Number of Fisher Scoring iterations: 4