diff in r的反义词

vshtjzan  于 2023-04-18  发布在  其他
关注(0)|答案(5)|浏览(109)

我有一个问题,我不确定我在这里是完全愚蠢的,还是这是一个真正的问题,或者我误解了这些函数的作用。
diff的反义词和cumsum是一样的吗?我以为是。但是,使用这个例子:

dd <- c(17.32571,17.02498,16.71613,16.40615,
        16.10242,15.78516,15.47813,15.19073,
        14.95551,14.77397)
par(mfrow = c(1,2))
plot(dd)
plot(cumsum(diff(dd)))

> dd
 [1] 17.32571 17.02498 16.71613 16.40615 16.10242 15.78516 15.47813 15.19073 14.95551
[10] 14.77397
> cumsum(diff(dd))
[1] -0.30073 -0.60958 -0.91956 -1.22329 -1.54055 -1.84758 -2.13498 -2.37020 -2.55174

这不一样我哪里做错了
啊!星期五。
很明显

xeufq47z

xeufq47z1#

功能有很大的不同:diff(x)返回长度为(length(x)-1)的向量,该向量包含向量x中一个元素与下一个元素之间的差,而cumsum(x)返回长度等于x的向量,该向量包含x中元素的和
示例:

x <- c(1:10)
#[1]  1  2  3  4  5  6  7  8  9 10
> diff(x)
#[1] 1 1 1 1 1 1 1 1 1
v <- cumsum(x)
> v
#[1]  1  3  6 10 15 21 28 36 45 55

函数cumsum()是累积和,因此它返回的向量v[i]的条目是xx[1]x[i]之间所有元素的结果。相比之下,diff(x)只取一个元素x[i]和下一个元素x[i+1]之间的差。
cumsumdiff的组合会导致不同的结果,具体取决于函数的执行顺序:

> cumsum(diff(x))
# 1 2 3 4 5 6 7 8 9

这里的结果是九个“1”的序列的累积和。注意,如果将该结果与原始向量x进行比较,则最后一个条目10丢失。
另一方面,通过计算

> diff(cumsum(x))
# 2  3  4  5  6  7  8  9 10

获得一个矢量,该矢量再次类似于原始矢量x,但是现在第一个条目1丢失。
在任何情况下,原始矢量都不会被恢复,因此不能说cumsum()diff()的相反或反函数

qoefvg9y

qoefvg9y2#

你忘了考虑第一个因素的影响
dd == c(dd1,dd1 + cumsum(diff(dd)))

6ovsh4lw

6ovsh4lw3#

@RHertel很好地回答了这个问题,指出diff()返回一个带有length(x)-1的向量。
因此,另一个简单的解决方法是将0添加到原始向量的开头,以便diff()计算x[1]0之间的差值。

> x <- 5:10

> x
#[1]  5  6  7  8  9 10

> diff(x)
#[1] 1 1 1 1 1

> diff(c(0,x))
#[1] 5 1 1 1 1 1

这样,可以使用diff()c()作为cumsum()的逆表示

> cumsum(diff(c(0,x)))
#[1]  1  2  3  4  5  6  7  8  9 10

> diff(c(0,cumsum(x)))
#[1]  1  2  3  4  5  6  7  8  9 10
jhkqcmku

jhkqcmku4#

如果你知道“滞后”和“差异”的价值。

x<-5:10
y<-diff(x,lag=1,difference=1)    
z<-diffinv(y,lag=1,differences = 1,xi=5) #xi is first value.
k<-as.data.frame(cbind(x,z))
k
   x  z
1  5  5
2  6  6
3  7  7
4  8  8
5  9  9
6 10 10
ctrmrzij

ctrmrzij5#

Cumsum不是diff的反义词。diff的反义词是离散积分(diff的逆)。它与cumsum有一点点不同:函数如下:diffinv(x)
让我们用你的数据做一个例子:

dd <- c(17.32571,17.02498,16.71613,16.40615,
        16.10242,15.78516,15.47813,15.19073,
        14.95551,14.77397)
> diffinv(dd)
 [1]   0.00000  17.32571  34.35069  51.06682  67.47297  83.57539  99.36055 114.83868 130.02941 144.98492 159.75889
> cumsum(dd)
 [1]  17.32571  34.35069  51.06682  67.47297  83.57539  99.36055 114.83868 130.02941 144.98492 159.75889

结果向量几乎相同,但diffinv()结果从0开始。
如果我运行你的脚本,并将简单的 dd 调用与 cumsum(diff(dd))diffinv(diff(dd)) result进行比较,它们是非常不同的。

> dd
 [1] 17.32571 17.02498 16.71613 16.40615 16.10242 15.78516 15.47813 15.19073 14.95551 14.77397
> cumsum(diff(dd))
[1] -0.30073 -0.60958 -0.91956 -1.22329 -1.54055 -1.84758 -2.13498 -2.37020 -2.55174
> diffinv(diff(dd))
 [1]  0.00000 -0.30073 -0.60958 -0.91956 -1.22329 -1.54055 -1.84758 -2.13498 -2.37020 -2.55174

但是如果你**像这样颠倒函数的顺序,你会得到一个结果,这个结果与(假设)预期的结果相似:

> dd
 [1] 17.32571 17.02498 16.71613 16.40615 16.10242 15.78516 15.47813 15.19073 14.95551 14.77397
> diff(diffinv(dd))
 [1] 17.32571 17.02498 16.71613 16.40615 16.10242 15.78516 15.47813 15.19073 14.95551 14.77397
> diff(cumsum(dd))
[1] 17.02498 16.71613 16.40615 16.10242 15.78516 15.47813 15.19073 14.95551 14.77397

请注意,在这个例子中,diff(diffinv(dd)) 给出的结果与简单的 dd 调用相同,而不是使用 cumsum() 的函数调用。

相关问题