我已经看到在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可以提供替代方案,但事实并非如此。你们有什么线索我能解决这个问题吗?
我非常感谢任何帮助。提前谢谢。
答案 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:一种好的编码风格在适当的地方使用空白。