我正在寻找一种方便快捷的方法来构建一个新的列,其中的库存变量取决于之前对新列的观察以及旧列中的值。
所以B列应该是ColumnBt = 0.01 * Bt-1 + ColumnAt
数据看起来应该导致
ColumnA ColumnB
1 1
0 0.01
0 0.0001
4 4.000001
5 5.04000001
0 0.504
在某些时候,能够将因子(0.01)确定为交替结转的变量甚至会很方便。
如何轻松实现这一目标?
非常感谢任何帮助或建议!非常感谢!
答案 0 :(得分:2)
关键是为差分方程建立一个合适的单位响应矩阵
ColumnB[k] = 0.01 * ColumnB[k-1] + ColumnA[k]
:
> z
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] 1e+00 0e+00 0e+00 0e+00 0.00 0
[2,] 1e-02 1e+00 0e+00 0e+00 0.00 0
[3,] 1e-04 1e-02 1e+00 0e+00 0.00 0
[4,] 1e-06 1e-04 1e-02 1e+00 0.00 0
[5,] 1e-08 1e-06 1e-04 1e-02 1.00 0
[6,] 1e-10 1e-08 1e-06 1e-04 0.01 1
然后,通过叠加ColumnB <- z %*% ColumnA
。构建这个矩阵:
lag <- 0.01 ## This is your parameter
r <- lag^(seq_len(length(ColumnA))-1)
m <- matrix(rep(r,length(ColumnA)),nrow=length(ColumnA))
z <- matrix(0,nrow=length(ColumnA),ncol=length(ColumnA))
z[lower.tri(z,diag=TRUE)] <- m[row(m) <= (length(ColumnA)+1-col(m))]
## [,1] [,2] [,3] [,4] [,5] [,6]
##[1,] 1e+00 0e+00 0e+00 0e+00 0.00 0
##[2,] 1e-02 1e+00 0e+00 0e+00 0.00 0
##[3,] 1e-04 1e-02 1e+00 0e+00 0.00 0
##[4,] 1e-06 1e-04 1e-02 1e+00 0.00 0
##[5,] 1e-08 1e-06 1e-04 1e-02 1.00 0
##[6,] 1e-10 1e-08 1e-06 1e-04 0.01 1
我们可以把它放到一个函数中:
constructZ <- function(lag, N) {
r <- lag^(seq_len(N)-1)
m <- matrix(rep(r,N),nrow=N)
z <- matrix(0,nrow=N,ncol=N)
z[lower.tri(z,diag=TRUE)] <- m[row(m) <= (N+1-col(m))]
z
}
然后,
df <- data.frame(ColumnA=c(1,0,0,4,5,0))
df$ColumnB <- constructZ(0.01,nrow(df)) %*% df$ColumnA
print(df)
## ColumnA ColumnB
##1 1 1.000000
##2 0 0.010000
##3 0 0.000100
##4 4 4.000001
##5 5 5.040000
##6 0 0.050400
假设你有数据:
df <- structure(list(ColumnA = c(1L, 0L, 0L, 4L, 5L, 0L, 4L, 0L, 2L
), Indicator = c(1L, 1L, 1L, 2L, 2L, 2L, 3L, 3L, 3L), Time = c(1L,
2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L)), .Names = c("ColumnA", "Indicator",
"Time"), class = "data.frame", row.names = c(NA, -9L))
## ColumnA Indicator Time
##1 1 1 1
##2 0 1 2
##3 0 1 3
##4 4 2 1
##5 5 2 2
##6 0 2 3
##7 4 3 1
##8 0 3 2
##9 2 3 3
您希望为ColumnA
分别计算Time
(对所有Indicator
)所有观察值的响应。然后,您可以使用constructZ
:
df$ColumnB <- unlist(by(df,df$Indicator,function(df) constructZ(0.5,nrow(df)) %*% df$ColumnA))
在这里,我们使用by
分别计算由df
值拆分的数据框Indicator
上提供的函数。与之前滞后参数为constructZ(0.5,nrow(df)) %*% df$ColumnA)
的函数一样,提供的函数只是0.5
。 by
的输出是一个列表,我们unlist
然后设置为df$ColumnB
。结果如预期:
print(df)
## ColumnA Indicator Time ColumnB
##1 1 1 1 1.00
##2 0 1 2 0.50
##3 0 1 3 0.25
##4 4 2 1 4.00
##5 5 2 2 7.00
##6 0 2 3 3.50
##7 4 3 1 4.00
##8 0 3 2 2.00
##9 2 3 3 3.00