A seguir iremos apresentar algumas funções dos pacotes geoR e gstat para estimação paramétrica dos modelos de semivariograma:
require(geoR)
## Loading required package: geoR
## --------------------------------------------------------------
## Analysis of Geostatistical Data
## For an Introduction to geoR go to http://www.leg.ufpr.br/geoR
## geoR version 1.7-5.2 (built on 2016-05-02) is now loaded
## --------------------------------------------------------------
Dados simulados no geoR
summary(s100)
## Number of data points: 100
##
## Coordinates summary
## Coord.X Coord.Y
## min 0.005638006 0.01091027
## max 0.983920544 0.99124979
##
## Distance summary
## min max
## 0.007640962 1.278175109
##
## Data summary
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## -1.1680 0.2730 1.1050 0.9307 1.6100 2.8680
##
## Other elements in the geodata object
## [1] "cov.model" "nugget" "cov.pars" "kappa" "lambda"
Gráfico descritivo dos dados
plot(s100)
Calculando a distância máxima, e utilizando sua metade no semivariograma
dmax = max(summary(s100)$distances.summary)
dmax
## [1] 1.278175
Calculando o semivariograma amostral
\[\begin{eqnarray}
\hat{\gamma}(\mathbf{h}) = \frac{1}{2|N(\mathbf{h})|}\displaystyle\sum_{N(\mathbf{h})}^{}\left\{Z(\mathbf{s}_{i}) - Z(\mathbf{s}_{j})\right\}^{2}
\end{eqnarray}\]
vario100 <- variog(s100, max.dist=dmax/2, estimator.type="classical")
## variog: computing omnidirectional variogram
Gráfico do semivariograma
plot(vario100, xlab="Distância (h)", ylab="Semivariograma", bty='l',
cex=2, pch=19, cex.lab=1.5, cex.axis=1.5)
grid(col='lightseagreen', lwd=1)
Note que, o modelo exponencial tem dois parâmetros, \(\sigma^{2}\) e \(\phi\) que serão estimados. Sendo assim, precisamos atribuir valores iniciais para estes parâmetros, uma vez que, o processo de estimação é iterativo.
ini.vals <- expand.grid('phi'=seq(0,1,l=5), 'sigma2'=seq(0,1,l=5))
Ajuste utilizando Mínimos Quadrados Ordinários (OLS). Para utilizarmos o método OLS basta atribuir o argumento (wei=‘equal’)
ols <- variofit(vario100, ini=ini.vals, fix.nug=TRUE, wei='equal',
cov.model='exponential', messages=F)
Ajuste utilizando Mínimos Quadrados Ponderados (WLS). Pesos sugeridos por Cressie (1985). Para utilizarmos o método WLS é só atribuir o argumento (wei=‘cressie’).
wls <- variofit(vario100, ini=ini.vals, fix.nug=TRUE, wei='cressie',
cov.model='exponential', messages=F)
A seguir iremos apresentar ajustes de modelos utilizando máxima verossimilhança. Note que, este tipo de abordagem não necessita da construção de um semivariograma amostral, uma vez que, utiliza-se dos próprios dados.
Para utilizar Máxima Verossimilhança (ML) basta colocar o argumento lik.met = ‘ML’
ml <- likfit(s100, ini=ini.vals, fix.nug=TRUE, lik.met = 'ML',
cov.model="exponential", messages=F)
Para utilizar Máxima Verossimilhança Restrita (REML) basta colocar o argumento lik.met = ‘REML’
reml <- likfit(s100, ini=ini.vals, fix.nug=TRUE, lik.met = 'REML',
cov.model="exponential", messages=F)
Resultados apresentados em um gráfico
plot(vario100, xlab="Distância (h)", ylab="Semivariograma",
cex.main=1.3, main="Modelo Exponencial", bty='l',
cex=2, pch=19, cex.lab=1.3, cex.axis=1.5)
grid(col='lightseagreen', lwd=1)
lines(ml, col=2, lwd=2)
lines(reml, col=3, lwd=2)
lines(ols, col=4, lwd=2)
lines(wls, col=5, lwd=2)
legend('topleft', c("ML", "REML", "OLS", "WLS"), col = 2:5,
lwd = rep(2,4), bty='n', cex=1.2)
No gstat, os gráficos descritivos são realizados utilizando rotinas do pacote sp.
require(sp)
## Loading required package: sp
Entramos com os dados da seguinte forma:
x <- s100[[1]][,1]
y <- s100[[1]][,2]
z <- s100[[2]]
dados_gstat <- data.frame('x'=x, 'y'=y, 'z'=z)
Escrevendo quem são as coordenadas
coordinates(dados_gstat) = ~ x + y
head(dados_gstat)
## coordinates z
## 1 (0.8071267, 0.945446) 0.9171888
## 2 (0.5499981, 0.6832649) 1.1483234
## 3 (0.3408055, 0.4585089) 1.0327563
## 4 (0.1370993, 0.4720083) 0.1219548
## 5 (0.04418569, 0.1223202) 0.6152988
## 6 (0.02781636, 0.8037459) -0.5506065
Resumo descritivo dos dados
summary(dados_gstat)
## Object of class SpatialPointsDataFrame
## Coordinates:
## min max
## x 0.005638006 0.9839205
## y 0.010910267 0.9912498
## Is projected: NA
## proj4string : [NA]
## Number of points: 100
## Data attributes:
## z
## Min. :-1.1677
## 1st Qu.: 0.2730
## Median : 1.1046
## Mean : 0.9307
## 3rd Qu.: 1.6102
## Max. : 2.8679
Análise gráfica
bubble(dados_gstat, "z", main='')
Construção do semivariograma amostral
require(gstat)
## Loading required package: gstat
lzn.vgm = variogram(z~1, dados_gstat, cutoff=dmax/2)
plot(lzn.vgm, xlab="Distância (h)", ylab="Semivariograma",
cex=2, pch=19)
Modelos de semivariogramas presentes no gstat
vgm()
## short long
## 1 Nug Nug (nugget)
## 2 Exp Exp (exponential)
## 3 Sph Sph (spherical)
## 4 Gau Gau (gaussian)
## 5 Exc Exclass (Exponential class/stable)
## 6 Mat Mat (Matern)
## 7 Ste Mat (Matern, M. Stein's parameterization)
## 8 Cir Cir (circular)
## 9 Lin Lin (linear)
## 10 Bes Bes (bessel)
## 11 Pen Pen (pentaspherical)
## 12 Per Per (periodic)
## 13 Wav Wav (wave)
## 14 Hol Hol (hole)
## 15 Log Log (logarithmic)
## 16 Pow Pow (power)
## 17 Spl Spl (spline)
## 18 Leg Leg (Legendre)
## 19 Err Err (Measurement error)
## 20 Int Int (Intercept)
Uma vantagem no gstat é que temos várias opções para a matriz de pesos para o MMQ.
Para o OLS basta fazer fit.method = 6.
olsExp <- fit.variogram(lzn.vgm, vgm(psill=0.8, "Exp", range=0.7),
fit.method = 6)
plot(lzn.vgm, olsExp, xlab="Distância (h)", ylab="Semivariograma",
cex=2, pch=19, lwd=2, main="OLS")
Já para o WLS, como sugerido por Cressie (1985), fit.method = 2.
wlsExp <- fit.variogram(lzn.vgm, vgm(psill=0.8, "Exp", range=0.7),
fit.method = 2)
plot(lzn.vgm, wlsExp, xlab="Distância (h)", ylab="Semivariograma",
cex=2, pch=19, lwd=2, main="WLS")
Para REML veja o que o gstat diz:
I guess there is much more to likelihood variogram fitting in package geoR, and probably also in nlme.
dados <- data.frame(dados_gstat)
reml <- fit.variogram.reml(z~1, ~x+y, dados,
model = vgm(psill=wlsExp$psill, "Exp",
range=wlsExp$range))
plot(lzn.vgm, reml, xlab="Distância (h)", ylab="Semivariograma",
cex=2, pch=19, lwd=2, main="REML")
Mínimos quadrados generalizados no gstat
gls <- fit.variogram.gls(z~1, dados_gstat[1:40,],
vgm(psill=wlsExp$psill, "Exp",
range=wlsExp$range), trace = F, cutoff=dmax/2)
plot(lzn.vgm, gls, xlab="Distância (h)", ylab="Semivariograma",
cex=2, pch=19, lwd=2, main="GLS")