我创建了一个数据框来比较三个或更多组的比例(实际数据有50,000多行)。左栏中的0表示生存,1表示死亡,右栏中的0、1、2、3表示等级。
在示例数据框中,按等级划分的比例似乎没有差异,但是我想导出p值,无论它实际上是否具有统计学意义。
从示例中获得的生存率如下。
0年级57.14%
1年级66.66%
2年级50.0%
3年级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 ....
答案 0 :(得分:0)
Anova测试要求您的数据是正态分布的,而您的数据显然不是正态分布的(仅是0和1)。您可以通过将假设的生存概率为数据中的1的总数除以测量的总数,而与等级无关,来尝试binomial test。然后对每个年级进行二项式检验。我喜欢返回的python函数的p值。
答案 1 :(得分:0)
这是一个最好通过逻辑回归分析的问题。 (建议的对整个样本使用等级组的二项式检验的方法在统计上是不正确的。)使用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