R:逻辑回归使用频率表,找不到正确的皮尔逊卡方统计量



我实现了对以下数据帧的逻辑回归,并得到了合理的(与使用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相同。

最新更新