перебирая glm в R - PullRequest
       0

перебирая glm в R

0 голосов
/ 31 января 2020

Я хотел бы создать скрипт для автоматизации функции glm для нескольких (n = 45) переменных. В настоящее время я выполняю это индивидуально, что очень утомительно;

df1
ID  status   B01 B02  B03  B04  B05.......B045
01  0        0   1     1   0    0         0
02  1        1   0     0   0    1         0
03  1        1   1     0   0    0         0
04  0        0   0     0   0    1         1
05  0        1   0     0   0    0         1

ItB01 <- (glm(status ~ B01, data=df1, family = binomial(link = 'logit')))
#for tidy export
library(broom)
tidy_ItB01 <-tidy(ItB01)
tidy_ItB01
write.csv(tidy_ItB01, "ItB01_coef.csv")
#convert to OR and export
library(epiDisplay)
logistic.display(ItB01) -> table2
attributes(table2)
table2$table
ItB01 <- as.data.frame(table2$table)
write.csv(ItB01, file="ItB01_OR.csv")

Я повторяю весь этот процесс для переменных от B02 до B45. Есть предложения как автоматизировать процесс?

Ответы [ 2 ]

2 голосов
/ 31 января 2020

Вы можете строить свои формулы в виде строк, а затем использовать al oop:

library(broom)
library(epiDisplay)

vars = names(df1)[-(1:2)]
formula_strings = sprintf("status ~ %s", vars)
file_prefix = sprintf("It%s_", vars)
for (i in seq_along(vars)) {
  mod = glm(as.formula(formula_strings[i]), data=df1, family = binomial(link = 'logit'))
  coefs = tidy(mod)
  write.csv(coefs, paste0(file_prefix[i], "coef.csv")

  #convert to OR and export
  OR = as.data.frame(logistic.display(mod)$table)
  write.csv(OR, file = paste0(file_prefix[i], "OR.csv"))
}

Вы также можете сохранить промежуточные результаты в списках. Если это так, добавьте следующий код:

## before the loop, initialize empty lists
coefs = list()
odds_ratios = list()

## inside the loop, assign to the lists
coefs[[vars[i]]] = coefs
odds_ratios[[vars[i]]] = OR

## after the loop, access elements with [[
## e.g., coefs[["B04"]]
1 голос
/ 31 января 2020

Вы можете сделать все это с помощью mapply следующим образом:

library(broom)
library(epiDisplay)

mapply(function(x, y) {
  mod <- glm(df1$status ~ x, family = binomial(link = 'logit'))
  write.csv(tidy(mod), paste0("It", y, "_coef.csv"))
  write.csv(as.data.frame(logistic.display(mod)$table),  paste0("It", y, "_OR.csv"))
  }, df1[-(1:2)], names(df1[-(1:2)]))

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...