我有一个数据集,其中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种不同公式的向量。有没有办法加快这个计算?
答案 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
,因为你只关心系数。
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)
来理解它。