2012-02-27 129 views
1

我正在研究R项目。数据存储在每个9列的3个动物园对象中。我想对每列进行格兰杰检验,并将结果(Pr(> F)值)存储在3个矩阵9x9中。Granger-循环测试

我尝试使用for()循环,并有以下问题

for(i in 1:ncol(dfvola.pre)) { 
    grangertest(order=4, 
     dfvola.pre[,2], 
     dfvola.pre[,i])$'Pr(>F)'[2] 
} 

产生错误Error in solve(vc[ovar, ovar]) : subscript out of bounds

同时

grangertest(order=4, dfvola.pre[,2], 
      dfvola.pre[,3])$'Pr(>F)'[2] 

正常工作,即我可以存储镨(> F)在变量或矩阵单元格中。但要制作3个矩阵9x9,我必须写81 * 3行代码,并且我想知道R中是否有更优雅的解决方案。 我是R新手,感觉可能应该有一个,甚至更优雅嵌套循环:)

以防万一,这是我的数据(动物园对象):

head(dfvola.pre) 
        CH   HK   SI   RU   EN 
2002-02-08 -0.04105356 -0.021797675 -0.03411227 -0.06821175 -0.1728407 
2002-02-11 -0.07383230 -0.034095749 -0.05364423 -0.12425684 -0.1656535 
2002-02-12 -0.09345455 0.011086639 -0.06846780 -0.14499508 -0.0169436 
2002-02-13 -0.09492381 0.009393133 -0.08113240 -0.13592678 2.4487733 
2002-02-14 -0.08875820 0.026173698 -0.08273877 -0.07034832 0.4948738 
2002-02-15 -0.07895699 -0.041345747 -0.07501171 -0.01333353 0.2248262 
        US   GR   FR   JP 
2002-02-08 0.015261541 -0.02886118 -0.-0.03934752 
2002-02-11 -0.102323758 -0.11697662 -0.12982389 -0.08438561 
2002-02-12 0.001706797 -0.11818056 -0.14477277 -0.09312417 
2002-02-13 -0.085467795 -0.10278221 -0.07810301 -0.11467290 
2002-02-14 -0.082738612 -0.13175354 -0.12782784 -0.12296171 
2002-02-15 -0.098760674 -0.08439060 -0.08903754 -0.11871091 
+2

请让您的代码具有可重复性,我们无权访问dvola.pre。理想情况下,使用随机生成的数据集或R包含的数据集。另外,你使用外部库('lmtest'?),你没有提到... – 2012-02-27 12:06:46

回答

4

i时变为等于2。然后你正在两个相同的数据集之间测试差,会出现问题,这导致错误:

x = runif(100) 
grangertest(order=4, x, x) 
Error in solve(vc[ovar, ovar]) : subscript out of bounds 

我对grangertest不熟悉,但可能是协方差矩阵变得奇异。解决方法是跳过i = 2:

for(i in 1:ncol(dfvola.pre)) { 
if(!i == 2) { 
    grangertest(order=4, 
     dfvola.pre[,2], 
     dfvola.pre[,i])$'Pr(>F)'[2] 
    } 
}