关于R中lags与window函数应用后结果差异的技术问询
问题原因拆解
先搞懂两个核心逻辑:
- R基础包的
window()是给时间序列(ts类)用的,它按时间戳筛数据,不是按行数; lag()对ts对象的偏移是基于时间轴的,不是简单把数据行挪位置。
1. 为啥window(windowless)的第一行不是windowless第四行?
你注释掉原函数里的window调用后,windowless其实是lag()返回的完整时间序列——它的时间轴和原始序列完全一致,前面k个时间点对应的值是NA(因为滞后了k期)。
比如原始序列是2000年1月开始的月度数据,滞后3期后,windowless的时间点还是从2000-01开始,对应值是NA、NA、NA、2000-01的原始值、2000-02的原始值...
当你对windowless调用window(start=4)时,这里的start=4指的是时间戳为4,不是第4行。如果原始序列的时间起点不是1(比如是2000),那这个时间戳和序列实际时间完全不匹配,R会自动调整匹配到最近的有效时间点,结果自然和windowless的第4行对不上。
要是你不小心把windowless转成了普通向量/数据框(比如用了as.vector()),window()会默认把它转成时间序列,时间起点从1开始,这时候start=4对应向量第4个元素,但原windowless作为ts对象时,第4行对应的是原始序列第4个时间点的值,两者不是一回事。
2. 1304.6哪来的?
这个值就是原始序列里,对应window函数指定起始时间点的滞后值。举个具体例子:
- 原始序列2000-01的取值是1304.6,滞后3期后,这个值会出现在2000-04的时间点上;
- 原函数里的
window调用刚好是筛选从2000-04开始的序列,所以结果第一行就是1304.6; - 你对
windowless调用window时,哪怕参数写错了,R依然按时间戳匹配,最终还是取到了这个时间点对应的值,而非windowless的第4行。
验证代码
跑下面的代码就能实锤:
# 查看windowless的类型和时间轴 class(windowless) start(windowless) end(windowless) # 计算原函数中的目标起始时间点 target_start <- start(original_x) + k # k是你使用的滞后阶数 # 对比window结果与原始序列对应位置的值 window(windowless, start=target_start)[1] original_x[start(original_x)]
如果两者相等,就说明1304.6就是原始序列起始时间的取值,通过滞后+时间筛选出现在结果里。
内容的提问来源于stack exchange,提问作者whdaffer
相关产品推荐
相关产品推荐

