【问题标题】:Loop through dependent variables in GLM model when an independent variable fulfill a condition当自变量满足条件时,循环遍历 GLM 模型中的因变量
【发布时间】:2020-08-24 22:23:01
【问题描述】:

我有代码在几个选定的因变量(称为结果 1-4)上循环逻辑回归。如果满足自变量中的条件,我只想运行模型。假设我希望每个结果和类型组合至少有两个女性。

虚拟数据:

set.seed(5)
df <- data.frame(
  id = c(1:100),
  age = sample(20:80, 100, replace = TRUE),
  sex = sample(c("M", "F"), 100, replace = TRUE, prob = c(0.7, 0.3)),
  type = sample(letters[1:4], 100, replace = TRUE),
  outcome1 = sample(c(0L, 1L), 100, replace = TRUE, prob = c(0.68, 0.32)),
  outcome2 = sample(c(0L, 1L), 100, replace = TRUE, prob = c(0.65, 0.35)),
  outcome3 = sample(c(0L, 1L), 100, replace = TRUE, prob = c(0.60, 0.40)),
  outcome4 = sample(c(0L, 1L), 100, replace = TRUE, prob = c(0.45, 0.55)))

循环 GLM 的代码(信任 https://stats.idre.ucla.edu/r/codefragments/looping_strings/):

outcomelist <- names(df)[5:8]
modelall <- lapply(outcomelist, function(x) {
  glm(substitute(i ~ type + sex, list(i = as.name(x))), family = "binomial", data = df)})

我发现了很多关于循环的问题,但没有发现任何附加条件。我正在考虑子集,但不是 lapply 的专业人士,但我不知道该放在哪里。

如果这不是一个额外的问题,我希望将每个模型命名为列表中结果变量的名称(而不是 1 到 4),否则当条件为添加。

感谢任何帮助!

【问题讨论】:

  • “我只想在满足自变量中的条件时运行模型”这意味着独立运行结果 1 - 4 对吗?
  • 你已经在modelall中拥有它
  • @StupidWolf 是的,完全独立运行,但是当每个结果为 1 时,每种类型(a、b、c、d)中至少需要 2 名女性才能运行模型。我可能在问题中以不好的方式解释了它。此处的数字 2 仅作为示例。
  • 好吧,我的错……我读的太快了。因此,如果每个组合组至少有两个,则要运行它。嗯,抱歉,只是想问一下,您排除了 type = a 的所有结果 = 0 的情况?
  • 所有案例(行)都保留在 df 中,但对于女性少于两个给定结果 == 1 的结果,模型不会针对每种类型运行。如果可以在所有模型运​​行后检查这也很好,但我还不太擅长列表,所以我无法弄清楚。我可能会像@Mr.那样做。 Zen建议在下面首先清除df中不符合条件的结果。我已经为此苦苦挣扎了一段时间,以保持df尽可能长并使用group_by,但id应该只包含一次每个结果(0/1)所以最后我决定spread它并对其进行一次热编码。

标签: r loops subset lapply glm


【解决方案1】:

一种可能性是在运行lapply()之前清理数据:

df.new <- df

for(ii in 1:length(outcomelist)){

temp <- outcomelist[ii]

# check the condition for outcome variable ii
condition <- any(aggregate(df$sex=="F", by=list(df$type, df[,temp]), FUN="sum")$x < 2)

if(condition){

# if the condition is met, remove the variable from df and outcomelist  

df.new[,temp]   <- NULL
outcomelist[ii] <- NA

}

}

# lose irrelevant outcomes
outcomelist <- na.omit(outcomelist)

modelall <- lapply(outcomelist, function(x) {
  glm(substitute(i ~ type + sex, list(i = as.name(x))), family = "binomial", data = df.new)})


# name the list
names(modelall) <- outcomelist

【讨论】:

  • 是的,之前清洁绝对是一种选择。我的问题可能不清楚,因为提供的代码删除了所有结果变量。如果运行df %&gt;% group_by(sex, type, outcome4) %&gt;% summarise(n = length(sex)),则每种类型至少有 2 名女性。或者也许我错过了什么。
  • 我的代码删除了结果 2 和 3,因为在这些结果中,按类型和结果 (1/0) 计算的女性少于两个。您能否举例说明您的目标是什么?
  • 在我从df.new 运行您的代码到for 循环的末尾后,我的outcomelistc(NA, NA, NA, NA),所以outcomelist &lt;- na.omit(outcomelist) 删除了所有结果并且模型没有可运行的东西。在我试用了代码之后,我将condition$x &lt; 2 更新为$x &lt; 3,这样我们就至少都在谈论两个女性。我仍在学习列表,所以也许我只是不明白。我意识到命名列表有点太容易了。
  • 我无法重现您的问题。该代码从数据集中删除结果 2 和 3。例如,对于结果 2,只有 1 名女性在类型 a/结果 1 组中。因此,我的代码放弃了这个结果。
  • 好的,和set.seed有关系吗?还想着我是否有一个可以掩盖某些东西的包裹,但在我看来,只有aggregate 可能是问题所在。我会再次检查所有内容,否则无论如何都会接受您的回答。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多