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)

Fortranを知らないため、http://svn.r-project.org/R/trunk/src/appl/dqrls.fを見ても、何が起こっているのかを理解するのに役立ちませんでした。別の質問では、浮動小数点マシンの許容誤差は、Xの係数に近いが、完全に0ではないためであると回答されました。

は、の値が0に近いほど大きくなります。しかし...R2coef(example(n))["X"]

  1. なぜ値があるのですか? R2
  2. (具体的に)何を決定していますか?
  3. なぜNaN結果が一見整然と進行するのですか?
  4. なぜその進行の違反ですか?
  5. これのうち、「予想される」動作とは何ですか?

注:より建設的なものを見るには、7のR ^ 2は0.4542であるはずです。私の答えを見てください。:-)

1
まあ、公平にするために、ユーザーはツールを使用する前に統計的手法について実際に何かを知っているはずです(たとえば、Excelユーザーとは異なります(安いショットで申し訳ありません))。エラーがゼロに近づくにつれて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に非常に近くなっています。考えれば理にかなっていますが、最初はびっくりしました。
アーロンがスタックオーバーフローを去る

1
あなたは倍精度の丸め誤差を研究しています。係数を見てください。例えば、apply(as.matrix(2:17), 1, function(n){example(n)$coefficients[-1]})。(Win 7 x64 Xeonでの私の結果は、-8e-17から+ 3e-16の範囲です。約半分は真のゼロです。)ところで、Fortranソースは役に立ちません。それはdqrdcの単なるラッパーです。それはあなたが見たいコードです。
whuber

1
R2

回答:


6

ベンボルカーが言うように、この質問に対する答えはのコードにあり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)
    }

0.4998923

質問に答えるために:これから何を引き出しますか?:)

mssrssR2mssrss0/0NaN2^(1:k)


更新1:以下は、Rのアンダーフロー警告がRで対処されない理由のいくつかに対処するRヘルプのすばらしいスレッドです

さらに、このSO Q&Aには、アンダーフロー、より高精度の演算などに関する興味深い投稿と役立つリンクが多数あります。


8

質問をする動機について興味があります。この動作が問題になる実際的な理由は考えられません。知的好奇心はもう1つの理由です(そしてIMOははるかに賢明です)。この質問に答えるためにFORTRANを理解する必要はないと思いますが、QR分解と線形回帰におけるその使用について知っている必要があると思います。dqrlsQR分解を計算し、それに関するさまざまな情報を返すブラックボックスとして扱う場合は、ステップをトレースするか、またはまっすぐにsummary.lmトレースして、R ^ 2がどのように計算されるかを確認できます。特に:

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(つまり、応答から残差を引いたものとして)計算されることを確認する必要があります。これで、残差の値を決定するもの、および値からその平均を引いたものが正確にゼロかどうかを判断し、そこから計算結果を計算できます...


私の質問の主な理由は、知的好奇心です。同僚がその振る舞いを報告したので、私はそれをざっと見て、理解できるかどうかを確認したいと思いました。私は自分のスキルセットを超えて問題を追跡した後、質問をすることにしました。実際的な問題として、分析がバッチで行われる場合や、その他のエラーが発生する場合があり、この動作は明らかに「奇妙」な印象を与えます。
russellpierce

1
mmsとrssはどちらもzの結果です。これは、summary.lm内のlmオブジェクトの名前です。したがって、答えはおそらくQR分解の説明、線形回帰での使用、特にQR分解が0自体ではなく0の近似で終わる理由を説明するために、Rの基礎となるコードでインスタンス化されたQR分解の詳細を必要とします。
russellpierce

mssrssR2R2

R2

0

R2R2=1SSerrSStot


1
この動作が問題になる実際的な状況を教えてください。
Ben Bolker、2012

3
@Brandon-イテレータがそこにスマイリーを入れても、あなたはまだ口笛を吹いています!
Carl Witthoft、2012

2
@eznmeエラーは良好ですが、特にIEEE-754演算の世界では、浮動小数点の問題が発生するあらゆる種類の場所を見つけるのは非常に困難です。ここでの教訓は、Rを使用したパンとバターの計算でさえ、微妙に処理する必要があるということです。
イテレータ2012

2
ジョンチェンバーズ(Sの創始者の1人であり、したがってRの「祖父」)は彼の著述で、信頼できるコンピューティングのためのRの使用を強く強調しているため、これらの考慮事項は特に重要です。 たとえば、Chambers、データ分析用ソフトウェア:Rを使用したプログラミング(Springer Verlag 2008)を参照してください:「データ分析用の計算とソフトウェアは信頼できるはずです。[p。3.]
whuber

2
問題は、良くも悪くも、R-coreはすべてのコーナーケースと起こり得る奇妙なユーザーエラーをインターセプトする多数のチェックでコードをフェストゥーンすることに抵抗していることです(彼らがそれを見ると)-彼らはそれを恐れています(私は思う) (a)膨大な時間がかかり、(b)コードベースが非常に大きく読みにくくなります(これらの特殊なケースは文字通り数千あるため)、(c)常にこのようなチェックを強制することで実行を遅くします計算が何度も繰り返される状況でも。
Ben Bolker、2012
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.