如何仅从r中的回归摘要中返回自由度?

sac*_*cvf 5 r linear-regression

我想只返回摘要中的df(自由度).我通过互联网搜索但我没有找到任何东西.

    y=c(2,13,0.4,5,8,10,13)
    y1=c(2,13,0.004,5,8,1,13)
    y2=c(2,3,0.004,15,8,10,1)
    y3=c(2,2,2,2,2,2,NA)
    fit=lm(y~y1+y2+y3)
    summary(fit)
     Call:
 lm(formula = y ~ y1 + y2 + y3)

 Residuals:
  1       2       3       4       5       6 
-1.5573  1.6523 -1.3718 -3.2909 -0.9247  5.4924 

 Coefficients: (1 not defined because of singularities)
        Estimate Std. Error t value Pr(>|t|)
 (Intercept)   1.7682     3.0784   0.574    0.606
y1            0.6896     0.3649   1.890    0.155 
 y2            0.2050     0.3184   0.644    0.566
 y3                NA         NA      NA       NA

  Residual standard error: 4.037 on 3 degrees of freedom
   (1 observation deleted due to missingness)
 Multiple R-squared:   0.58,    Adjusted R-squared:    0.3 
  F-statistic: 2.071 on 2 and 3 DF,  p-value: 0.2722
Run Code Online (Sandbox Code Playgroud)

是否有任何函数只返回df示例

         df(fit) or fit$df
         3
Run Code Online (Sandbox Code Playgroud)

Rei*_*son 6

在评论中,OP提到他们正在使用lm.fit()没有lm()因此示例代码来演示如何做到这一点是完全不同的; lm.fit()需要矢量响应和用户提供的正确模型矩阵lm(),为您完成所有这些.因此,存在NAin x3是一个我们需要考虑的问题,无论如何,也df.residual()适用于那个例子:

Xy <- cbind(y  = c(2,13,0.4,5,8,10,13),
           x0 = rep(1, 7),
           x1 = c(2,13,0.004,5,8,1,13),
           x2 = c(2,3,0.004,15,8,10,1),
           x3 = c(2,2,2,2,2,2,NA))
Xy <- Xy[complete.cases(Xy), ]
X <- Xy[, -1]
y <- Xy[,  1]

fit <- lm.fit(X, y)

R> df.residual(fit)
[1] 3
Run Code Online (Sandbox Code Playgroud)

检查安装的物体 fit

Xy <- data.frame(y = c(2,13,0.4,5,8,10,13),
                 x1 = c(2,13,0.004,5,8,1,13),
                 x2 = c(2,3,0.004,15,8,10,1),
                 x3 = c(2,2,2,2,2,2,NA))
fit <- lm(y ~ x1 + x2 + x3, data = Xy)

str(fit, max = 1)

R> str(fit, max = 1)
List of 13
 $ coefficients : Named num [1:4] 1.768 0.69 0.205 NA
  ..- attr(*, "names")= chr [1:4] "(Intercept)" "x1" "x2" "x3"
 $ residuals    : Named num [1:6] -1.557 1.652 -1.372 -3.291 -0.925 ...
  ..- attr(*, "names")= chr [1:6] "1" "2" "3" "4" ...
 $ effects      : Named num [1:6] -15.68 -7.79 2.6 -3.22 -0.98 ...
  ..- attr(*, "names")= chr [1:6] "(Intercept)" "x1" "x2" "" ...
 $ rank         : int 3
 $ fitted.values: Named num [1:6] 3.56 11.35 1.77 8.29 8.92 ...
  ..- attr(*, "names")= chr [1:6] "1" "2" "3" "4" ...
 $ assign       : int [1:4] 0 1 2 3
 $ qr           :List of 5
  ..- attr(*, "class")= chr "qr"
 $ df.residual  : int 3
 $ na.action    :Class 'omit'  Named int 7
  .. ..- attr(*, "names")= chr "7"
 $ xlevels      : Named list()
 $ call         : language lm(formula = y ~ x1 + x2 + x3, data = Xy)
 $ terms        :Classes 'terms', 'formula' length 3 y ~ x1 + x2 + x3
     .... <removed>
 $ model        :'data.frame':  6 obs. of  4 variables:
     .... <removed>
 - attr(*, "class")= chr "lm"
Run Code Online (Sandbox Code Playgroud)

在那里你会注意到这个df.residual组件.您可以像从列表中的任何其他对象一样提取

R> fit$df.residual
[1] 3
Run Code Online (Sandbox Code Playgroud)

但那会错过提取器功能df.residual(),它会为你完成所有功能

R> df.residual(fit)
[1] 3
Run Code Online (Sandbox Code Playgroud)

关于这一点的好处是,如果一个函数作者关心,他们可以df.residual()在他们的包中包含一个方法,所以这也适用于他们的类模型,而你只需要记住一个函数名...

  • @sacvf不知道,`lm.fit()`返回`df.residual()`应该提取的组件`df.residual`.你为什么使用`lm.fit()`而不是`lm()`,为什么不在问题中告诉我们这个? (2认同)