R:gls误差"false convergence (8)"和gls控制功能



我已经看到,在R中从nlme包运行广义最小二乘(gls)时,一个常见的错误是"假收敛(8)"。我正在尝试运行 gls 模型来解释残差的空间依赖性,但我遇到了同样的问题。例如:

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,msMaxIter,returnObject),可以在运行分析之前设置,这可以解决此错误。为了理解发生了什么,我将上面的三个参数调整为 500、2000 和 TRUE,并运行上面的相同代码,但错误仍然出现。我认为glsControl根本不起作用,因为即使我要求也没有显示任何结果。

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

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

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

mod.cor2<-gls(resp~exp1,correlation=corGaus(form=~lat,nugget=TRUE))
mod.cor3<-gls(resp~exp2,correlation=corGaus(form=~lat,nugget=TRUE))

我真的在绝望的搜索中挖掘了几个网站,forun和书籍,试图解决它,然后我开始知道"错误收敛"是许多用户面临的反复出现的错误。但是,以前的帖子似乎都没有为我解决这个问题。我真的认为glsControl可以提供替代方案,但它没有。你们知道我该如何解决这个问题吗?

我真的很感激任何帮助。提前谢谢。

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

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:一个好的编码风格在适当的时候使用空白。

最新更新