R中的nlme包中的gls函数出错

时间:2011-07-15 11:09:50

标签: r

我一直收到这样的错误:

Error in `coef<-.corARMA`(`*tmp*`, value = c(18.3113452983211, -1.56626248550284,  :
  Coefficient matrix not invertible

或者像这样:

Error in gls(archlogfl ~ co2, correlation = corARMA(p = 3)) : false convergence (8)

使用gls中的nlme函数。

前一个示例是模型gls(archlogflfornma~nma,correlation=corARMA(p=3)),其中archlogflfornma

[1] 2.611840 2.618454 2.503317 2.305531 2.180464 2.185764 2.221760 2.211320

nma

[1] 138 139 142 148 150 134 137 135

您可以在后者中看到模型,archlogfl

[1] 2.611840 2.618454 2.503317 2.305531 2.180464 2.185764 2.221760 2.211320
[9] 2.105556 2.176747

co2

[1]  597.5778  917.9308 1101.0430  679.7803  886.5347  597.0668  873.4995 
[8]  816.3483 1427.0190  423.8917

我有R 2.13.1。

罗兰

1 个答案:

答案 0 :(得分:18)

@ GavinSimpson上面的评论,试图从10次观察中估计出具有5个参数的模型是非常有希望的,是正确的。一般的经验法则是,您应该至少数据点的10倍作为参数,这是标准的固定效果/回归参数。 (通常方差结构参数,如AR参数甚至更难/需要比估计的回归参数更多的数据。)

也就是说,在一个完美的世界中,人们可能希望即使从过度装配的模型中估计参数。我们来探讨一下会发生什么:

archlogfl <- c(2.611840,2.618454,2.503317,
               2.305531,2.180464,2.185764,2.221760,2.211320,
               2.105556,2.176747)

co2 <- c(597.5778,917.9308,1101.0430,679.7803,
         886.5347,597.0668,873.4995,
         816.3483,1427.0190,423.8917)

看看数据,

plot(archlogfl~co2,type="b")
library(nlme)
g0 <- gls(archlogfl~co2)
plot(ACF(g0),alpha=0.05)

ACF 1

这是残差的自相关函数,置信区间为95%(请注意,这些是曲线置信区间,因此我们预计在任何情况下大约有1/20点落在这些边界之外)。

因此,确实存在一些(图形)证据表明这里存在一些自相关。我们将拟合AR(1)模型,具有详细输出(为了理解这些参数的估计,您可能需要在Pinheiro和Bates 2000中挖掘:打印输出中显示的是参数的无约束值,摘要中打印的是约束值......

g1 <- gls(archlogfl ~co2,correlation=corARMA(p=1),
    control=glsControl(msVerbose=TRUE))

让我们看看符合AR1后剩下的东西:

plot(ACF(g1,resType="normalized"),alpha=0.05)

ACF 2

现在适合AR(2):

g2 <- gls(archlogfl ~co2,correlation=corARMA(p=2),
    control=glsControl(msVerbose=TRUE))

plot(ACF(g2,resType="normalized"),alpha=0.05)

ACF 3

正如您所说,尝试转到AR(3)失败。

gls(archlogfl ~co2,correlation=corARMA(p=3))

您可以使用容差,起始条件等,但我认为这不会有太大帮助。

gls(archlogfl ~co2,correlation=corARMA(p=3,value=c(0.9,-0.5,0)),
    control=glsControl(tolerance=1e-4,msVerbose=TRUE),verbose=TRUE)

如果我非常渴望获得这些值,我会编写自己的广义最小二乘函数,从头开始构建AR(3)相关矩阵,并尝试使用一些稍微强大的优化器运行它,但我真的会必须有充分的理由努力工作......

另一种替代方法是使用arima来适应glslm拟合中的残差,而不需要自相关:arima(residuals(g0),c(3,0,0))。 (您可以看到,如果您使用arima(residuals(g0),c(2,0,0))执行此操作,答案将接近(但不完全等于)glscorARMA(p=2)的结果。)