Lm'nin öngörülen değerde bir varyansı olmadığında neden bir R ^ 2 değeri vardır (ve onu belirleyen nedir)?


10

Aşağıdaki R kodunu düşünün:

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 ) adresine bakmak, neler olduğunu anlamama yardımcı olmadı, çünkü Fortran'ı bilmiyorum. Başka bir soruda , kayan nokta makine tolerans hatalarının X için katsayılar için sorumlu olduğu, ancak tam olarak 0 olmadığı yanıtlandı.

değeri için zaman büyüktüryakın 0'a Ama etmektir ...R2coef(example(n))["X"]

  1. Neden hiç değeri var ? R2
  2. Onu (özellikle) belirleyen nedir?
  3. Neden NaNsonuçların görünüşte düzenli ilerlemesi ?
  4. Neden bu ilerlemenin ihlalleri?
  5. Bu 'beklenen' davranış nedir?

Not: 7'nin R ^ 2'si, daha yapıcı bir şey görmek için cevabımı görmek için 0.4542 olmalıdır. :-)

1
Adil olmak gerekirse, kullanıcının araçları kullanmadan önce istatistiksel yöntemler hakkında bir şeyler bilmesi gerekiyor (Excel kullanıcılarının aksine (tamam, ucuz çekim için üzgünüm)). R ^ 2'nin hata sıfıra yaklaşırken 1'e yaklaştığı oldukça açık olduğu için, bir NaN değerini bir fonksiyonun sınırıyla karıştırmaktan daha iyi biliyoruz. Şimdi, R ^ 2'nin ynoise olarak ayrılmasıyla ilgili bir sorun olsaydı -> 0 (diyelim, yukarıdaki Y ifadesini yerine koy Y <- rep(1,n)+runif(n)*ynoise), bu ilginç olurdu :-)
Carl Witthoft

@eznme: Sonuçların makineye veya en az 32 veya 64 bit'e özgü olduğunu düşünüyorum; 7 için 0.1963 veren bir 32 bit makinem var, ancak 64 bit makinem NaN veriyor. İlginçtir, 64 bit makinede, NaN olmayan R ^ 2'lerin hepsi 0,5'e çok yakındır. Bunu düşündüğümde mantıklı, ama ilk başta beni şaşırttı.
Aaron Stack Overflow'dan ayrıldı

1
Çift kesinlikli yuvarlama hatası üzerinde çalışıyorsunuz. Katsayılara bir göz atın; ör apply(as.matrix(2:17), 1, function(n){example(n)$coefficients[-1]}). (Win 7 x64 Xeon'da sonuçlarım -8e-17 ila + 3e-16 arasında değişiyor; yaklaşık yarısı gerçek sıfır.) BTW, Fortran kaynağı hiç yardımcı değil: sadece dqrdc için bir sarıcı; bakmak istediğiniz kod budur.
whuber

1
R2

Yanıtlar:


6

Ben Bolker'in dediği gibi, bu sorunun cevabı kodunda bulunabilir summary.lm().

İşte başlık:

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

Öyleyse, x <- 1:1000; y <- rep(1,1000); z <- lm(y ~ x)biraz değiştirilmiş bu ekstrakta bir göz atalım:

    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

Bir soruyu bir soruyla cevaplamak için: bundan ne çıkarıyoruz? :)

mssrssR2mssrss0/0NaN2^(1:k)


Güncelleme 1: İşte R-yardımından , yetersiz akış uyarılarının R'de ele alınmamasının bazı nedenlerini ele alan güzel bir iş parçacığı.

Buna ek olarak, bu SO Q&A'nın alt akış, daha yüksek hassasiyetli aritmetik vb.


8

