Рассмотрим следующий код 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 ) не помог мне понять, что происходит, потому что я не знаю Фортрана. В другом вопросе ответили, что ошибки допусков машин с плавающей запятой были виноваты в коэффициентах для X, которые близки, но не совсем равны 0.
больше, когда значение дляближе к 0. Но ...coef(example(n))["X"]
- Почему значение вообще?
- Что (конкретно) это определяет?
- Почему, казалось бы, упорядоченная прогрессия
NaN
результатов? - Почему нарушения этой прогрессии?
- Что из этого является «ожидаемым» поведением?
r
regression
russellpierce
источник
источник
Y <- rep(1,n)+runif(n)*ynoise
), это было бы интересно :-)apply(as.matrix(2:17), 1, function(n){example(n)$coefficients[-1]})
. (Мои результаты на Win 7 x64 Xeon варьируются от -8e-17 до + 3e-16; около половины - истинные нули.) Кстати, источник на Фортране не поможет: это просто оболочка для dqrdc; это код, который вы хотите посмотреть.Ответы:
Как говорит Бен Болкер, ответ на этот вопрос можно найти в коде для
summary.lm()
.Вот заголовок:
Итак, давайте,
x <- 1:1000; y <- rep(1,1000); z <- lm(y ~ x)
а затем взглянем на этот слегка измененный экстракт:Чтобы ответить на вопрос вопросом: что мы из этого получаем? :)
mss
rss
mss
rss
0/0
NaN
2^(1:k)
Обновление 1: Вот хорошая ветка из R-help, в которой рассматриваются некоторые причины, по которым предупреждения о недостаточном объеме не рассматриваются в R.
Кроме того, в этом разделе «Вопросы и ответы» есть ряд интересных постов и полезных ссылок, касающихся недостаточного значения, арифметики высокой точности и т. Д.
источник
Мне интересно, какая у вас мотивация задать вопрос. Я не могу думать о практической причине, это поведение должно иметь значение; Интеллектуальное любопытство является альтернативой (и IMO гораздо более разумной) причиной. Я думаю, что вам не нужно понимать FORTRAN, чтобы ответить на этот вопрос, но я думаю, что вам нужно знать о QR-разложении и его использовании в линейной регрессии. Если вы воспринимаете себя
dqrls
как черный ящик, который вычисляет QR-разложение и возвращает различную информацию о нем, то вы можете проследить шаги ... или просто пойтиsummary.lm
и проследить, чтобы увидеть, как вычисляется R ^ 2. В частности:Затем вы должны вернуться
lm.fit
и увидеть, что подобранные значения вычисляются какr1 <- y - z$residuals
(т.е. как ответ за вычетом остатков). Теперь вы можете выяснить, что определяет значение невязок, и является ли значение минус среднее значение точно нулевым или нет, и оттуда выяснить результаты вычислений ...источник
mss
rss
источник