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.
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