我实现了对以下数据帧的逻辑回归,并得到了合理的(与使用STATA相同)的结果。但是我从R得到的皮尔逊卡方和自由度与STATA非常不同,后者反过来给了我一个非常小的p值。而且我无法获得 ROC 曲线下的面积。谁能帮我找出为什么残差()不适用于具有先验权重的glm(),以及如何处理ROC曲线下的面积?
以下是我的代码和输出。
1. 数据
这是我的数据框test_data
,y 是结果,x1 和 x2 是协变量:
y x1 x2 freq 0 No 0 268 0 No 1 14 0 Yes 0 109 0 Yes 1 1 1 No 0 31 1 No 1 6 1 Yes 0 45 1 Yes 1 6
我通过计算每个协变量模式的出现次数从原始数据生成此数据框,并将数字存储在新的变量freq
中。
2. GLM模型
然后我做了逻辑回归,如下所示:
logit=glm(y~x1+x2, data=test_data, family=binomial, weights=freq)
输出显示:
偏差残差: 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 ***
表示代码: 0 '' 0.001 '' 0.01 '' 0.05 '."0.1 ' ' 1
(二项式族的离散参数取为 1)
Null deviance: 457.35 on 7 degrees of freedom
残余偏差:5 个自由度上的 416.96 AIC: 422.96
费舍尔评分迭代次数:5
系数与 STATA 相同。
3. 卡方统计
当我尝试计算皮尔逊卡方时:
pearson_chisq = sum(requduals(logit, type = "pearson", weights=test_data$freq)^2)
我得到了 488,而不是 STATA 给出的 1.3。此外,R 生成的自由度是 chisq_dof = df.residuals(logit)
=5,而不是 1。所以我得到了一个非常小的p值~e^-100。
4. 歧视
然后我计算出ROC曲线下的面积为: library(verification)
logit_mf = model.frame(logit)
roc.area(logit_mf $y, fitted(logit))$A
输出为:
[1] 0.5 Warning message:
In wilcox.test.default(pred[obs == 1], pred[obs == 0], alternative = "great") : 无法计算带连接的精确 p 值
谢谢!
我想出了最终解决这个问题的方法。我上面使用的数据集应该总结为协变量模式。然后用皮尔逊卡方的定义来做计算。我提供 R 代码如下:
# 提取协变量模式
图书馆(德普利尔)
temp=test_data %>% group_by(x1, x2) %>% summarise(m=sum(freq),y=sum(freq*y)) temp$pred=fitted(p01_logit_j)[1:4]# 计算皮尔逊卡方
temp=mutate(temp, pearson=(y-m pred)/sqrt(m pred*(1-pred)))
pearson_chi2 = with(temp, sum(pearson^2)) temp_dof = 4-(2+1) #dof=J-(p+1)# 计算 p 值
pchisq(pearson_chi2, temp_dof, lower.tail=F)
p 值的结果为 0.241941,与 STATA 相同。
为了计算 AUC,我们应该首先将协变量模式扩展到"原始"数据,然后使用"扩展"数据来获得 AUC。请注意,我们在频率表中有 392 个"0"和 88 个"1"。我的代码如下:
# 展开观察
y_expand=c(rep(0,392),rep(1,88))
logit_mf = model.frame(logit)
logit_pred = 拟合(对数)
logit_mf$freq=test_data$freq# 展开预测
yhat_expand=with(logit_mf, rep(pred, freq))
库(验证)
Roc.area(y_expand, YHAT)$A
AUC=0.6760,与STATA相同。