2014-02-12 47 views
5

我想僅從概要中返回df(自由度)。我通過互聯網搜索,但是我沒有找到任何相關內容。如何僅從r中的迴歸摘要中返回自由度?

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 

有隻返回了DF 例如

  df(fit) or fit$df 
     3 
+0

'適合$ df.residual'? – Justin

+4

使用你的例子,'fit $ df.residual'返回'3' ... FWIW,你可以使用'fit $'+ tab或者'str(fit)'來查看你的擬合物體附着的東西。 – Justin

回答

5

在評論暗示了任何功能,OP提到他們使用lm.fit()而不是lm()因此示例代碼演示如何做到這一點是非常不同的; lm.fit()需要矢量響應和由用戶提供的正確模型矩陣,lm()可以爲您做所有這些。因此的NA在的存在是我們需要考慮的,反正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 

檢查裝配對象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" 

有你」我會注意到df.residual組件。您可能提取物,你會從列表

R> fit$df.residual 
[1] 3 

但任何其他對象,這將是錯過了提取功能df.residual(),這不都是爲你

R> df.residual(fit) 
[1] 3 

約的好處這應該是一個功能作家的照顧,他們可以在他們的包裝中包含一個df.residual()的方法,所以這也適用於他們的類型模型,而您只需要記住一個單一的函數名稱......

+2

@sacvf不知道,'lm.fit()'返回'df.residual()'應該提取的組件'df.residual'。爲什麼你使用'lm.fit()'而不是'lm()',爲什麼你沒有在問題中告訴我們這些? –

+0

@sacvf什麼的矩陣,你的意思是協變量?你可以很容易地將它重新打包爲一個數據框並使用'lm()'。相反,您可以使用'lm.fit()'準備好您的示例,並使用'cbind'將常數項和三個協變量綁定到一個矩陣中。你如何接近這個問題的問題是你問的問題與你的實際問題沒有關係。 –

+0

@sacvf我已經更新了答案以包含一個'lm.fit()',並且相同的方法工作... –

3

正是你在你的問題

y=runif(20) 
x=runif(20) 
lm(y~x)$df 

> lm(y~x)$df 
[1] 18 
+1

對於這種事情,最好使用提取函數'df.residual()'。假設有一種方法存在您希望剩餘DF的對象類。另外,不要依賴部件名稱的部分匹配;它有一天會咬你一口。它應該是'fit $ df.residual' –

+3

使用'$ df'就像這是執行部分匹配並返回正確的答案。但是返回的東西的實際名稱是'df.residual'。 – Justin