使用波尔函数检查比例赔率假设是否在序数逻辑回归中成立


9

我已使用MASS软件包中的“ polr”函数对具有15个连续解释变量的序数分类响应变量运行序数逻辑回归。

按照UCLA指南中的建议,我已使用代码(如下所示)检查我的模型是否符合比例赔率假设。但是,我有点担心输出的含义,即不仅各个切点之间的系数都相似,而且也完全相同(请参见下图)。

FGV1b <- data.frame(FG1_val_cat=factor(FGV1b[,"FG1_val_cat"]), 
                    scale(FGV1[,c("X","Y","Slope","Ele","Aspect","Prox_to_for_FG", 
                          "Prox_to_for_mL", "Prox_to_nat_border", "Prox_to_village", 
                          "Prox_to_roads", "Prox_to_rivers", "Prox_to_waterFG", 
                          "Prox_to_watermL", "Prox_to_core", "Prox_to_NR", "PCA1", 
                          "PCA2", "PCA3")]))
b     <- polr(FG1_val_cat ~ X + Y + Slope + Ele + Aspect + Prox_to_for_FG + 
                            Prox_to_for_mL + Prox_to_nat_border + Prox_to_village + 
                            Prox_to_roads + Prox_to_rivers + Prox_to_waterFG + 
                            Prox_to_watermL + Prox_to_core + Prox_to_NR, 
              data=FGV1b, Hess=TRUE)

查看模型摘要:

summary(b)
(ctableb <- coef(summary(b)))
q        <- pnorm(abs(ctableb[, "t value"]), lower.tail=FALSE) * 2
(ctableb <- cbind(ctableb, "p value"=q))

现在我们可以看一下参数估计值的置信区间:

(cib <- confint(b)) 
confint.default(b)

但是这些结果仍然很难解释,因此让我们将系数转换为优势比

exp(cbind(OR=coef(b), cib))

检查假设。因此,以下代码将估计要绘制的值。首先,它向我们显示了大于或等于目标变量的每个值的概率的logit变换

FG1_val_cat <- as.numeric(FG1_val_cat)
sf <- function(y) {
  c('VC>=1' = qlogis(mean(FG1_val_cat >= 1)),
    'VC>=2' = qlogis(mean(FG1_val_cat >= 2)),
    'VC>=3' = qlogis(mean(FG1_val_cat >= 3)),
    'VC>=4' = qlogis(mean(FG1_val_cat >= 4)),
    'VC>=5' = qlogis(mean(FG1_val_cat >= 5)),
    'VC>=6' = qlogis(mean(FG1_val_cat >= 6)),
    'VC>=7' = qlogis(mean(FG1_val_cat >= 7)),
    'VC>=8' = qlogis(mean(FG1_val_cat >= 8)))
}
(t <- with(FGV1b, summary(as.numeric(FG1_val_cat) ~ X + Y + Slope + Ele + Aspect + 
                             Prox_to_for_FG + Prox_to_for_mL + Prox_to_nat_border + 
                             Prox_to_village + Prox_to_roads + Prox_to_rivers + 
                             Prox_to_waterFG + Prox_to_watermL + Prox_to_core + 
                             Prox_to_NR, fun=sf)))

上表显示了如果一次将我们的因变量回归到我们的预测变量上而没有平行斜率假设,我们将获得的(线性)预测值。因此,现在,我们可以对因变量使用不同的割点运行一系列二进制逻辑回归,以检查各个割点的系数是否相等

par(mfrow=c(1,1))
plot(t, which=1:8, pch=1:8, xlab='logit', main=' ', xlim=range(s[,7:8]))

轮询假设检查

抱歉,我不是统计学专家,也许我在这里没什么明显的地方。但是,我花了很长时间试图找出在测试模型假设方面是否存在问题,并试图找出其他运行相同模型的方法。

例如,我读了很多帮助邮件列表,其中其他人使用vglm函数(在VGAM程序包中)和lrm函数(在rms程序包中)(例如,请参见此处: R与这些程序包一起在R中进行有序逻辑回归的比例赔率假设) VGAM和rms)。我曾尝试运行相同的模型,但不断遇到警告和错误。

