【问题标题】:Obtain t-statistic for regression coefficients of an “mlm” object returned by `lm()`获取“lm()”返回的“mlm”对象的回归系数的 t 统计量
【发布时间】:2013-03-27 01:59:45
【问题描述】:

我有 used lm() 来拟合多个回归模型,用于 R.Eg 中的多个(约 100 万)响应变量。

allModels <- lm(t(responseVariablesMatrix) ~ modelMatrix)

这会返回一个“mlm”类的对象,它就像一个包含所有模型的巨大对象。我想获得每个模型中第一个系数的 t-statistic,我可以使用 summary(allModels) 函数来完成,但是在这个大数据上它非常慢并且还会返回很多不需要的信息.

是否有更快的手动计算t-statistic 的方法,可能比使用summary() 函数更快

谢谢!

【问题讨论】:

  • 我只是想满足我的好奇心。那会是 100 万个变量或案例吗?
  • 它们是基因表达水平。实际上有 20,000 个,但我只是用 100 万个来说明它们很多。

标签: r regression linear-regression lm mlm


【解决方案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]

如果您在大型模型上遇到问题,您可能需要重写代码,以便通过将多行/分配复合成更少的行来保留更少的对象。

我知道的黑客解决方案。但它会尽可能快。我想将所有代码行也放入一个函数中会更整洁。

【讨论】:

    猜你喜欢
    • 2015-04-11
    • 1970-01-01
    • 1970-01-01
    • 2012-10-24
    • 1970-01-01
    • 1970-01-01
    • 2019-05-25
    • 2020-03-05
    • 2017-03-05
    相关资源
    最近更新 更多