Pertimbangkan kode R berikut:
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)
Melihat http://svn.r-project.org/R/trunk/src/appl/dqrls.f ) tidak membantu saya memahami apa yang sedang terjadi, karena saya tidak tahu Fortran. Dalam pertanyaan lain dijawab bahwa kesalahan toleransi mesin floating point yang harus disalahkan untuk koefisien untuk X yang dekat, tetapi tidak cukup 0.
lebih besar ketika nilailebih dekat ke 0. Tapi ...coef(example(n))["X"]
- Mengapa ada nilai sama sekali?
- Apa (secara spesifik) yang menentukannya?
- Mengapa perkembangan
NaN
hasil yang tampaknya tertib ? - Mengapa pelanggaran perkembangan itu?
- Apa ini perilaku 'yang diharapkan'?
r
regression
russellpierce
sumber
sumber
Y <- rep(1,n)+runif(n)*ynoise
), itu akan menarik :-)apply(as.matrix(2:17), 1, function(n){example(n)$coefficients[-1]})
,. (Hasil saya, pada Win 7 x64 Xeon, berkisar dari -8e-17 hingga + 3e-16; sekitar setengahnya adalah nol.) BTW, sumber Fortran tidak membantu: itu hanya pembungkus untuk dqrdc; itulah kode yang ingin Anda lihat.Jawaban:
Seperti yang dikatakan Ben Bolker, jawaban untuk pertanyaan ini dapat ditemukan dalam kode untuk
summary.lm()
.Inilah tajuknya:
Jadi, mari
x <- 1:1000; y <- rep(1,1000); z <- lm(y ~ x)
dan lihat ekstrak yang sedikit dimodifikasi ini:Untuk menjawab pertanyaan dengan pertanyaan: apa yang kita dapat dari ini? :)
mss
rss
mss
rss
0/0
NaN
2^(1:k)
Pembaruan 1: Berikut ini adalah utas bagus dari R-help yang membahas beberapa alasan mengapa peringatan yang mengalir tidak dibahas dalam R.
Selain itu, T&J SO ini memiliki sejumlah pos menarik dan tautan bermanfaat mengenai underflow, aritmatika presisi lebih tinggi, dll.
sumber
Saya ingin tahu tentang motivasi Anda untuk mengajukan pertanyaan. Saya tidak dapat memikirkan alasan praktis mengapa perilaku ini penting; keingintahuan intelektual adalah alternatif (dan IMO jauh lebih masuk akal) alasan. Saya pikir Anda tidak perlu memahami FORTRAN untuk menjawab pertanyaan ini, tetapi saya pikir Anda perlu tahu tentang dekomposisi QR dan penggunaannya dalam regresi linier. Jika Anda memperlakukan
dqrls
sebagai kotak hitam yang menghitung dekomposisi QR dan mengembalikan berbagai informasi tentangnya, maka Anda mungkin dapat melacak langkah-langkah ... atau langsung sajasummary.lm
menelusuri dan menelusuri untuk melihat bagaimana R ^ 2 dihitung. Khususnya:Maka Anda harus kembali ke
lm.fit
dan melihat bahwa nilai-nilai yang dipasang dihitung sebagair1 <- y - z$residuals
(yaitu sebagai respons dikurangi residu). Sekarang Anda bisa mencari tahu apa yang menentukan nilai residu dan apakah nilai minus rata-ratanya adalah nol atau tidak, dan dari sana mencari tahu hasil komputasi ...sumber
mss
rss
sumber