我used lm()
适合多个回归模型,适用于R中的多个(约100万个)响应变量。例如
allModels <- lm(t(responseVariablesMatrix) ~ modelMatrix)
这将返回类“mlm”的对象,它类似于包含所有模型的巨大对象。我想得到每个模型中第一个系数的 t-statistic ,我可以使用summary(allModels)
函数来做,但是这个大数据的速度非常慢并且返回了很多不需要的数据信息也是。
是否有更快的方式手动计算t-statistic
,这可能比使用summary()
函数更快
谢谢!
答案 0 :(得分:1)
你可以破解summary.lm()函数来获取你需要的部分而剩下的部分。
如果你有
nVariables <- 5
nObs <- 15
y <- rnorm(nObs)
x <- matrix(rnorm(nVariables*nObs),nrow=nObs)
allModels <-lm(y~x)
然后这是来自lm.summary()函数的代码,但删除了所有多余的行李(注意,所有错误处理也已被删除)。
p <- allModels$rank
rdf <- allModels$df.residual
Qr <- allModels$qr
n <- NROW(Qr$qr)
p1 <- 1L:p
r <- allModels$residuals
f <- allModels$fitted.values
w <- allModels$weights
mss <- if (attr(allModels$terms, "intercept"))
sum((f - mean(f))^2) else sum(f^2)
rss <- sum(r^2)
resvar <- rss/rdf
R <- chol2inv(Qr$qr[p1, p1, drop = FALSE])
se <- sqrt(diag(R) * resvar)
est <- allModels$coefficients[Qr$pivot[p1]]
tval <- est/se
tval
现在是t统计数据的向量,也由
summary(allModels)$coefficients[,3]
如果您在大型模型上遇到问题,您可能需要重写代码,以便通过将多行/分配复合到更少的行中来保留更少的对象。
Hacky解决方案我知道。但它将尽可能快。我想将所有代码行放入函数中会更简洁。