2017-03-14 3 views
1

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.

+1

É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

Répondre

2

Oui, il pourrait. La factorisation QR est stable, mais n'est pas Dieu tout-puissant.

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

Ici, le X est comme la matrice de modèle pour votre modèle de régression linéaire, où il y a une colonne tout-1 pour intercepter, et il y a une séquence pour datetime (notez le grand offset).

Si vous centrez la colonne datetime, ces deux colonnes seront orthogonale donc très stable (même si vous résolvez une équation normale directement!).

+1

Voir aussi 'qr (X, tol = 1e-16) $ rank' ou' lm.fit (cbind (1, df $ x), df $ y, tol = 1e-16) 'pour l'exemple d'OP. – Roland