R:gls错误“false convergence(8)”和glsControl函数

时间:2018-01-05 11:51:51

标签: r nlme

我已经看到在R中从nlme包运行广义最小二乘(gls)时的常见错误是“false convergence(8)”。我试图运行gls模型来解释我的残差的空间依赖性,但我也遇到了同样的问题。例如:

SELECT x.*
     , COALESCE(sent,0) sent
     , COALESCE(received,0) received
  FROM t1 x
  LEFT 
  JOIN 
     ( SELECT from_br
            , SUM(vqty) sent
         FROM t2
        GROUP
           BY from_br
     ) a
    ON a.from_br = x.id
  LEFT
  JOIN
     ( SELECT to_br
            , SUM(vqty) received
         FROM t2
        GROUP
           BY to_br
     ) b
    ON b.to_br = x.id
 ORDER
    BY id;

(以上数据模拟是从here复制的,因为它会产生我面临的同样问题。

然后,我读到函数glsControl有一些参数(maxIter,msMaxIter,returnObject),可以在运行分析之前设置,这可以解决这个错误。为了理解发生了什么,我将上面的三个参数调整为500,2000和TRUE,并运行上面相同的代码,但错误仍然显示出来。我认为glsControl根本不起作用,因为即使我已经要求它也没有显示任何结果。

library(nlme)

set.seed(2)
samp.sz<-400
lat<-runif(samp.sz,-4,4)
lon<-runif(samp.sz,-4,4)
exp1<-rnorm(samp.sz)
exp2<-rnorm(samp.sz)

resp<-1+4*exp1-3*exp2-2*lat+rnorm(samp.sz)
mod.cor<-gls(resp~exp1+exp2,correlation=corGaus(form=~lat,nugget=TRUE))

Error in gls(resp ~ exp1 + exp2, correlation = corGaus(form = ~lat, nugget = TRUE)) : 
  false convergence (8)

为了进行比较,如果我使用相同的变量运行不同的模型,它可以正常工作并且不会显示错误。

例如,模型只包含一个解释变量。

glsControl(maxIter = 500, msMaxIter=2000, returnObject = TRUE)
mod.cor<-gls(resp~exp1+exp2,correlation=corGaus(form=~lat,nugget=TRUE))

我真的深入研究了几个网站,在试图解决它的绝望搜索中的foruns和书籍,然后我才知道“错误收敛”是许多用户面临的经常性错误。但是,之前的帖子似乎都没有为我解决。我真的认为glsControl可以提供替代方案,但事实并非如此。你们有什么线索我能解决这个问题吗?

我非常感谢任何帮助。提前谢谢。

1 个答案:

答案 0 :(得分:1)

问题是块金效应非常小。提供更好的起始值:

mod.cor <- gls(resp ~ exp1 + exp2, 
  correlation = corGaus(c(200, 0.1), form = ~lat, nugget = TRUE))
summary(mod.cor)
#<snip>
#Correlation Structure: Gaussian spatial correlation
# Formula: ~lat 
# Parameter estimate(s):
#       range       nugget 
#2.947163e+02 5.209379e-06
#</snip>

请注意,即使没有错误或警告,此模型也可能对起始值敏感。

我想添加library(lme4); help("convergence")的引用:

  

lme4包使用通用非线性优化器(例如   Nelder-Mead或Powell的BOBYQA方法)估算   随机效应的方差 - 协方差矩阵。可靠地评估   这些算法是否已经收敛是困难的。

我相信类似的东西适用于此。这个模型显然有问题,你应该感谢你收到这个错误。您应该至少检查拟合如何随不同的起始值而变化,并尝试增加迭代次数或减小公差。最后,我建议寻找一个更适合数据的模型(我们知道这将是一个OLS模型,包括lat作为线性预测器)。

PS:一种好的编码风格在适当的地方使用空白。