2016-12-22 7 views
1

У меня есть набор данных с 1 столбцом для зависимой переменной и 9 для независимых переменных. Я должен подгонять логические модели в R, беря все комбинации независимых переменных.Как загрузить данные только один раз для нескольких вызовов glm с различными формулами?

Я создал формулы для того же самого, которые будут использоваться в функции «glm». Однако каждый раз, когда я вызываю функцию «glm», он загружает данные (которые одинаковы при каждом изменении формулы на каждой итерации).

Есть ли способ избежать этого, чтобы ускорить мои вычисления? Можно ли использовать вектор формул в функции «glm» и загружать данные только один раз?

Код:

tempCoeffV <- lapply(formuleVector, function(s) { coef(glm(s,data=myData,family=binomial, y=FALSE, model=FALSE))}) 


formuleVector is a vector of strings like: 
myData[,1]~myData[,2]+myData[,3]+myData[,5] 
myData[,1]~myData[,2]+myData[,6] 

MyData является data.frame

В каждом lapply заявлении MyData остается тем же самым. Это data.frame с около 10000 записей. formuleVector - вектор с 511 различными формулами. Есть ли способ ускорить это вычисление?

+0

Не используйте 'mydata [, i]' в формулах, используйте фактические имена столбцов. Попробуйте 'update', посмотрите на альтернативы, такие как пакет biglm. Возможно, вам интересен 'dredge' (или параллельный' pdredge') из пакета MuMIn. Наконец, укажите минимальный воспроизводимый пример, если вы ожидаете фактического ответа. – Roland

+0

@ ZheyuanLi Нет, у меня нет факторов. – rishiag

ответ

2

Отлично, у вас нет факторов; othersie Мне нужно позвонить model.matrix, а затем сыграть с полем $assign, вместо того, чтобы просто использовать data.matrix.

## Assuming `mydata[, 1]` is your response 

## complete model matrix and model response 
X <- data.matrix(mydata); y <- X[, 1]; X[, 1] <- 1 

## covariates names and response name 
vars <- names(mydata) 

Вот как вы получаете своих 511 кандидатов, не так ли?

choose(9, 1:9) 
# [1] 9 36 84 126 126 84 36 9 1 

Теперь вместо числа комбинаций, нам нужен индекс комбинации, легко получить от combn. Остальная часть истории состоит в том, чтобы написать петлевое гнездо и перебрать все комбинации. glm.fit используется, так как вы только заботитесь о коэффициентах.

  1. модель матрицы была установлена; мы только динамически выбираем его столбцы;
  2. петлевое гнездо не страшно; glm.fit намного дороже, чем ваш цикл for. Для удобства чтения не перекодируйте их, например, как lapply.

lst <- vector("list", 9) ## a list to store all result 
for (k in 1:9) { 
    ## combn index; each column is a combination 
    ## plus 1 as an offset as there is an intercept in `X` 
    I <- combn(9, k) + 1 
    ## now loop through all combinations, calling `glm.fit` 
    n <- choose(9, k) 
    lstk <- vector("list", n) 
    for (j in seq.int(n)) 
    ## current index 
    ind <- I[, j] 
    ## get regression coefficients 
    b <- glm.fit(X[, c(1, ind)], y, family = binomial())$coefficients 
    ## attach model formula as an attribute 
    attr(b, "formula") <- reformulate(vars[ind], vars[1]) 
    ## store 
    lstk[[j]] <- b 
    } 
    lst[[k]] <- lstk 
    } 

В конце концов, lst вложенный список. Используйте это значение str(lst), чтобы понять это.

+0

Если вы действительно хотите установить все возможные комбинации предикторов, используйте 'MuMIn :: dredge'. Он делает именно это и добавляет некоторые колокола и свистки. – Roland