R中的蒙特卡罗模拟

时间:2014-12-11 18:17:18

标签: r montecarlo

我试图用rho = 0.7的AR(1)模型模拟​​数据(Y)。然后我将使用这些数据在截距上运行Y的回归(通过这样做,参数估计变为Y的平均值),然后测试系数的零假设小于或等于零(替代大于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]
}

我的问题:上面的代码是采用这种模拟的正确方法吗?如果是,如何在HAC测试中获取代码以针对不同的滞后值重复此过程。我希望每次将延迟增加1时运行测试,因此我将对滞后1,2,3,4 ......,50执行50次,每次将2000次模拟测试统计数据存储在矢量与不同的名字。计算每个案例的检验统计量(sig.level = 0,05,使用临界值1.645)的拒绝概率,并根据各种滞后值绘制它们(拒绝概率)。 请帮忙

1 个答案:

答案 0 :(得分:3)

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

通过计算每个模拟样本的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
}

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

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

从你模糊的描述中,我推断出你想要的东西,如

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))

enter image description here

尽管该图仅使用100次模拟创建,但很明显,当扰动项为i.i.d时,选择Newey-West中的滞后并不重要。