用户定义的函数,用于迭代回归中的因子水平

User-defined function to iterate through factor levels in a regression

我是 R 的初学者,如果我的问题很基础并且已经在其他地方得到解答,我很抱歉,但不幸的是我找不到答案。

我的预测变量之一 nationality 有 8 个水平。 我想创建一个用户定义的函数,循环遍历变量 nationality 中的每个级别,每次回归采用一个级别。我创建了一个变量级别列表 nationality,如下所示:

mylist <- list("bangladeshian", "british", "filipino", "indian",
               "indonesian", "nigerian", "pakistani", "spanish")

然后创建了一个用户定义函数:

f1 <- function(x) { 
  l <- summary(glm(smoke ~ I(nationality == mylist[x]),
                   data=df.subpop, family=binomial(link="probit")))
  print(l)
}

f1(2)

f1(2) 给出了这个输出:

Call:
glm(formula = smoke ~ I(nationality == mylist[x]), 
    family = binomial(link = "probit"), data = df.subpop)

Deviance Residuals: 
   Min      1Q  Median      3Q     Max  
-0.629  -0.629  -0.629  -0.629   1.853  

Coefficients:
                                Estimate Std. Error z value Pr(>|z|)    
(Intercept)                      -0.9173     0.1659  -5.530 3.21e-08 ***
I(nationality == mylist[x])TRUE  -4.2935   376.7536  -0.011    0.991    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 73.809  on 78  degrees of freedom
Residual deviance: 73.416  on 77  degrees of freedom
AIC: 77.416

Number of Fisher Scoring iterations: 14

如您所见,国籍系数为"I(nationality == mylist[x])TRUE" 这不是很有用,需要用户参考代码行 f1(2) 以及 mylist 以了解该系数所代表的水平。我相信应该有一种更清晰、更直接的方法来做到这一点,并准确地 运行 每个级别的回归,而不必调用 f1() 8 次。

考虑使用 as.formulareformulate 动态构建公式:

nationality_levels <- levels(df.subpop$nationality)

f1 <- function(x) { 
  # BUILD FORMULA (EQUIVALENT CALLS)
  f <- as.formula(paste0("smoke ~ I(nationality == '", x, "')"))
  f <- reformulate(paste0("I(nationality == '", x, "')"), "smoke")

  l <- summary(
    glm(f, data=df.subpop, family=binomial(link="probit"))
  )
}

reg_list <- lapply(nationality_levels, f1)
reg_list