studio - superponer graficas en r
Lag básico en el vector R/dataframe (10)
Lo más probable es que exponga que soy nuevo en R, pero en SPSS, los rezagos de ejecución son muy fáciles. Obviamente, este es un error del usuario, pero ¿qué me falta?
x <- sample(c(1:9), 10, replace = T)
y <- lag(x, 1)
ds <- cbind(x, y)
ds
Resultados 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
Pensé que vería:
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
Cualquier orientación será muy apreciada.
Esto debería acomodar vectores o matrices, así como retardos negativos:
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
}
La forma más fácil para mí ahora parece ser la siguiente:
require(dplyr)
df <- data.frame(x = sample(c(1:9), 10, replace = T))
df <- df %>% mutate(y = lag(x))
Otra forma de lidiar con esto es usar el paquete del zoológico, que tiene un método de retraso que rellenará el resultado con 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
El resultado es un objeto zoo multivariable (que es una matriz mejorada), pero se convierte fácilmente en una estructura de data.frame
> data.frame(cbind(x, y))
Solo deshazte del retraso. Cambia tu línea por y para:
y <- c(NA, x[-1])
Tuve el mismo problema, pero no quería usar zoo o xts, así que escribí una función de retardo simple para marcos de datos :
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)));
}
}
Esto puede retrasarse o retroceder:
x<-1:3;
(cbind(x, lagpad(x, 1), lagpad(x,-1)))
x
[1,] 1 NA 2
[2,] 2 1 3
[3,] 3 2 NA
Usando solo las funciones estándar R esto se puede lograr de una manera mucho más simple:
x <- sample(c(1:9), 10, replace = T)
y <- c(NA, head(x, -1))
ds <- cbind(x, y)
ds
una forma simple de hacer lo mismo puede ser copiar los datos a un nuevo marco de datos y cambiar el número de índice. Asegúrese de que la tabla original esté indexada secuencialmente sin espacios vacíos
p.ej
tempData <- originalData
rownames(tempData) <- 2:(nrow(tempData)+1)
si lo quiere en el mismo marco de datos que el original use una función cbind
lag()
funciona con series de tiempo, mientras que usted está tratando de usar matrices desnudas. Esta vieja pregunta sugiere usar embed
, así:
lagmatrix <- function(x,max.lag) embed(c(rep(NA,max.lag), x), max.lag+1)
por ejemplo
> 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
lag
no cambia los datos, solo cambia la "base de tiempo". x
no tiene "base de tiempo", por lo que cbind
no funciona como esperaba. Pruebe cbind(as.ts(x),lag(x))
y observe que un "retraso" de 1 desplaza los períodos hacia adelante .
xts
usar zoo
/ xts
para series temporales. Las viñetas del zoo
son particularmente útiles.
tmp<-rnorm(10)
tmp2<-c(NA,tmp[1:length(tmp)-1])
tmp
tmp2