L oop через зависимые переменные в модели GLM, когда независимая переменная удовлетворяет условию - PullRequest
2 голосов
/ 09 мая 2020

У меня есть код для l oop логистической c регрессии по нескольким выбранным зависимым переменным (так называемый результат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)))

Код l oop 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)})

Я нашел много вопросов по l oop, но ни одного с дополнительными условиями. Я думаю о подмножестве, но не являюсь профессионалом в области лаппи, но не знаю, куда это поставить.

Если это не дополнительный вопрос, я бы хотел, чтобы каждая модель называлась именем выходной переменной в списке (вместо 1–4), поскольку в противном случае будет сложно отслеживать модели, когда условие добавлено.

Благодарю за любую помощь!

1 Ответ

0 голосов
/ 09 мая 2020

Одна из возможностей - очистить данные перед запуском 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
...