Exposera probablement le fait que je suis un nouvel utilisateur de R, mais sous SPSS, les décalages sont très faciles. Évidemment c'est une erreur de l'utilisateur, mais qu'est-ce qui me manque?
x <- sample(c(1:9), 10, replace = T)
y <- lag(x, 1)
ds <- cbind(x, y)
ds
Résulte en:
x y
[1,] 4 4
[2,] 6 6
[3,] 3 3
[4,] 4 4
[5,] 3 3
[6,] 5 5
[7,] 8 8
[8,] 9 9
[9,] 3 3
[10,] 7 7
Je pensais que je verrais:
x y
[1,] 4
[2,] 6 4
[3,] 3 6
[4,] 4 3
[5,] 3 4
[6,] 5 3
[7,] 8 5
[8,] 9 8
[9,] 3 9
[10,] 7 3
Toute orientation sera très appréciée.
Une autre façon de résoudre ce problème consiste à utiliser le paquet Zoo, qui a une méthode de décalage qui compense le résultat avec NA:
require(Zoo)
> set.seed(123)
> x <- Zoo(sample(c(1:9), 10, replace = T))
> y <- lag(x, -1, na.pad = TRUE)
> cbind(x, y)
x y
1 3 NA
2 8 3
3 4 8
4 8 4
5 9 8
6 1 9
7 5 1
8 9 5
9 5 9
10 5 5
Le résultat est un objet Zoo multivarié (qui est une matrice améliorée), mais facilement converti en data.frame via
> data.frame(cbind(x, y))
J'ai eu le même problème, mais je ne voulais pas utiliser Zoo ou xts, alors j'ai écrit une simple fonction lag pour les cadres de données :
lagpad <- function(x, k) {
if (k>0) {
return (c(rep(NA, k), x)[1 : length(x)] );
}
else {
return (c(x[(-k+1) : length(x)], rep(NA, -k)));
}
}
Cela peut retarder ou reculer:
x<-1:3;
(cbind(x, lagpad(x, 1), lagpad(x,-1)))
x
[1,] 1 NA 2
[2,] 2 1 3
[3,] 3 2 NA
lag
ne décale pas les données, il décale seulement la "base de temps". x
n'a pas de "base de temps", donc cbind
ne fonctionne pas comme prévu. Essayez cbind(as.ts(x),lag(x))
et remarquez qu'un "décalage" de 1 décale les périodes avant .
Je suggérerais d’utiliser Zoo
/xts
pour les séries chronologiques. Les vignettes Zoo
sont particulièrement utiles.
lag()
fonctionne avec des séries chronologiques, alors que vous essayez d'utiliser des matrices nues. Cette vieille question suggère d'utiliser plutôt embed
, comme suit:
lagmatrix <- function(x,max.lag) embed(c(rep(NA,max.lag), x), max.lag+1)
par exemple
> x
[1] 8 2 3 9 8 5 6 8 5 8
> lagmatrix(x, 1)
[,1] [,2]
[1,] 8 NA
[2,] 2 8
[3,] 3 2
[4,] 9 3
[5,] 8 9
[6,] 5 8
[7,] 6 5
[8,] 8 6
[9,] 5 8
[10,] 8 5
En utilisant simplement les fonctions R standard, ceci peut être réalisé de manière beaucoup plus simple:
x <- sample(c(1:9), 10, replace = T)
y <- c(NA, head(x, -1))
ds <- cbind(x, y)
ds
Le moyen le plus simple pour moi semble être le suivant:
require(dplyr)
df <- data.frame(x = sample(c(1:9), 10, replace = T))
df <- df %>% mutate(y = lag(x))
Cela devrait s’adapter aux vecteurs ou matrices ainsi qu’aux retards négatifs:
lagpad <- function(x, k=1) {
i<-is.vector(x)
if(is.vector(x)) x<-matrix(x) else x<-matrix(x,nrow(x))
if(k>0) {
x <- rbind(matrix(rep(NA, k*ncol(x)),ncol=ncol(x)), matrix(x[1:(nrow(x)-k),], ncol=ncol(x)))
}
else {
x <- rbind(matrix(x[(-k+1):(nrow(x)),], ncol=ncol(x)),matrix(rep(NA, -k*ncol(x)),ncol=ncol(x)))
}
if(i) x[1:length(x)] else x
}
tmp<-rnorm(10)
tmp2<-c(NA,tmp[1:length(tmp)-1])
tmp
tmp2
Deux options, dans base R
et avec data.table
:
baseShiftBy1 <- function(x) c(NA, x[-length(x)])
baseShiftBy1(x)
[1] NA 3 8 4 8 9 1 5 9 5
data.table::shift(x)
[1] NA 3 8 4 8 9 1 5 9 5
Les données:
set.seed(123)
(x <- sample(c(1:9), 10, replace = T))
[1] 3 8 4 8 9 1 5 9 5 5
un moyen simple de faire la même chose peut être de copier les données dans une nouvelle image frame et de changer le numéro d'index. Assurez-vous que la table d'origine est indexée séquentiellement, sans espace
par exemple.
tempData <- originalData
rownames(tempData) <- 2:(nrow(tempData)+1)
si vous le souhaitez dans le même cadre de données que l'original, utilisez une fonction cbind