lm이 예측값에 분산이 없을 때 왜 R ^ 2 값이 무엇입니까 (그리고 무엇을 결정하고 있습니까?)?


10

다음 R 코드를 고려하십시오.

example <- function(n) {
    X <- 1:n
    Y <- rep(1,n)
    return(lm(Y~X))
}
#(2.13.0, i386-pc-mingw32)
summary(example(7))    #R^2 = .1963
summary(example(62))   #R^2 = .4529
summary(example(4540)) #R^2 = .7832
summary(example(104))) #R^2 = 0
#I did a search for n 6:10000, the result for R^2 is NaN for
#n = 2, 4, 16, 64, 256, 1024, 2085 (not a typo), 4096, 6175 (not a typo), and 8340 (not a typo)

http://svn.r-project.org/R/trunk/src/appl/dqrls.f )를 보면 Fortran을 모르기 때문에 진행 상황을 이해하는 데 도움이되지 않았습니다. 또 다른 질문 에서 부동 소수점 기계 공차 오류는 0에 가깝지 않지만 X에 가까운 계수에 대한 책임이 있다고 대답했습니다.

아르 자형2의 값 coef(example(n))["X"]이 0에 가까울수록 가 더 큽니다. 그러나 ...

  1. 왜 값이 있습니까? 아르 자형2
  2. 무엇을 결정 하는가?
  3. 겉보기에 질서 정연한 NaN결과가 나타나는 이유는 무엇 입니까?
  4. 왜 그 진행을 위반합니까?
  5. 이 중 '예상'동작은 무엇입니까?

참고 : 7의 R ^ 2는 0.4542이어야하며 더 건설적인 것이 내 대답을 참조하십시오. :-)

1
글쎄, 공정하게 말하면, 사용자는 도구를 사용하기 전에 통계적 방법에 대해 실제로 알고 있어야 합니다 (예 : Excel 사용자와 달리 (좋아요, 저렴한 샷에 대해 죄송합니다)). 오차가 0에 가까워 질 때 R ^ 2가 1에 접근한다는 것이 분명하기 때문에 NaN 값과 함수의 한계를 혼동하는 것보다 더 잘 알고 있습니다. 이제 R ^ 2가 ynoise-> 0으로 분기하는 데 문제가있는 경우 (예 : 위의 Y 문을으로 대체 Y <- rep(1,n)+runif(n)*ynoise) 흥미로운 점이 있습니다 :-)
Carl Witthoft

@ eznme : 결과는 기계마다 다르거 나 적어도 32 또는 64 비트마다 다릅니다. 7에 0.1963을 제공하는 32 비트 시스템이 있지만 64 비트 시스템은 NaN을 제공합니다. 흥미롭게도 64 비트 시스템에서 NaN이 아닌 R ^ 2는 모두 0.5에 매우 가깝습니다. 내가 생각할 때 이해가되지만 처음에는 놀랐습니다.
Aaron은 Stack Overflow를

1
배정 밀도 반올림 오류를 연구하고 있습니다. 계수를 살펴보십시오. 예를 들어, apply(as.matrix(2:17), 1, function(n){example(n)$coefficients[-1]}). (Win 7 x64 Xeon에서 내 결과는 -8e-17에서 + 3e-16까지이며 약 절반은 0입니다.) BTW, Fortran 소스는 도움이되지 않습니다 .dqrdc의 래퍼 일뿐입니다. 그것이 당신이보고자하는 코드입니다.
whuber

1
(계속) 그러나 사용자로서 CV를 선택하는 것이 더 좋은 사이트입니다. 단순한 통계 분석이 개발자가 아닌 사용자의 책임이라는 단순한 이유 때문입니다. 사용자가 RSS의 크기와 관련 하여 잘못된 보게되면 추가로보고하기 전에 자체 사후 처리를 수행해야합니다. 프로그래밍 방식으로, 이러한 수치 문제를 가능한 한 피하는 방법을 알고 싶습니다. 아르 자형2
반복자 22

답변:


6

Ben Bolker가 말했듯이이 질문에 대한 답변은 코드에서 찾을 수 있습니다 summary.lm().

헤더는 다음과 같습니다.

function (object, correlation = FALSE, symbolic.cor = FALSE, 
    ...) 
{

따라서 x <- 1:1000; y <- rep(1,1000); z <- lm(y ~ x)약간 수정 된 추출물을 살펴 보겠습니다.

    p <- z$rank
    rdf <- z$df.residual
    Qr <- stats:::qr.lm(z)
    n <- NROW(Qr$qr)
    r <- z$residuals
    f <- z$fitted.values
    w <- z$weights
    if (is.null(w)) {
        mss <- sum((f - mean(f))^2)
        rss <- sum(r^2)
    }
    ans <- z[c("call", "terms")]
    if (p != attr(z$terms, "intercept")) {
        df.int <- 1L
        ans$r.squared <- mss/(mss + rss)
        ans$adj.r.squared <- 1 - (1 - ans$r.squared) * ((n - 
            df.int)/rdf)
    }

ans $ r.squared는 .0.4998923

질문으로 질문에 대답하기 위해 : 우리는 이것으로부터 무엇을 이끌어 내나요? :)

