如何为具有不同公式的多个 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?