R语言面板数据中rollapply计算滚动特质偏度结果异常求助
问题原因及解决方案
问题根源
你的代码存在两个核心问题,导致滚动计算结果为常数:
- rollapply参数传递错误:调用
rollapply时,你直接传入了x=returns, y=market_returns,这会把整个分组后的基金收益、市场收益列传递给getIskewness,而非当前滚动窗口内的子集数据。相当于每个窗口都用全量数据计算偏度,结果自然是固定值。 - 自定义函数参数设计不合理:
getIskewness的参数没有对应rollapply传递的窗口数据,无法正确提取每个窗口内的样本。
另外注意:skewness()函数属于moments包,你的代码里没有加载这个包,需要补充导入。
修正后的代码
library(dplyr) library(zoo) library(moments) # 补充加载skewness所在包 set.seed(123) # 生成模拟数据 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) ) # 修正自定义函数:接收窗口数据框作为参数 getIskewness <- function(window_data) { # 从窗口数据中提取所需列 x <- window_data$returns y <- window_data$market_returns # 回归并计算残差偏度 model <- lm(x ~ y + I(y^2)) # 用I()包裹y^2,避免公式解析错误 res <- residuals(model) return(skewness(res, na.rm = TRUE)) } # 滚动计算分组后的特质偏度 kk <- panel_data %>% group_by(fund) %>% arrange(date) %>% mutate(Iskewness = rollapply( .SD, # 传递当前分组的所有列(或指定c(returns, market_returns)) width = 20, FUN = getIskewness, by.column = FALSE, # 按窗口整体传递数据框,而非按列拆分 align = "right", fill = NA )) %>% arrange(fund, date) # 查看结果(以Fund_A为例) head(kk %>% filter(fund == "Fund_A") %>% select(date, Iskewness), 25)
关键改动说明
- 函数参数调整:让
getIskewness直接接收rollapply传递的窗口数据框,从数据框内提取当前窗口的returns和market_returns。 - 公式修正:回归公式中用
I(y^2)明确表示对y的平方项建模,避免lm()将y^2解析为交互项。 - rollapply调用优化:用
.SD传递当前分组的数据集,确保每个窗口只传入对应时间段的样本。
运行修正后的代码,每个基金的Iskewness会随日期滚动变动,符合预期。
内容的提问来源于stack exchange,提问作者Billsyd
相关产品推荐
相关产品推荐

