如何为具有不同公式的多个glm调用仅加载一次数据?

时间:2016-12-22 08:37:42

标签: r performance regression glm

我有一个数据集,其中1列为因变量,9为自变量。我必须在R中使用logit模型来考虑自变量的所有组合。

我已经创建了相同的公式,用于" glm"功能。但是,每次我打电话给" glm"函数,它加载数据(每次只有公式在每次迭代中更改时都相同)。

有没有办法避免这种情况,以加快我的计算速度?我可以在" glm"中使用公式矢量。功能和加载数据只有一次?

代码:

curl http://localhost:9020/xxx/xxxx/ -H Content-type:application/json \
-H Accept:application/json -d "$var"

myData是data.frame

在每个lapply语句中,myData保持不变。它是一个包含大约1,00,000条记录的data.frame。 formuleVector是一个包含511种不同公式的向量。有没有办法加快这个计算?

1 个答案:

答案 0 :(得分:2)

太好了,你没有因素;其他我需要拨打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.fitfor循环贵得多。为了便于阅读,请不要将它们重新编码为lapply
  3. 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)来理解它。