用户定义的函数,用于迭代回归中的因子水平
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.formula
或 reformulate
动态构建公式:
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
我是 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.formula
或 reformulate
动态构建公式:
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