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

Posted

技术标签:

【中文标题】如何为具有不同公式的多个 glm 调用仅加载一次数据?【英文标题】:How to load data only once for multiple glm calls with varying formulas? 【发布时间】:2016-12-22 08:37:41 【问题描述】:

我有一个数据集,其中 1 列用于因变量,9 列用于自变量。我必须在 R 中拟合 logit 模型,并采用自变量的所有组合。

我已经为“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 保持不变。它是一个包含大约 1,00,000 条记录的 data.frame。 formuleVector 是一个包含 511 个不同公式的向量。有没有办法加快这个计算?

【问题讨论】:

不要在公式中使用mydata[, i],使用实际的列名。尝试update,寻找替代方案,例如包 biglm。您可能对 MuMIn 包中的 dredge(或并行化的 pdredge)感兴趣。最后,如果您期望得到实际答案,请提供一个可重现的最小示例。 @ZheyuanLi 没有,我没有因素。 【参考方案1】:

很好,你没有因素;其他人我必须打电话给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,因为您只关心系数。

    模型矩阵已建立;我们只动态选择它的列; 循环嵌套并不可怕; 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)来理解吧。

【讨论】:

如果您真的想拟合预测变量的所有可能组合,请使用MuMIn::dredge。它确实做到了这一点,并添加了一些花里胡哨。

以上是关于如何为具有不同公式的多个 glm 调用仅加载一次数据?的主要内容,如果未能解决你的问题,请参考以下文章

如何为不同的请求方法创建具有不同参数编码的 AFHttpClient?

如何为 LookAt 转换获得正确的向上向量?

如何为具有不同图形和媒体资产的不同发送方应用程序实现相同的自定义接收方应用程序?

如何为不同版本的 Xcode 编写条件

如何为图片库添加上一个和下一个箭头?

如何为具有不同颜色的每一行绘制某个 DataFrame 的切片?