例如,当我尝试使用'parallel = FALSE'参数拟合vglm模型时(因为前面的链接提到对测试比例赔率假设很重要),我遇到以下错误:

lm.fit(X.vlm,y = z.vlm,...)中的错误:'y'中的NA / NaN / Inf
另外:警告消息:
在Deviance.categorical.data.vgam中(mu = mu,y = y,w = w,残差=残差,:拟合值接近0或1

我想问问是否有人可以理解并能够向我解释为什么我上面生成的图形看起来像它一样。如果确实意味着某事不正确,请您帮我找到一种方法,仅使用polr函数即可测试比例赔率假设。或者,如果这不可能,那么我将尝试使用vglm函数,但随后将需要一些帮助来解释为什么我不断收到上面给出的错误。

注意:作为背景,这里有1000个数据点,它们实际上是研究区域中的位置点。我正在查看分类响应变量与这15个解释变量之间是否存在任何关系。所有这15个解释变量都是空间特征(例如,海拔,xy坐标,与森林的接近程度等)。使用GIS随机分配了1000个数据点,但我采用了分层抽样方法。我确保在8个不同的类别响应级别中的每个级别中随机选择了125个点。希望这些信息对您有所帮助。

Answers:


1

因变量具有8个有序水平,因此在图表中测试比例赔率假设,您应该为每个自变量看到8个不同的符号。每个自变量只能看到2个符号,可能是因为您为x轴的值选择的间隔太短了。如果我的猜想是正确的,则只需要为x轴的值使用更宽的间隔即可。试试这个代码:

par(mfrow=c(1,1))
plot(t, which=1:8, pch=1:8, xlab='logit', main=' ', xlim=range(s[,3:9]))

5
根据我们的标准,这还不够。你能详细说明吗?此代码做什么/如何检查PO假设?(例如,使用不同软件的人将如何使用相同的方法?)
gung-恢复莫妮卡

我刚刚改善了答案。请告诉我它是否令人满意
John M

1

因此,我通过谷歌搜索发现了这一点,因此我认为答案仍然可能有用。我认为错误在于

sf <- function(y) {
  c('VC>=1' = qlogis(mean(FG1_val_cat >= 1)),
    'VC>=2' = qlogis(mean(FG1_val_cat >= 2)),
    'VC>=3' = qlogis(mean(FG1_val_cat >= 3)),
    'VC>=4' = qlogis(mean(FG1_val_cat >= 4)),
    'VC>=5' = qlogis(mean(FG1_val_cat >= 5)),
    'VC>=6' = qlogis(mean(FG1_val_cat >= 6)),
    'VC>=7' = qlogis(mean(FG1_val_cat >= 7)),
    'VC>=8' = qlogis(mean(FG1_val_cat >= 8)))
}

您使用FG1_val_cat而不是y。使用Harrell回归建模策略中的示例:

library(Hmisc)
getHdata(support)
support <- support[complete.cases(support[, c("sfdm2", "adlsc", "sex", "age", "meanbp")]), ]
sfdm <- as.integer (support$sfdm2 ) - 1

sf1 <- function (y) {
  c(' Y ≥ 1 ' = qlogis (mean(sfdm >= 1)), 
    ' Y ≥ 2 ' = qlogis (mean(sfdm >= 2)),
    ' Y ≥ 3 ' = qlogis (mean(sfdm >= 3))
  )
}

sf2 <- function (y) {
  c(' Y ≥ 1 ' = qlogis (mean(y >= 1)), 
    ' Y ≥ 2 ' = qlogis (mean(y >= 2)),
    ' Y ≥ 3 ' = qlogis (mean(y >= 3))
  )
}

s1 <- summary(sfdm ~ adlsc + sex + age + meanbp, fun=sf1,
              data = support)
s2 <- summary(sfdm ~ adlsc + sex + age + meanbp, fun=sf2,
              data = support)  

plot(s1, which =1:3, pch =1:3, xlab = ' logit ', main = ' ', width.factor = 1.4, cex.lab = 0.75)

plot(s2, which =1:3, pch =1:3, xlab = ' logit ', main = ' ', width.factor = 1.4, cex.lab = 0.75)

在此处输入图片说明

在此处输入图片说明

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.