簡體   English   中英

獲取`lm()`返回的“mlm”對象的回歸系數的標准誤差

[英]Obtain standard errors of regression coefficients for an “mlm” object returned by `lm()`

我想針對同一個回歸程序運行10次回歸,然后在不使用循環的情況下提取所有標准錯誤。

depVars <- as.matrix(data[,1:10]) # multiple dependent variables
regressor <- as.matrix([,11]) # independent variable
allModels <- lm(depVars ~ regressor) # multiple, single variable regressions

summary(allModels)[1] # Can "view" the standard error for 1st regression, but can't extract...

allModels存儲為“mlm”對象,這很難處理。 如果我可以存儲lm對象列表或具有感興趣統計信息的矩陣,那就太棒了。

同樣,目標是不使用循環。 這是一個等效的循環:

regressor <- as.matrix([,11]) # independent variable
for(i in 1:10) { 
  tempObject <- lm(data[,i] ~ regressor) # single regressions
  table1Data[i,1] <- summary(tempObject)$coefficients[2,2] # assign std error
  rm(tempObject)
  }

如果你以長格式存儲數據,使用nlme或lme4包中的lmList很容易得到一堆回歸結果。 輸出是回歸結果列表,摘要可以為您提供系數矩陣,就像您想要的那樣。

library(lme4)

m <- lmList( y ~ x | group, data = dat)
summary(m)$coefficients

這些系數是一個簡單的三維數組,因此標准誤差為[,2,2]

給定“mlm”模型對象model ,您可以使用我編寫的下面函數來獲得系數的標准誤差。 這非常有效: 沒有循環,也無法訪問summary.mlm()

std_mlm <- function (model) {
  Rinv <- with(model$qr, backsolve(qr, diag(rank)))
  ## unscaled standard error
  std_unscaled <- sqrt(rowSums(Rinv ^ 2)[order(model$qr$pivot)])
  ## residual standard error
  sigma <- sqrt(colSums(model$residuals ^ 2) / model$df.residual)
  ## return final standard error
  ## each column corresponds to a model
  "dimnames<-"(outer(std_unscaled, sigma), list = dimnames(model$coefficients))
  }

一個簡單,可重復的例子

set.seed(0)
Y <- matrix(rnorm(50 * 5), 50)    ## assume there are 5 responses
X <- rnorm(50)    ## covariate

fit <- lm(Y ~ X)

我們都知道通過以下方法提取估計系數很簡單:

fit$coefficients    ## or `coef(fit)`
#                   [,1]       [,2]        [,3]        [,4]        [,5]
#(Intercept) -0.21013925  0.1162145  0.04470235  0.08785647  0.02146662
#X            0.04110489 -0.1954611 -0.07979964 -0.02325163 -0.17854525

現在讓我們應用我們的std_mlm

std_mlm(fit)
#                 [,1]      [,2]      [,3]      [,4]      [,5]
#(Intercept) 0.1297150 0.1400600 0.1558927 0.1456127 0.1186233
#X           0.1259283 0.1359712 0.1513418 0.1413618 0.1151603

我們當然可以調用summary.mlm來檢查我們的結果是否正確:

coef(summary(fit))
#Response Y1 :
#               Estimate Std. Error    t value  Pr(>|t|)
#(Intercept) -0.21013925  0.1297150 -1.6200072 0.1117830
#X            0.04110489  0.1259283  0.3264151 0.7455293
#
#Response Y2 :
#              Estimate Std. Error    t value  Pr(>|t|)
#(Intercept)  0.1162145  0.1400600  0.8297485 0.4107887
#X           -0.1954611  0.1359712 -1.4375183 0.1570583
#
#Response Y3 :
#               Estimate Std. Error    t value  Pr(>|t|)
#(Intercept)  0.04470235  0.1558927  0.2867508 0.7755373
#X           -0.07979964  0.1513418 -0.5272811 0.6004272
#
#Response Y4 :
#               Estimate Std. Error    t value  Pr(>|t|)
#(Intercept)  0.08785647  0.1456127  0.6033574 0.5491116
#X           -0.02325163  0.1413618 -0.1644831 0.8700415
#
#Response Y5 :
#               Estimate Std. Error    t value  Pr(>|t|)
#(Intercept)  0.02146662  0.1186233  0.1809646 0.8571573
#X           -0.17854525  0.1151603 -1.5504057 0.1276132

是的,一切都正確!

這里有一個選項:

  1. 使用regressor作為id密鑰將數據設置為長格式。
  2. 通過變量組對值進行回歸。

例如,使用mtcars數據集:

library(reshape2)
dat.m <- melt(mtcars,id.vars='mpg')  ## mpg is my regressor
library(plyr)
ddply(dat.m,.(variable),function(x)coef(lm(variable~value,data=x)))
  variable (Intercept)         value
1       cyl           1  8.336774e-18
2      disp           1  6.529223e-19
3        hp           1  1.106781e-18
4      drat           1 -1.505237e-16
5        wt           1  8.846955e-17
6      qsec           1  6.167713e-17
7        vs           1  2.442366e-16
8        am           1 -3.381738e-16
9      gear           1 -8.141220e-17
10     carb           1 -6.455094e-17

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM