La régression simple de la date normale aléatoire échoue, mais les données identiques avec de petits entiers au lieu des dates fonctionnent comme prévu.Modèle linéaire singulier en raison d'un grand nombre d'entiers dans 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)
La pente est manquante en raison des singularités dans les données. Appel du résumé démontre ceci:
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
Serait-ce à cause de la classe POSIXct
?
# Convert date variable to integer.
df$x2 <- as.integer(df$x)
lm(y ~ x2, data=df)
# Coefficients:
# (Intercept) x2
# 0.1089 NA
Non, coefficient pour x2
toujours manquant. Et si nous établissons la référence x2
zéro?
# Subtract minimum of x.
df$x3 <- df$x2 - min(df$x2)
lm(y ~ x3, data=df)
# Coefficients:
# (Intercept) x3
# 0.1312147 -0.0002255
Cela fonctionne!
Un exemple supplémentaire pour exclure que cela soit dû à une variable datetime.
# 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
Non attendu (pourquoi un jeu de données identique avec 30 ans de différence provoquerait un comportement différent?), Mais cela fonctionne également.
Pourrait être que .Machine$integer.max
(2147483647 sur mon PC) a quelque chose à voir avec cela, mais je ne peux pas le comprendre. Il serait grandement apprécié que quelqu'un puisse expliquer ce qui se passe ici.
Étant donné que l'origine de POSIXct est complètement arbitraire, la soustraction de la durée minimale est généralement recommandée. Cela rend également l'interprétation des coefficients un peu plus facile. – Roland