我对下面的数据框架进行了logistic回归,得到了一个合理的结果(与使用STATA的结果相同)。但是,我从R得到的Pearson平方和自由度与STATA非常不同,而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 10 9 0 Yes 1 1 1 No 0 31 1 No 1 6 1 Yes 0 45 1 Yes 1 6
我通过统计每个协变量模式的出现情况,从原始数据生成这个数据框架,并将数字存储在新变量freq中。
2. GLM模型
然后,我做了logistic回归,如:
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 3.501 10.409 2.129系数:估计性病。错误z值Pr(>\x\x}) (截获) -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
Fisher评分迭代数:5
系数与STATA相同。
3. X平方统计
当我试图计算皮尔逊广场时:
pearson_chisq =和(剩余数(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警告信息: 在wilcox.test.default(predobs == 1,predobs == 0,alternative = "great")中:不能用领带计算精确的p值。
谢谢!
发布于 2014-11-17 02:26:54
我终于想出了解决这个问题的办法。我上面使用的数据集应该被概括为协变量模式。然后用皮尔逊方的定义进行计算。我提供的R代码如下:
提取协变量模式 library(dplyr) 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 = fitted(logit) logit\_mf$freq=test\_data$freq 扩展预测 yhat\_expand=with(logit\_mf, rep(pred, freq)) library(verification) roc.area(y\_expand, yhat)$A
AUC=0.6760,与STATA的相同。
https://stackoverflow.com/questions/26953585
复制相似问题