使用R在逻辑回归中获取交互的特定组合作为变量

Getting specific combination of interaction as variable in logistic regression with R

我有这个数据集,想对其进行回归分析。我必须预测变量 urban_rural 和宗教。现在我想要两个特定的交互变量:1.) Urban/not religious 和 2.) Rural/religious。我知道可以通过符号 * 进行交互,但这并没有给我所需的交互组合。我想必须手动设置参考变量?

structure(list(urban_rural = structure(c(1L, 1L, 2L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 1L, 
1L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
2L, 1L, 1L, 1L, 2L, 1L, 1L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 1L, 1L, 1L, 1L, 
1L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 2L, 1L, 
1L, 1L, 2L, 2L, 1L, 1L, 1L, 2L, 1L, 1L, 1L, 2L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 1L, 2L, 2L, 1L, 1L, 1L, 
2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 1L, 2L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 2L, 2L, 1L, 2L, 2L, 1L, 1L, 2L, 2L, 1L, 1L, 
2L, 1L, 2L, 2L, 1L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 2L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L), .Label = c("Urban", "Rural", "Refugee camp"
), class = "factor"), religious = structure(c(2L, 1L, 2L, 2L, 
3L, 2L, 2L, 3L, 1L, 3L, 3L, 1L, 3L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 2L, 3L, 2L, 2L, 2L, 3L, 3L, 3L, 
2L, 2L, 2L, 2L, 2L, 2L, 3L, 2L, 1L, 2L, 2L, 2L, 2L, 1L, 3L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 2L, 2L, 2L, 2L, 
2L, 2L, 3L, 2L, 2L, 2L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 1L, 3L, 1L, 2L, 2L, 2L, 
1L, 1L, 2L, 2L, 2L, 1L, 2L, 1L, 1L, 2L, 2L, 1L, 2L, 1L, 2L, 2L, 
2L, 1L, 2L, 2L, 3L, 2L, 2L, 2L, 2L, 2L, 3L, 2L, 3L, 2L, 2L, 3L, 
2L, 2L, 2L, 2L, 2L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 3L, 2L, 2L, 3L, 2L, 1L, 3L, 1L, 2L, 3L, 2L, 
2L, 1L, 2L, 3L, 3L, 3L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, 2L, 3L, 2L, 
3L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 2L, 3L, 2L, 2L, 3L, 2L, 2L, 2L, 
2L, 2L, 2L, 1L, 2L, 2L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 2L, 2L, 
1L, 2L, 2L, 2L, 2L, 3L, 2L, 3L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 
3L, 2L, 2L, 2L, 1L, 2L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 2L, 
2L, 2L, 3L, 2L, 3L, 1L), .Label = c("Religious", "Somewhat religious", 
"Not religious"), class = "factor"), family_role_recoded = structure(c(1L, 
1L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 2L, 
1L, 1L, 2L, 1L, 1L, 2L, 1L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 
2L, 2L, 2L, 2L, 1L, 2L, 1L, 1L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 
1L, 2L, 1L, 1L, 1L, 1L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 
1L, 2L, 1L, 1L, 1L, 2L, 1L, 1L, 1L, 1L, 2L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 2L, 2L, 1L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 1L, 2L, 
2L, 2L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 
2L, 1L, 1L, 2L, 1L, 1L, 1L, 2L, 1L, 1L, 2L, 2L, 1L, 2L, 1L, 2L, 
1L, 2L, 2L, 1L, 1L, 2L, 1L, 2L, 2L, 1L, 2L, 1L, 1L, 2L, 1L, 1L, 
1L, 1L, 2L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 1L, 2L, 1L, 1L, 2L, 1L, 
1L, 1L, 1L, 1L, 2L, 2L, 2L, 1L, 2L, 1L, 2L, 1L, 1L, 1L, 2L, 1L, 
2L, 2L, 1L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 1L, 1L, 2L, 2L, 
1L, 2L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 1L, 1L, 2L, 1L, 1L, 2L, 2L, 
2L, 1L, 2L, 2L, 1L, 2L, 1L, 1L, 1L, 1L, 2L, 1L, 1L, 2L, 1L, 2L, 
1L, 1L, 2L, 1L, 1L, 1L, 2L, 2L, 1L, 1L, 2L, 1L, 1L, 1L, 1L, 2L, 
1L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 1L), .Label = c("Agree/strongly agree", 
"Disagree/strongly disagree", "Don't know"), class = "factor")), row.names = c(NA, 
250L), class = "data.frame")

我使用了这些回归模型:

model1 <- glm(family_role_recoded ~ urban_rural,
              family=binomial(link='logit'),
              subset = (family_role_recoded != "Don't know" & urban_rural != "Refugee camp"), 
              data=dataset)

model2 <- glm(family_role_recoded ~ religious,
              family=binomial(link='logit'),
              subset = (family_role_recoded != "Don't know" & urban_rural != "Refugee camp"), 
              data=dataset)

model3 <- glm(family_role_recoded ~ urban_rural + religious,
              family=binomial(link='logit'),
              subset = (family_role_recoded != "Don't know" & urban_rural != "Refugee camp"), 
              data=dataset)

有人知道如何解决这个问题吗?

您需要进行 post 临时测试。为此,您可以使用 R 包“emmeans”

如果您先将 religious 的引用设置为 "Somewhat religious"。我们可以先看看结果:

library(broom)
dataset$religious = relevel(dataset$religious,ref="Somewhat religious")

fit0 = glm(family_role_recoded ~ urban_rural*religious,data=dataset,family=binomial())

    # A tibble: 6 x 5
  term                                   estimate std.error statistic    p.value
  <chr>                                     <dbl>     <dbl>     <dbl>      <dbl>
1 (Intercept)                             -0.902      0.181   -4.99      6.03e-7
2 urban_ruralRural                        -0.484      0.532   -0.910     3.63e-1
3 religiousReligious                      -0.0141     0.456   -0.0308    9.75e-1
4 religiousNot religious                   1.47       0.391    3.76      1.67e-4
5 urban_ruralRural:religiousReligious      0.995      1.14     0.876     3.81e-1
6 urban_ruralRural:religiousNot religio…   0.201      0.993    0.203     8.39e-1

您有一项rural/religious。直觉上,Urban/Not religious 项将是 urban_ruralRural:religiousNot religio 的翻转。我们也可以手动定义我们需要的交互项:

dataset$Rural_religious = with(dataset,as.numeric(urban_rural=="Rural" & religious=="Religious"))

dataset$Urban_not_religious = with(dataset,as.numeric(urban_rural=="Urban" & religious=="Not religious"))

fit = glm(family_role_recoded ~ 0+urban_rural+religious+Urban_not_religious+Rural_religious,data=dataset,family=binomial())

tidy(fit)
# A tibble: 6 x 5
  term                   estimate std.error statistic     p.value
  <chr>                     <dbl>     <dbl>     <dbl>       <dbl>
1 urban_ruralUrban        -0.902      0.181   -4.99   0.000000603
2 urban_ruralRural        -1.39       0.500   -2.77   0.00556    
3 religiousReligious      -0.0141     0.456   -0.0308 0.975      
4 religiousNot religious   1.67       0.913    1.83   0.0667     
5 Urban_not_religious     -0.201      0.993   -0.203  0.839      
6 Rural_religious          0.995      1.14     0.876  0.381