如何修改garch.sim函数的底层分布并解决rnd参数相关报错
garch.sim函数自定义底层分布报错解决方案
错误原因
garch.sim的rnd参数要求传入随机数生成函数对象,而非预先生成的随机数向量。你现有代码中将rnorm(351,sd = 4)返回的数值向量传入该参数,函数运行时会尝试将该向量作为函数调用,因此触发could not find function "rnd"报错。
修正方法
先封装符合要求的自定义随机数生成函数,要求函数第一个参数为需要生成的样本量n,再将函数名直接传入rnd参数即可。
场景1:使用标准差为4的正态分布
# 封装标准差为4的正态分布生成函数 rnorm_sd4 <- function(n) { rnorm(n, mean = 0, sd = 4) } # 调用garch.sim u_garch <- garch.sim(alpha = c(0.01, 0.3), beta = 0.69, n = 251, rnd = rnorm_sd4, ntrans = 100)
场景2:替换为t分布
以自由度为5的t分布为例,可按需调整自由度或新增尺度调整逻辑:
# 自由度为5的t分布生成函数 rt_df5 <- function(n) { rt(n, df = 5) } # 调用 u_garch_t <- garch.sim(alpha = c(0.01, 0.3), beta = 0.69, n = 251, rnd = rt_df5, ntrans = 100)
场景3:替换为卡方分布
卡方分布默认均值不为0,建议先做标准化处理保证扰动项均值为0,以下为自由度为4的标准化卡方分布示例:
# 标准化自由度为4的卡方分布(均值为0,标准差为1,可通过乘法调整整体标准差) rchisq_std_df4 <- function(n) { raw <- rchisq(n, df = 4) (raw - 4) / sqrt(8) } # 调用 u_garch_chisq <- garch.sim(alpha = c(0.01, 0.3), beta = 0.69, n = 251, rnd = rchisq_std_df4, ntrans = 100)
注意事项
- 上述代码适配
tseries包的原生garch.sim函数,如你使用其他包的同名函数,需根据对应文档调整参数逻辑 - 自定义
rnd函数的第一个参数必须为样本量n,garch.sim内部会自动根据所需样本量调用该函数 - 非对称分布(如卡方分布)建议做中心化处理,避免扰动项均值非零导致模拟结果不符合GARCH模型假设
内容的提问来源于stack exchange,提问作者totnan
相关产品推荐
相关产品推荐

