首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >滚动Z评分在R中的计算误差

滚动Z评分在R中的计算误差
EN

Stack Overflow用户
提问于 2022-11-09 10:41:24
回答 1查看 22关注 0票数 0

我在R中有以下数据,我试图通过使用rollify创建一个函数来计算5天滚动Z分数(X减去滚动平均值,除以滚动标准差)。

代码语言:javascript
复制
library(tibbletime)
library(tidyverse)

rolling_Z <- rollify(~((.x - mean(.x))/sd(.x)), window = 5)

data <- structure(list(Date = structure(c(19282, 19283, 19284, 19285, 
19286, 19289, 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`))

但是,我得到了以下错误。我猜是因为US 10 Year的长度与滚动平均值和滚动标准差的长度不一样,就像前四天一样,安娜。有没有办法解决这个问题?

代码语言:javascript
复制
Error in `mutate()`:
! Problem while computing `Z_Score = rolling_Z(`US 10 Year`)`.
x `Z_Score` must be size 16 or 1, not 64.
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-11-09 10:52:44

所以我不知道tibbletime是如何工作的,但是您可以使用zoo包,它有多个roll函数。

您没有指定您需要的是前滚还是两边的滚动,所以在本例中,我使用了rollapplyr()

动物园roll()函数家族中有一些参数允许您指定如何滚动,是否应该允许部分,等等,您可以更改这些参数以满足您的需要。

代码语言:javascript
复制
library(tidyverse)
library(zoo)

data %>% 
  mutate(mean = rollapplyr(`US 10 Year`, 5, mean, partial = T),
         sd = rollapplyr(`US 10 Year`, 5, sd, partial = T)) %>% 
  mutate(rolling_Z = (`US 10 Year` - mean) / sd)

output ---------

   Date       `US 10 Year`  mean      sd rolling_Z
   <date>            <dbl> <dbl>   <dbl>     <dbl>
 1 2022-10-17         3.82  3.82 NA         NA    
 2 2022-10-18         3.88  3.85  0.0403     0.707
 3 2022-10-19         3.88  3.86  0.0329     0.577
 4 2022-10-20         3.95  3.88  0.0503     1.27 
 5 2022-10-21         3.94  3.90  0.0511     0.936
 6 2022-10-24         4.02  3.93  0.0568     1.48 
 7 2022-10-25         4.01  3.96  0.0560     0.896
 8 2022-10-26         4.01  3.98  0.0368     0.598
 9 2022-10-27         4.13  4.02  0.0692     1.61 
10 2022-10-28         4.23  4.08  0.0986     1.51 
11 2022-10-31         4.22  4.12  0.107      0.911
12 2022-11-01         4.24  4.17  0.0981     0.778
13 2022-11-02         4.10  4.18  0.0625    -1.32 
14 2022-11-03         4.00  4.16  0.103     -1.51 
15 2022-11-04         3.92  4.10  0.138     -1.29 
16 2022-11-07         4.00  4.05  0.124     -0.442

如果你想把它变成一个函数,你也可以这样做。

代码语言:javascript
复制
roll_z <- function(data, x) {
  
  data %>% 
    mutate(mean = rollapplyr(x, 5, mean, partial = T),
           sd = rollapplyr(x, 5, sd, partial = T)) %>% 
    mutate(rolling_Z = (x - mean) / sd) %>% 
    pull(rolling_Z)
  
  
}

data$rolling_Z <- roll_z(data, data$`US 10 Year`)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74373528

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档