2017-03-14 2 views
1

Einfache Regression von zufälligen Normal-On-Datum schlägt fehl, aber identische Daten mit kleinen ganzen Zahlen anstelle von Daten funktioniert wie erwartet.Lineares Modell singular wegen großer Ganzzahl datetime in R?

# Example dataset with 100 observations at 2 second intervals. 
set.seed(1) 
df <- data.frame(x=as.POSIXct("2017-03-14 09:00:00") + seq(0, 199, 2), 
       y=rnorm(100)) 

#> head(df) 
#      x   y 
# 1 2017-03-14 09:00:00 -0.6264538 
# 2 2017-03-14 09:00:02 0.1836433 
# 3 2017-03-14 09:00:04 -0.8356286 

# Simple regression model. 
m <- lm(y ~ x, data=df) 

Die Steigung aufgrund von Singularitäten in den Daten fehlt. Der Aufruf der Zusammenfassung zeigt dies:

summary(m) 

# Coefficients: (1 not defined because of singularities) 
#    Estimate Std. Error t value Pr(>|t|) 
# (Intercept) 0.10889 0.08982 1.212 0.228 
# x     NA   NA  NA  NA 

dies wegen der POSIXct Klasse sein könnte?

# Convert date variable to integer. 
df$x2 <- as.integer(df$x) 
lm(y ~ x2, data=df) 

# Coefficients: 
# (Intercept)   x2 
#  0.1089   NA 

Nö, Koeffizient für x2 fehlt noch.

Was ist, wenn wir die Nulllinie x2 Null machen?

# Subtract minimum of x. 
df$x3 <- df$x2 - min(df$x2) 
lm(y ~ x3, data=df) 

# Coefficients: 
# (Intercept)   x3 
# 0.1312147 -0.0002255 

Das funktioniert!

Ein weiteres Beispiel, um auszuschließen, dass dies auf die Datetime-Variable zurückzuführen ist.

# Subtract large constant from date (data is now from 1985). 
df$x4 <- df$x - 1000000000 
lm(y ~ x4, data=df) 

# Coefficients: 
# (Intercept)   x4 
# 1.104e+05 -2.255e-04 

Nicht erwartet (warum würde ein identischer Datensatz mit 30 Jahren Unterschied unterschiedliches Verhalten verursachen?), Aber das funktioniert auch.

Könnte sein, dass .Machine$integer.max (2147483647 auf meinem PC) hat etwas damit zu tun, aber ich kann es nicht herausfinden. Es wäre sehr zu begrüßen, wenn jemand erklären könnte, was hier vor sich geht.

+1

Da der Ursprung von POSIXct völlig willkürlich ist, ist es normalerweise ratsam, die Mindestzeit zu subtrahieren. Es erleichtert auch die Interpretation der Koeffizienten. – Roland

Antwort

2

Ja, könnte es. Die QR-Faktorisierung ist stabil, aber nicht allmächtig.

X <- cbind(1, 1e+11 + 1:10000) 
qr(X)$rank 
# 1 

Hier die X ist wie die Modellmatrix für Ihr lineares Regressionsmodell, wo es eine all-1-Säule für abfangen, und es gibt eine Sequenz für Datetime (beachten Sie die große Offset).

Wenn Sie die Datetime-Spalte zentrieren, sind diese beiden Spalten orthogonal daher sehr stabil (auch wenn Sie die normale Gleichung direkt lösen!).

+1

Siehe auch 'qr (X, tol = 1e-16) $ rank' oder' lm.fit (cbind (1, df $ x), df $ y, tol = 1e-16) 'für das Beispiel von OP. – Roland

Verwandte Themen