在面板数据集中的不同列上滚动应用函数

问题描述 投票:0回答:1

我正在尝试计算面板数据中不同基金的特殊偏度。基本上,我希望将基金的每日回报率与市场回报率和市场回报率的平方进行回归以获得残差。然后使用 skewness() 计算残差的偏度。但是,我需要在 20 天的移动窗口内执行此计算,每一步向前移动 1 天。我正在考虑编写一个函数并为我的面板数据中的每个基金滚动应用该函数。然而,我并没有得到我预期的结果。以下代码生成模拟数据表。

library(dplyr)
library(zoo)



set.seed(123)

# Generate mock data
n <- 100
date_sequence <- seq(as.Date("2022-01-01"), by = "1 day", length.out = n)
fund_sequence <- rep(c("Fund_A", "Fund_B", "Fund_C"), each = n/3)

panel_data <- data.frame(
fund = rep(fund_sequence, each = n),
date = rep(date_sequence, times = 3),
returns = rnorm(n * 3),
market_returns = rnorm(n * 3)
)

# My own iKewness function


getIskewness<-function(x,y,z){aa<-residuals(lm(x~y+y^2))
aa<-skewness(aa, na.rm = TRUE)
return(aa)}


## run a rolling regression 


kk<-panel_data%>%
group_by(fund)%>%
arrange(date)%>%
mutate(Iskewness=rollapply(across(c(returns,market_returns)), width = 20,
                         FUN=getIskewness,x=returns,y=market_returns,
                         by.column = FALSE, align = "right",fill="NA"))%>%
arrange(fund,date)`

我发现每个基金的结果都是恒定的。我期望的是变量每天都在变化,因为该函数应该在 20 天的移动窗口内滚动应用。有人可以帮助我吗?谢谢!

r panel-data mutate rollapply
1个回答
0
投票

有几个问题:

  • SO 问题应该有最少的可重复示例,所以使用 n<-4 and set width to 3
  • 缺少
  • skewness
    ,因此将其设置为
    mean
    以允许其运行
  • 使用 NA,而不是“NA”
  • rollapply
    可以写成
    rollapplyr
    并在末尾加上 r 以避免
    align="right"
  • 只有一个传递给 FUN 的参数正在滚动,因此创建一个匿名函数来处理该问题,如图所示(或者使用一个参数适当地定义
    getIskewness
  • z
    参数未在
    getIskewness
  • 中使用
  • cbind
     中使用 
    rollapplyr

代码:

set.seed(123)
# Generate mock data
n <- 4
date_sequence <- seq(as.Date("2022-01-01"), by = "1 day", length.out = n)
fund_sequence <- rep(c("Fund_A", "Fund_B", "Fund_C"), each = n/3)
panel_data <- data.frame(fund = rep(fund_sequence, each = n),
  date = rep(date_sequence, times = 3),
  returns = rnorm(n * 3),
  market_returns = rnorm(n * 3)
)
# My own iKewness function

skewness <- mean
getIskewness<-function(x, y) {
  aa <- residuals(lm(x~y+y^2))
  aa <- skewness(aa, na.rm = TRUE)
  return(aa)
}

## run a rolling regression
kk <- panel_data %>%
  group_by(fund) %>%
  arrange(date) %>%
  mutate(Iskewness = rollapplyr(
    cbind(returns, market_returns),
    width = 3,
    FUN = \(X) getIskewness(X[, 1], X[, 2]),
    by.column = FALSE,
    fill = NA)) %>%
  ungroup %>%
  arrange(fund, date)
kk

给予:

# A tibble: 12 × 5
   fund   date       returns market_returns Iskewness
   <chr>  <date>       <dbl>          <dbl>     <dbl>
 1 Fund_A 2022-01-01 -0.560           0.401 NA       
 2 Fund_A 2022-01-02 -0.230           0.111 NA       
 3 Fund_A 2022-01-03  1.56           -0.556  1.62e-17
 4 Fund_A 2022-01-04  0.0705          1.79  -1.11e-16
 5 Fund_B 2022-01-01  0.129           0.498 NA       
 6 Fund_B 2022-01-02  1.72           -1.97  NA       
 7 Fund_B 2022-01-03  0.461           0.701 -2.31e-17
 8 Fund_B 2022-01-04 -1.27           -0.473  0       
 9 Fund_C 2022-01-01 -0.687          -1.07  NA       
10 Fund_C 2022-01-02 -0.446          -0.218 NA       
11 Fund_C 2022-01-03  1.22           -1.03  -2.04e-16
12 Fund_C 2022-01-04  0.360          -0.729  9.25e-18
© www.soinside.com 2019 - 2024. All rights reserved.