2016-12-22 5 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 각 lapply 문에서 data.frame

이다가, MYDATA는 동일하게 유지됩니다. 약 1,00,000 개의 레코드가있는 data.frame입니다. formuleVector는 511 개의 다른 수식이있는 벡터입니다. 이 계산 속도를 높이는 방법이 있습니까?

+0

수식에'mydata [, i]'를 사용하지 말고 실제 열 이름을 사용하십시오. 'update'를 시도해보고, biglm 패키지와 같은 대안을 살펴보십시오. 아마도 MuMIn 패키지에서'dredge' (또는 병렬 처리 된'pdredge')가 여러분에게 흥미로울 수 있습니다. 마지막으로, 실제 답변을 기대한다면 최소한의 재생산 가능한 예제를 제공하십시오. – Roland

+0

@ ZheyuanLi 아니요, 요인이 없습니다. – rishiag

답변

2

위대한 경우 요소가 없습니다. 다른 사람들은 data.matrix을 사용하는 대신 $assign 필드를 사용하여 model.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