2015-09-24 37 views
4

使用R 3.2.2,我發現了一種運行簡單線性插值的怪異行爲。第一數據幀給出正確的結果:R中的線性插值(lm),奇怪的行爲

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 

通過遞增dt變量,現在係數爲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 

這似乎表明dtintercept之間的線性依賴關係。

有關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 

默認tollm.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。幀(dt = c(36996616,36996620,36996623,36996626),值= c(4655145,2,-51434,215))。在這種情況下,x和y的相關性較小但相同的NA問題。 – 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

功能biglmbiglm似乎直接管理本:

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