我对以下数据框实现了逻辑回归,得到了一个合理的(与使用STATA相同)结果 . 但是我从R得到的Pearson卡方和自由度与STATA非常不同,后者反过来给了我一个非常小的p值 . 而且我无法将该区域置于ROC曲线下 . 任何人都可以帮我找出为什么residual()不能用于带有先验权重的glm(),以及如何处理ROC曲线下的面积?
Following is my code and output.
1. Data
这是我的数据框 test_data
,y是结果,x1和x2是协变量:
y x1 x2 freq
0否0 268
0否1 14
0是0 109
0是1 1
1否0 31
1否1 6
1是0 45
1是1 6
我通过计算每个协变量模式的出现次数从原始数据生成此数据帧,并将该数字存储在新变量 freq
中 .
2. GLM Model
然后我做了逻辑回归:
logit=glm(y~x1+x2, data=test_data, family=binomial, weights=freq)
输出显示:
Deviance Residuals:1 2 3 4 5 6 7 8 -7.501 -3.536 -8.818 -1.521 11.957 3.501 10.409 2.129系数:估计标准 . 误差z值Pr(> | z |)(截距)-2.2010 0.1892 -11.632 <2e-16 *** x1 1.3538 0.2516 5.381 7.39e-08 *** x2 1.6261 0.4313 3.770 0.000163 *** Signif . 代码:0''0.001''0.01''0.05' . ' 0.1''1(二项式族的色散参数为1)空偏差:7自由度为457.35
剩余偏差:5自由度上的416.96 AIC:422.96 Fisher评分迭代次数:5
系数与STATA相同 .
3. Chi Square Statistics
当我试图计算皮尔逊卡方时:
pearson_chisq = sum(残差(logit,type =“pearson”,weights = test_data $ freq)^ 2)
我得到488,而不是STATA给出的1.3 . 由R生成的DOF也是 chisq_dof = df.residuals(logit)
= 5,而不是1.所以我得到了一个非常小的p值~e ^ -100 .
4. Discrimination
然后我计算了ROC曲线下的面积: library(verification)
logit_mf = model.frame(logit)roc.area(logit_mf $ y,fit(logit))$ A
输出是:
[1] 0.5
警告信息:
在wilcox.test.default(pred [obs == 1],pred [obs == 0],alternative =“great”):无法用关系计算精确的p值
谢谢!
1 回答
我想出了最终如何解决这个问题 . 我上面使用的数据集应该归纳为协变量模式 . 然后使用Pearson chi square的定义进行计算 . 我提供的R代码如下:
p值的结果为0.241941,与STATA相同 .
为了计算AUC,我们首先应该将协变量模式扩展为“原始”数据,然后使用“扩展”数据来获得AUC . 注意,我们在频率表中有392“0”和88“1” . 我的代码如下:
AUC = 0.6760,与STATA相同 .