R 中的蒙特卡罗模拟

Kay*_*Kay 1 r montecarlo

我正在尝试模拟来自 rho=0.7 的 AR(1) 模型的数据 (Y)。然后我将使用这些数据在截距上运行 Y 的回归(通过这样做,参数估计值将成为 Y 的平均值),然后测试系数小于或等于 0 的零假设(替代方案大于 0 )使用稳健的标准误差。我想使用不同滞后值的 2000 次重复来运行该假设的蒙特卡罗模拟。目的是显示 Newey West 估计器随着滞后变化的有限样本性能。所以我就是这样开始的

A<-array(0, dim=c(2000,1))
for(i in 1:2000){
  y_new<-arima.sim(model=list(ar=0.7), n=50, mean=0,sd=1)
  reg<-lm(y_new~1)
  ad<-coeftest(reg, alternative="greater", vcov=NeweyWest(reg, lag=1, prewhite=FALSE))
  A[i]<-ad[,3]
}
Run Code Online (Sandbox Code Playgroud)

我的问题:上面的代码是进行这种模拟的正确方法吗?如果是,我怎样才能获得代码来针对 HAC 测试中的不同滞后值重复此过程。我想每次将延迟增加 1 来运行测试,因此我将对延迟 1,2,3,4......,50 执行 50 次,每次将 2000 个模拟测试统计数据存储在具有不同名称的向量。计算每种情况的检验统计量的拒绝概率(sig. level = 0,05,使用临界值 1.645),并将它们(拒绝概率)针对各种滞后值绘制出来。请帮忙

Kha*_*haa 5

因为你没有提到模拟的可能目的,所以很难判断它是否是正确的方法。

通过为每个模拟样本计算 50 个检验统计量,而不是为每个滞后重复模拟 2000 次(即模拟次数为 2000*50),您可以节省大量时间。

更好的模拟格式是

library(AER)
library(dplyr)
lags <- 1:50
nreps <- 2000

sim <- function (){
  ynew <- arima.sim(model = list(ar=0.7), n=50, mean=0, sd=1)
  reg <- lm(ynew ~ 1 )
  s <- rep(NA, 50)
  for(i in lags){    
    ad <- coeftest(reg, alternative="greater", vcov=NeweyWest(reg, lag = i, prewhite=FALSE))
    s[i] <- ad[ ,4]
  }
  s
}
Run Code Online (Sandbox Code Playgroud)

以下代码将模拟结果存储在data.frame

 result <- lapply(1:nreps, function(i)data.frame(simulation = i, lag = lags, pvalues = sim())) %>%
 rbind_all
Run Code Online (Sandbox Code Playgroud)

从你模糊的描述,我推断你想要的看起来像

library(ggplot2)
result %>% 
  group_by(lag) %>% 
  summarize(rejectfreq = mean(pvalues > 0.05)) %>% 
  ggplot(., aes(lag, rejectfreq)) + geom_line()+
  coord_cartesian(ylim = c(0,1)) +
  scale_y_continuous(breaks=seq(0, 1, by=0.1))
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

尽管该图仅使用 100 次模拟创建,但很明显,当扰动项独立同分布时,Newey-West 中滞后的选择并不重要