You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用R中rollify计算滚动Z分数时遇错误,求解决方法

问题原因

你遇到的长度不匹配错误,核心原因是rollify默认会返回滚动窗口内所有值的Z分数。比如第5行对应的窗口是前5个数据,函数会输出这5个值各自的Z分数;后续每一行都会输出对应窗口的5个结果,累计下来总长度就变成了64,和原数据的16行无法匹配,因此报错。

解决办法

方法1:修改rollify自定义函数,只返回当前行的Z分数

调整函数逻辑,让每个滚动窗口仅输出窗口最后一个值(即当前行对应的数据)的Z分数,前4行因窗口不完整自动返回NA:

library(tibbletime)
library(tidyverse)

# 修改函数,仅取窗口最后一个值的Z分数
rolling_Z <- rollify(~((.x - mean(.x))/sd(.x))[length(.x)], window = 5)

data <- structure(list(Date = structure(c(19282, 19283, 19284, 19285, 
19286, 19290, 19291, 19292, 19293, 19296, 19297, 19298, 19299, 
19300, 19303), class = "Date"), `US 10 Year` = c(3.824, 
3.881, 3.881, 3.947, 3.943, 4.018, 4.01, 4.007, 4.134, 4.228, 
4.217, 4.242, 4.102, 4.003, 3.919, 3.998)), row.names = c(NA, 
-16L), class = c("tbl_df", "tbl", "data.frame"))

data %>% 
  mutate(Z_Score = rolling_Z(`US 10 Year`))

方法2:使用slider包(更推荐的滚动计算工具)

tibbletime的维护已经放缓,tidyverse生态下更推荐用slider包做滚动计算,语法更直观,不易出现长度问题:

library(slider)
library(tidyverse)

data %>%
  mutate(Z_Score = slide_dbl(
    `US 10 Year`, 
    ~(.x[length(.x)] - mean(.x))/sd(.x),
    .before = 4,  # 窗口包含当前行+前4行,共5个数据
    .complete = TRUE  # 仅当窗口完整时计算,不完整的行返回NA
  ))

内容的提问来源于stack exchange,提问作者Tanga94

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 00:35:26