2015-09-24 4 views
4

Используя R 3.2.2, я обнаружил странное поведение, выполняющее простую линейную интерполяцию. Первый кадр данных дает правильный результат:Линейная интерполяция (lm) в R, странное поведение

test<-data.frame(dt=c(36996616, 36996620, 36996623, 36996626), value=c(1,2,3,4)) 
lm(value~dt, test)$coefficients 

    (Intercept)   dt 
-1.114966e+07 3.013699e-01 

приращением переменной дт, коэффициент теперь NA:

test$dt<-test$dt+1 
lm(value~dt, test)$coefficients 

(Intercept)   dt 
     2.5   NA 

Любая идея, почему? Кажется, что есть переполнение?

Спасибо!

ответ

5

Редактировать

Я нашел более полную информацию об этой проблеме.

Вы можете получить NA коэффициенты, если прецизионные средства - отлично коррелированные. Это кажется необычным случаем, поскольку у нас есть только один предиктор. Таким образом, в этом случае dt оказывается линейно связанным с перехватом.

Мы можем найти линейно зависимые переменные, используя alias. См https://stats.stackexchange.com/questions/112442/what-are-aliased-coefficients

В первом примере

test<-data.frame(dt=c(36996616, 36996620, 36996623, 36996626), value=c(1,2,3,4)) 
fit1 <- lm(value ~ dt, test) 
alias(fit1) 
Model : 
value ~ dt 

Нет линейно зависимых терминов. Но во втором примере

test$dt <- test$dt + 1 
fit2 <- lm(value ~ dt, test) 
alias(fit2) 
Model : 
value ~ dt 

Complete : 
    [,1]  
dt 147986489/4 

, который появляется, чтобы показать линейно зависимые отношения между dt и intercept.

Дополнительная информация о том, как lm имеет дело с моделью пониженного ранга: https://stat.ethz.ch/pipermail/r-help/2002-February/018512.html.

lm не инвертирует X'X https://stat.ethz.ch/pipermail/r-help/2008-January/152456.html, но я все еще думаю, что ниже полезно показать сингулярность X'X.

x <- matrix(c(rep(1, 4), test$dt), ncol=2) 
y <- test$value 

b <- solve(t(x) %*% x) %*% t(x) %*% y 
Error in solve.default(t(x) %*% x) : 
system is computationally singular: reciprocal condition number = 7.35654e-30 

по умолчанию tol в lm.fit является 1e-7, которая является допуском для вычисления линейных зависимостей в qr разложения.

qr(t(x) %*% x)$rank 
[1] 1 

Если вы уменьшите это, вы получите оценку параметра для dt.

# decrease tol in qr 
qr(t(x) %*% x, tol = 1e-31)$rank 
[1] 2 

# and in lm 
lm(value~dt, test, tol=1e-31)$coefficients 
    (Intercept)   dt 
-1.114966e+07 3.013699e-01 

См https://stats.stackexchange.com/questions/86001/simple-linear-regression-fit-manually-via-matrix-equations-does-not-match-lm-o подробно о матричной алгебре в простой линейной регрессии.

+0

Да, 'biglm' функция от' biglm' пакетов дает тот же ответ. –

+0

Большое спасибо за быстрый ответ, и он действительно хорошо работает с опцией «tol». Дело в том, что я получил ту же проблему с любым набором значений для y, то есть 'test <-data.frame (dt = c (36996616, 36996620, 36996623, 36996626), значение = c (4655145,2, -51434,215)). В этом случае x и y являются менее коррелированными, но одинаковыми. – Yves

+0

Добро пожаловать. Вычислительная сингулярная ошибка, о которой я упоминал в середине, получена из расчетной матрицы 'x', а именно' solve (t (x)% *% x) '. Запустите 'qr (t (x)% *% x) $ rank', и вы получите' 1', что означает особую матрицу. Но если вы запустите 'qr (t (x)% *% x, tol = 1e-31) $ rank', вы получите' 2', что является неособой матрицей. Тем не менее, я могу получить обе оценки параметров с вашими обновленными данными, поэтому я думаю, что проблема связана с высокой корреляцией и матрицей дизайна, которая зависит только от 'dt' – Whitebeard

0

Функция biglm из biglm, кажется, непосредственно управлять этим:

library(biglm) 
test <- data.frame(dt=c(36996616, 36996620, 36996623, 36996626), 
        value=c(1,2,3,4)) 
test$dt <- test$dt+1 

coefficients(biglm(value ~ dt, test)) 
# (Intercept)   dt 
# -1.114966e+07 3.013699e-01 
Смежные вопросы