Soruyu sorma motivasyonunu merak ediyorum. Bu davranışın önemli olması için pratik bir neden düşünemiyorum ; entelektüel merak alternatif (ve IMO çok daha mantıklı) bir nedendir. Bu soruyu cevaplamak için FORTRAN'ı anlamanız gerekmediğini düşünüyorum, ancak QR ayrışması ve lineer regresyonda kullanımı hakkında bilgi sahibi olmanız gerektiğini düşünüyorum. dqrlsBir QR ayrışmasını hesaplayan ve bununla ilgili çeşitli bilgileri döndüren bir kara kutu gibi davranırsanız , adımları izleyebilir ... veya sadece doğrudan gitmek summary.lmve R ^ 2'nin nasıl hesaplandığını görmek için takip edebilirsiniz. Özellikle:

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)

Daha sonra geri dönüp lm.fittakılan değerlerin r1 <- y - z$residuals(yani eksi kalanlar eksi olarak) olarak hesaplandığını görmeniz gerekir . Artık artıkların değerini neyin belirlediğini ve eksi değerinin ortalamasının tamamen sıfır olup olmadığını anlayabilir ve oradan hesaplama sonuçlarını anlayabilirsiniz ...


Entelektüel merak, sorumun nedeninin çoğunluğu. Bir meslektaşım bu davranışı bildirdi ve etrafta dolaşmak ve çözüp çözemeyeceğimi görmek istedim. Sorunu beceri setimin ötesine geçtikten sonra soruyu sormaya karar verdim. Pratik bir konu olarak, bazen analizler toplu olarak yapılır veya başka hatalar meydana gelir ve bu davranış beni kesinlikle 'garip' olarak vurur.
russellpierce

1
mms ve rss'nin her ikisi de z.'nin sonucudur; bu, özet.lm içindeki lm nesnesinin adıdır. Dolayısıyla, bir cevap muhtemelen QR ayrışmasının bir açıklamasını, doğrusal regresyonda kullanımını ve spesifik olarak QR ayrışmasının neden 0 yerine 0 yerine yaklaşık olarak sonuçlandığını açıklamak için R'nin altındaki kodda örneklendiği gibi bazı ayrıntıları QR ayrışmasını gerektirir. .
russellpierce

mssrssR2R2

R2

0

R2R2=1SSerrSStot


1
Bu davranışın önemli olduğu pratik bir durum verebilir misiniz?
Ben Bolker

3
@Brandon - İteratör suratı oraya koydu ve hala boğuldun!
Carl Witthoft

2
@eznme Bir hata iyi olsa da, özellikle IEEE-754 aritmetiği dünyasında kayan nokta sorunlarının ortaya çıktığı her türlü yeri yakalamak oldukça zordur. Buradaki ders, R ile ekmek ve tereyağı hesaplamalarının bile hassas bir şekilde ele alınması gerektiğidir.
Iterator

2
Bu düşünceler özellikle önemlidir, çünkü yazılarında John Chambers (S'nin yaratıcılarından biri ve bu nedenle R'nin "büyükbabası") R'nin güvenilir hesaplama için kullanımını güçlü bir şekilde vurgular . Örneğin, bkz. Odalar, Veri Analizi için Yazılım: R ile Programlama (Springer Verlag 2008): "veri analizi için hesaplamalar ve yazılım güvenilir olmalıdır: iddia ettikleri şeyi yapmalı ve bunu gördüler." [S. 3.]
whuber

2
Sorun, daha iyi veya daha kötü için, R çekirdeğinin (gördükleri gibi) kodu tüm köşe durumlarını ve olası garip kullanıcı hatalarını engelleyen birçok kontrolle festolamaya karşı dirençli olması - korkuyorlar (sanırım) (a) zamanlarının büyük miktarını alacak, (b) kod tabanını daha büyük ve okunmasını zorlaştıracaktır (kelimenin tam anlamıyla binlerce özel durum olduğu için) ve (c) bu tür kontrolleri her zaman zorlayarak yürütmeyi yavaşlatır hesaplamaların birçok kez tekrarlandığı durumlarda bile.
Ben Bolker
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.