[R-sig-Geo] GSTAT Co-Kriging: How can i fix a non positive definte correlation matrix

Edzer Pebesma edzer.pebesma at uni-muenster.de
Wed Jan 7 09:08:57 CET 2015


First: you don't provide us with a reproducible example. I know this is
a bit of work for your case, but it may be worth it. For instance, in
the text below several R commands appear on a single line, which is
syntactically an error.

Second: the error message you get may come from different reasons, one
of them being near-perfect correlation among variables, but you seem to
have prevented this with argument correct.diagonal; have you tried a
slightly larger value? Another cause may be duplicate or near duplicate
observations; sp::zerodist may be useful here.

On 01/06/2015 10:52 PM, Roberts, Blake wrote:
> QUESTION: Can anyone give me advice on how to resolve an error message regarding a non positive definite correlation matrix so that the computed negative cross-variogram can be used to perform co-kriging?
> 
> I am performing co-kriging on negatively correlated parameters. 
> 
> data = dtrd 
> 
> x	y	n.ts	n.ae
> 3.2	6.4	-0.052514693	0.055104755
> 6.4	6.4	-0.375234492	-0.861381682
> 9.6	6.4	1.362810557	-0.23577909
> 12.8	6.4	-0.333087778	0.134741672
> 16	6.4	0.699916885	-2.348188189
> 22.4	6.4	0.605552409	-0.75492334
> 25.6	6.4	0.406868496	0.329847607
> 3.2	9.6	-0.529754386	0.251549504
> 6.4	9.6	-0.416509276	1.094807283
> 9.6	9.6	-0.450700276	0.988002955
> 12.8	9.6	-0.732937251	1.344413512
> 16	9.6	0.377457633	-0.542187169
> 19.2	9.6	-0.989029229	2.002433474
> 22.4	9.6	-1.259551904	-0.895859924
> 25.6	9.6	-0.470220669	0.370809323
> 3.2	12.8	1.046426438	0.168121785
> 6.4	12.8	-1.440639861	1.423433672
> 9.6	12.8	-0.899563555	0.83844681
> 12.8	12.8	-1.287567164	-0.086478673
> 16	12.8	-0.816931437	1.156633451
> 19.2	12.8	-0.782655308	0.299641538
> 22.4	12.8	0.048342822	-0.763091614
> 3.2	16	-0.5581308	-0.130509134
> 6.4	16	-0.217874377	0.815852429
> 9.6	16	-0.272702769	0.906621066
> 12.8	16	-0.996064	0.274459785
> 16	16	-1.97520507	2.017626766
> 19.2	16	-0.718163458	0.444173367
> 22.4	16	0.337266312	0.831151021
> 25.6	16	-0.565668608	0.513114809
> 3.2	19.2	0.651736313	-0.055114304
> 6.4	19.2	-0.715751462	0.205488257
> 9.6	19.2	0.650820529	0.558032798
> 12.8	19.2	-1.184380204	0.612006591
> 16	19.2	0.132388601	0.462059331
> 19.2	19.2	1.08502868	0.399240335
> 22.4	19.2	-0.85196341	0.113079949
> 25.6	19.2	0.099887288	-1.922971577
> 3.2	22.4	-0.233091874	-0.287556625
> 6.4	22.4	-0.989196908	0.10047403
> 9.6	22.4	-0.025054063	0.384754057
> 12.8	22.4	-0.394999955	-1.272051846
> 16	22.4	0.049839033	-2.568551091
> 19.2	22.4	1.327518037	-0.974203156
> 22.4	22.4	-0.421157849	-0.0101211
> 25.6	22.4	-0.178717505	0.408401438
> 3.2	25.6	-0.065413063	-0.195765074
> 6.4	25.6	1.167410569	-1.626236059
> 9.6	25.6	0.428968564	-1.287922066
> 12.8	25.6	1.550074254	-1.011990828
> 16	25.6	2.931334909	-1.872352342
> 19.2	25.6	4.126464345	-2.254471152
> 22.4	25.6	0.44561262	-0.709554064
> 25.6	25.6	0.543591219	1.03999109
> 3.2	28.8	0.716228164	-0.671315106
> 6.4	28.8	1.856183532	-1.403466298
> 9.6	28.8	0.774644882	-0.952601604
> 12.8	28.8	0.425336383	-0.776073605
> 16	28.8	0.294908064	-0.00019281
> 19.2	28.8	2.38260471	-0.778811406
> 22.4	28.8	-0.315391214	-0.223383771
> 25.6	28.8	1.136916243	-0.238938091
> 3.2	32	-0.233091874	-0.520269718
> 6.4	32	-0.352017426	-0.556041646
> 9.6	32	-0.933099317	-0.441354858
> 16	32	-0.865945243	-1.011088256
> 19.2	32	-0.594339105	-0.399550741
> 22.4	32	-0.653328511	1.213119402
> 25.6	32	0.076670222	0.819568017
> 3.2	35.2	-0.14022361	0.166527242
> 6.4	35.2	-0.545492977	-0.613535469
> 9.6	35.2	-0.084386566	-0.423754708
> 12.8	35.2	2.107283841	-0.891753223
> 16	35.2	-1.645006796	0.566968259
> 22.4	35.2	0.512684145	0.515250895
> 25.6	35.2	0.517794479	-1.144578624
> 3.2	38.4	-0.359495901	0.191964723
> 6.4	38.4	0.548288806	-1.011825356
> 9.6	38.4	-0.597741695	0.046560408
> 12.8	38.4	-1.003803022	0.319904274
> 16	38.4	0.060157729	0.824035747
> 19.2	38.4	0.251793973	0.632946256
> 22.4	38.4	-1.148625922	1.257360463
> 25.6	38.4	-0.957779058	0.30201831
> 3.2	41.6	0.267364885	1.139304073
> 6.4	41.6	0.171656399	0.623288738
> 9.6	41.6	-0.912461925	0.820049388
> 12.8	41.6	-0.645228334	1.041375034
> 16	41.6	0.83148026	2.914000894
> 19.2	41.6	-1.187664129	2.756035789
> 22.4	41.6	-0.467591981	0.467880919
> 25.6	41.6	-0.121964677	0.878460826
> 3.2	44.8	-0.158281328	-0.266451488
> 6.4	44.8	-0.235932095	1.440612621
> 12.8	44.8	-0.436274739	-0.298237058
> 16	44.8	-1.136811015	-0.688794913
> 19.2	44.8	0.87349541	0.449964869
> 22.4	44.8	-0.661067533	-0.08882536
> 25.6	44.8	0.301101862	-0.255259598
> 3.2	48	1.265698729	0.948786211
> 6.4	48	-0.806040053	0.352201302
> 9.6	48	1.006815543	1.12999254
> 12.8	48	-0.0132082	0.581935908
> 16	48	-1.214201235	1.431842632
> 19.2	48	-0.323473333	-0.083379843
> 22.4	48	-0.003250658	-0.248324838
> 25.6	48	-0.168398809	-0.916859761
> 3.2	51.2	-0.854793312	-0.231928117
> 6.4	51.2	0.507014021	-0.49107152
> 9.6	51.2	3.104090518	-2.654897126
> 12.8	51.2	-0.193785381	0.067244345
> 16	51.2	-0.71632415	-1.46047875
> 19.2	51.2	2.480632323	-0.336852087
> 22.4	51.2	-0.534663506	-1.093553232
> 25.6	51.2	-0.124544351	-0.603005465
> 
> Using the following code I compute a negative cross-variogram:
> 
> dtrd = as.data.frame(dtrd)
> # create a grid onto which i will interpolate # first get a range in data x.range <- as.integer(range(dtrd[,1])) y.range <- as.integer(range(dtrd[,2])) # now expand to a grid with desired spacing grid <- expand.grid(x=seq(from=x.range[1], to=x.range[2], by=0.4), y=seq(from=y.range[1], to=y.range[2], by=1.6))
> plot(grid)
> 
> # Convert to spatial data frame
> coordinates(grid) = c("x", "y")
> coordinates(dtrd) = c("x", "y")
> 
> # Compute cross-variogram
> g <- gstat(id = "n.ae", formula = n.ae ~ + 1, data = dtrd, nmax=10) g <- gstat(g, "n.ts", n.ts ~ 1, dtrd, nmax=10)
> g1 <- gstat(g, id=c("n.ae", "n.ts"), model = vgm(psill=-0.65, model="Sph", range=15, nugget=-0.05), fill.all = T) v <- variogram(g) g.fit<-fit.lmc(v, g1, correct.diagonal = 1.01)
> 
> # Plot cross-variogram with fitted model plot(v[v$id == "n.ae.n.ts",], g.fit$model[[2]], main="Cross-variogram: 
> Air Entry and Saturated Water Content", xlab="Lag Distance (mm)", ylab="Semivariance (-)", ylim=c(0,-0.8))
> 
> When attempting to use the negative cross-variogram in the co-kriging plan I receive the following error message:
> 
> # Perform co-kriging predictions
> ck <- predict.gstat(g1, grid)
> 
> non-positive definite coefficient matrix in structure 1non-positive definite coefficient matrix in structure 2Warning: No Intrinsic Correlation or Linear Model of Coregionalization found
> Reason: coefficient matrix not positive definite
> Warning: [add `set nocheck = 1;' to the command file to ignore the following error]
> 
> Error in predict.gstat(g1, grid) : 
>   gstat: value not allowed for: variograms do not satisfy a legal model
> 
> I have successfully produced kriged maps of each of the parameters individually, but do not know exactly how to deal with the negative cross-variogram and resolve the issue of a non positive definite correlation matrix. I think the problem arises from using a negative sill and nugget to model the sample cross-variogram with the fit.lmc function. If I use the same code but make the sill and nugget positive I get the same fit of the model to the sample cross-variogram and a message reading : Intrinsic Correlation found. Good. [using ordinary cokriging], which I initial thought that this was a good sign, but once again I can not resolve the following error message:
> 
> # Compute cross-variogram
> g <- gstat(id = "n.ae", formula = n.ae ~ + 1, data = dtrd, nmax=10) g <- gstat(g, "n.ts", n.ts ~ 1, dtrd, nmax=10)
> g1 <- gstat(g, id=c("n.ae", "n.ts"), model = vgm(psill=0.65, model="Sph", range=15, nugget=0.05), fill.all = T) v <- variogram(g) g.fit<-fit.lmc(v, g1, correct.diagonal = 1.01)
> 
> # Perform co-kriging predictions
> ck <- predict.gstat(g1, grid)
> 
> Intrinsic Correlation found. Good. 
> [using ordinary cokriging]
> 
> ERROR: "chfactor.c", line 131: singular matrix in function LDLfactor() Error in predict.gstat(g1, grid) : LDLfactor
> 
> The gstat manual shows that this problem can be fixed by adding correct.diagonal = 1.01 to the fit.lmc function, but this does not eliminate the error message
> 
> I am very confused about all of this and would appreciate any help to fix the non positive correlation matrix so that the negative cross-variogram can be used to perform co-kriging.
> 
> Thanks in advance for any help,
> 
> Blake Roberts
> 
> _______________________________________________
> R-sig-Geo mailing list
> R-sig-Geo at r-project.org
> https://stat.ethz.ch/mailman/listinfo/r-sig-geo
> 

-- 
Edzer Pebesma,  Co-Editor-in-Chief Computers & Geosciences
Institute for Geoinformatics (ifgi), University of Münster
Heisenbergstraße 2, 48149 Münster, Germany. Phone: +49 251
83 33081 http://ifgi.uni-muenster.de GPG key ID 0xAC227795

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 490 bytes
Desc: OpenPGP digital signature
URL: <https://stat.ethz.ch/pipermail/r-sig-geo/attachments/20150107/ce8ba836/attachment.bin>


More information about the R-sig-Geo mailing list