我正在使用以下地理叠加模型
library(gamair)
library(mgcv)
data(mack)
mack$log.net.area <- log(mack$net.area)
gm2 <- gam(egg.count ~ s(lon,lat,bs="gp",k=100,m=c(2,10,1)) +
s(I(b.depth^.5)) +
s(c.dist) +
s(temp.20m) +
offset(log.net.area),
data = mack, family = tw, method = "REML")
在这里,我正在使用范围为10且功效为1(m=c(2,10,1)
)的指数协方差函数。如何从结果中检索变异函数参数(金块,窗台)?我在模型输出中找不到任何内容。
答案 0 :(得分:1)
在平滑方法中,指定了相关矩阵,因此您仅估计方差参数,即基石。例如,您已将m = c(2, 10, 1)
设置为s(, bs = 'gp')
,从而给出了具有范围参数phi = 10
的指数相关矩阵。请注意,phi
除球面相关性外与范围不同。对于许多相关模型,实际范围是phi
的函数。
方差/底线参数与惩罚回归中的平滑参数密切相关,您可以通过将scale参数除以平滑参数来获得它:
with(gm2, scale / sp["s(lon,lat)"])
#s(lon,lat)
# 26.20877
这是对的吗?否。这里有一个陷阱:smoothing parameters returned in $sp
are not real ones,我们需要满足以下条件:
gm2_sill <- with(gm2, scale / sp["s(lon,lat)"] * smooth[[1]]$S.scale)
#s(lon,lat)
# 7.7772
然后复制您指定的range参数:
gm2_phi <- 10
由于平滑函数是连续的,所以掘金必须为零。使用lines.variomodel
包中的geoR
函数,您可以可视化由s(lon,lat)
建模的潜在高斯空间随机场的半变异函数。
library(geoR)
lines.variomodel(cov.model = "exponential", cov.pars = c(gm2_sill, gm2_phi),
nugget = 0, max.dist = 60)
abline(h = gm2_sill, lty = 2)
但是,请对此变异函数表示怀疑。 mgcv
并不是解释地统计学的简单环境。使用低秩平滑器表明,上述方差参数用于新参数空间中的参数,而不是原始参数空间中的参数。例如,mack
数据集在空间字段中有630个唯一的空间位置,因此相关矩阵应为630 x 630,并且完全随机效应应为长度为630的向量。但是,通过在k = 100
中设置s(, bs = 'gp')
,可以将截断的本征分解和随后的低秩近似将随机效应减小到length-100。对于此向量,方差参数实际上不是原始参数。这可能可以解释为什么门槛和实际范围与数据和预测的s(lon,lat)
不一致。
## unique locations
loc <- unique(mack[, c("lon", "lat")])
max(dist(loc))
#[1] 15.98
数据集中两个空间位置之间的最大距离为15.98,但从方差图得出的实际范围似乎在40到60之间,这太大了。
## predict `s(lon, lat)`, using the method I told you in your last question
## https://stackoverflow.com/q/51634953/4891738
sp <- predict(gm2,
data.frame(loc, b.depth = 0, c.dist = 0, temp.20m = 0,
log.net.area = 0),
type = "terms", terms = "s(lon,lat)")
c(var(sp))
#[1] 1.587126
预测的s(lon,lat)
仅具有1.587的方差,但在7.77处的底线要高得多。