列sum_last_3包含使用函数zoo::rollsum的列x的最后3个值的和。有没有办法只使用变量sum_last_3来重新创建变量x?
sum_last_3
zoo::rollsum
x
library(dplyr) library(zoo) df <- data.frame(x = c(2,3,5,6,8,1,0,2,3,5,1,9,5,3)) df$sum_last_3 <- rollsum(df$x, k = 3, fill = NA, align = "right")
a64a0gku1#
运算不可逆;然而,如果不是用NA填充结果的前两个元素,我们使用partial=TRUE来获得部分和,那么它就是。下面的rollapplyr行与问题中的rollsum相同,除了我们对前两个元素使用部分和。M是该运算的矩阵表示,我们通过对单位矩阵进行运算而获得。最后,我们反转M并将其乘以df$sum_last_3以恢复原始输入。
partial=TRUE
rollapplyr
rollsum
library(zoo) df <- data.frame(x = c(2,3,5,6,8,1,0,2,3,5,1,9,5,3)) df$sum_last_3 <- rollapplyr(df$x, 3, sum, partial = TRUE) M <- rollapplyr(diag(nrow(df)), 3, sum, partial = TRUE) solve(M, df$sum_last_3) ## [1] 2 3 5 6 8 1 0 2 3 5 1 9 5 3
dba5bblo2#
长话短说,在给定sum_last_3的情况下,您不会得到完全相同的x的解,您可以从矩阵的Angular 来查看它。为了简化,x和y分别是输入和输出
y
x <- df$x y <- na.omit(df$sum_last_3)
并且对于rollsum过程存在矩阵表示m,使得y = m %*% x,其中m可以写为
m
y = m %*% x
> m <- matrix(0, length(x) - 2, length(x)) > m <- replace(m, col(m) - row(m) >= 0 & col(m) - row(m) <= 2, 1) > m [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [1,] 1 1 1 0 0 0 0 0 0 0 0 0 0 [2,] 0 1 1 1 0 0 0 0 0 0 0 0 0 [3,] 0 0 1 1 1 0 0 0 0 0 0 0 0 [4,] 0 0 0 1 1 1 0 0 0 0 0 0 0 [5,] 0 0 0 0 1 1 1 0 0 0 0 0 0 [6,] 0 0 0 0 0 1 1 1 0 0 0 0 0 [7,] 0 0 0 0 0 0 1 1 1 0 0 0 0 [8,] 0 0 0 0 0 0 0 1 1 1 0 0 0 [9,] 0 0 0 0 0 0 0 0 1 1 1 0 0 [10,] 0 0 0 0 0 0 0 0 0 1 1 1 0 [11,] 0 0 0 0 0 0 0 0 0 0 1 1 1 [12,] 0 0 0 0 0 0 0 0 0 0 0 1 1 [,14] [1,] 0 [2,] 0 [3,] 0 [4,] 0 [5,] 0 [6,] 0 [7,] 0 [8,] 0 [9,] 0 [10,] 0 [11,] 0 [12,] 1
我们可以检查一下
> m %*% x - y [,1] [1,] 0 [2,] 0 [3,] 0 [4,] 0 [5,] 0 [6,] 0 [7,] 0 [8,] 0 [9,] 0 [10,] 0 [11,] 0 [12,] 0 attr(,"na.action") [1] 1 2 attr(,"class") [1] "omit"
然而,我们应该知道m是一个奇异矩阵,因此结果y的长度比x短。对于这个线性系统,我们可以用MASS::ginv来求解xhat,但这与x并不完全相同
MASS::ginv
xhat
> (xhat <- MASS::ginv(m) %*% y) [,1] [1,] 1.93846154 [2,] 3.13846154 [3,] 4.92307692 [4,] 5.93846154 [5,] 8.13846154 [6,] 0.92307692 [7,] -0.06153846 [8,] 2.13846154 [9,] 2.92307692 [10,] 4.93846154 [11,] 1.13846154 [12,] 8.92307692 [13,] 4.93846154 [14,] 3.13846154
2条答案
按热度按时间a64a0gku1#
运算不可逆;然而,如果不是用NA填充结果的前两个元素,我们使用
partial=TRUE
来获得部分和,那么它就是。下面的rollapplyr
行与问题中的rollsum
相同,除了我们对前两个元素使用部分和。M是该运算的矩阵表示,我们通过对单位矩阵进行运算而获得。最后,我们反转M并将其乘以df$sum_last_3以恢复原始输入。dba5bblo2#
长话短说,在给定
sum_last_3
的情况下,您不会得到完全相同的x
的解,您可以从矩阵的Angular 来查看它。为了简化,
x
和y
分别是输入和输出并且对于
rollsum
过程存在矩阵表示m
,使得y = m %*% x
,其中m
可以写为我们可以检查一下
然而,我们应该知道
m
是一个奇异矩阵,因此结果y
的长度比x
短。对于这个线性系统,我们可以用MASS::ginv
来求解xhat
,但这与x
并不完全相同