mssrss아르 자형2mssrss0/0NaN2^(1:k)


업데이트 1 : R에서 언더 플로우 경고가 해결되지 않는 몇 가지 이유를 해결하는 R-help의 멋진 스레드가 있습니다 .

또한 이 SO Q & A 에는 언더 플로우, 고정밀 산술 등에 관한 흥미로운 게시물과 유용한 링크가 많이 있습니다.


8

질문을하게 된 동기가 궁금합니다. 나는 이 행동이 중요한 실제적인 이유를 생각할 수 없다 . 지적 호기심은 대안적인 (그리고 IMO가 훨씬 더 합리적인) 이유입니다. 이 질문에 대답하기 위해 FORTRAN을 이해할 필요는 없지만 QR 분해 및 선형 회귀에서의 사용에 대해 알아야한다고 생각합니다. dqrlsQR 분해를 계산하고 이에 대한 다양한 정보를 리턴하는 블랙 박스로 취급하는 경우 단계를 추적 할 수 있습니다 summary.lm. 특히:

mss <- if (attr(z$terms, "intercept")) 
          sum((f - mean(f))^2)
       else sum(f^2)
rss <- sum(r^2)
## ... stuff ...
ans$r.squared <- mss/(mss + rss)

그런 다음 다시 돌아가서 lm.fit적합치가 r1 <- y - z$residuals(즉, 반응에서 잔차를 뺀 값)으로 계산되는지 확인해야합니다 . 이제 잔차 값을 결정하는 것과 값에서 평균을 뺀 값이 정확히 0인지 여부를 알아낼 수 있으며 거기에서 계산 결과를 알아낼 수 있습니다 ...


지적 호기심은 내 질문에 대한 대부분의 이유입니다. 동료가 그 행동을보고했고 나는 그것을 찌르고 그것을 알아낼 수 있는지 확인하고 싶었습니다. 기술 수준을 넘어서 문제를 추적 한 후에 질문을하기로 결정했습니다. 실제적인 문제로서, 때때로 분석이 배치에 의해 수행되거나 다른 오류가 발생하며,이 행동은 결정적으로 '홀수'한 것처럼 나에게 타격을줍니다.
russellpierce

1
mms 및 rss는 z의 결과이며 summary.lm 내부의 lm 객체 이름입니다. 따라서 대답에는 아마도 QR 분해에 대한 설명, 선형 회귀에서의 사용, 특히 QR 분해가 0 자체가 아닌 대략 0으로 끝나는 이유를 설명하기 위해 R 기본 코드에서 인스턴스화 된 QR 분해에 대한 설명이 필요할 것입니다. .
russellpierce

mssrss아르 자형2아르 자형2

아르 자형2

0

아르 자형2아르 자형2=1SS이자형아르 자형아르 자형SS영형


1
이 행동이 중요한 실제 상황을 줄 수 있습니까?
벤 볼커

3
@Brandon-Iterator가 스마일리를 넣어도 여전히 멍청 해집니다!
Carl Witthoft

2
@eznme 오류는 좋지만 특히 IEEE-754 산술 세계에서 부동 소수점 문제가 발생하는 모든 종류의 장소를 잡기가 매우 어렵습니다. 여기서의 교훈은 R을 사용한 빵과 버터 계산조차도 섬세하게 처리해야한다는 것입니다.
Iterator

2
John Chambers (S의 창시자 중 하나이자 R의 할아버지)는 그의 저작에서 신뢰할 수있는 컴퓨팅을 위한 R의 사용을 강력하게 강조하기 때문에 이러한 고려 사항은 특히 중요 합니다. 예를 들어, Chambers, 데이터 분석 용 소프트웨어 : R을 사용한 프로그래밍 (Springer Verlag 2008) : "데이터 분석을위한 계산 및 소프트웨어는 신뢰할 수 있어야합니다. 주장하는대로 수행해야합니다." [At p. 3.]
whuber

2
문제는 더 좋든 나쁘 든 R 코어가 모든 코너 케이스와 가능한 이상한 사용자 오류를 가로채는 많은 수 많은 검사로 코드를 압축하는 것에 저항력이 있다는 것입니다. (a) 시간이 많이 걸리고, (b) 코드베이스를 훨씬 더 크고 읽기 어렵게합니다 (문자 그대로 수천 개의 특수한 경우가 있기 때문에). 계산이 여러 번 반복되는 상황에서도.
벤 볼커
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.