Bti*_*rt3 35 r time-series zoo xts
很可能会暴露我是R的新手,但在SPSS中,运行滞后非常容易.显然这是用户错误,但我缺少什么?
x <- sample(c(1:9), 10, replace = T)
y <- lag(x, 1)
ds <- cbind(x, y)
ds
Run Code Online (Sandbox Code Playgroud)
结果是:
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
Run Code Online (Sandbox Code Playgroud)
我想我会看到:
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
Run Code Online (Sandbox Code Playgroud)
任何指导将不胜感激.
Rei*_*son 27
解决这个问题的另一种方法是使用zoo包,它有一个lag方法,用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
Run Code Online (Sandbox Code Playgroud)
结果是一个多变量动物园对象(它是一个增强矩阵),但很容易转换为data.frame via
> data.frame(cbind(x, y))
Run Code Online (Sandbox Code Playgroud)
And*_*rew 26
我有同样的问题,但我不想使用zoo或xts,所以我为数据框写了一个简单的滞后函数:
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)));
}
}
Run Code Online (Sandbox Code Playgroud)
这可能会向前或向后延迟:
x<-1:3;
(cbind(x, lagpad(x, 1), lagpad(x,-1)))
x
[1,] 1 NA 2
[2,] 2 1 3
[3,] 3 2 NA
Run Code Online (Sandbox Code Playgroud)
Jos*_*ich 15
lag
不会移动数据,它只会改变"时基". x
没有"时间基准",所以cbind
不能按预期工作.尝试cbind(as.ts(x),lag(x))
并注意到1的"滞后"会使周期向前移动.
我建议使用zoo
/ xts
用于时间序列.的zoo
小插曲是特别有帮助.
lag()
适用于时间序列,而您正在尝试使用裸矩阵. 这个老问题建议embed
改为使用,如下:
lagmatrix <- function(x,max.lag) embed(c(rep(NA,max.lag), x), max.lag+1)
Run Code Online (Sandbox Code Playgroud)
例如
> 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
Run Code Online (Sandbox Code Playgroud)
现在对我来说最简单的方法如下:
require(dplyr)
df <- data.frame(x = sample(c(1:9), 10, replace = T))
df <- df %>% mutate(y = lag(x))
Run Code Online (Sandbox Code Playgroud)
小智 5
仅使用标准R函数,就可以通过更简单的方式实现:
x <- sample(c(1:9), 10, replace = T)
y <- c(NA, head(x, -1))
ds <- cbind(x, y)
ds
Run Code Online (Sandbox Code Playgroud)