// Copyright ©2017 The Gonum Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package spatial_test import ( "fmt" "math" "gonum.org/v1/gonum/floats" "gonum.org/v1/gonum/mat" "gonum.org/v1/gonum/stat/spatial" ) // Euclid is a mat.Matrix whose elements reflects the Euclidean // distance between a series of unit-separated points strided // to be arranged in an x by y grid. type Euclid struct{ x, y int } func (e Euclid) Dims() (r, c int) { return e.x * e.y, e.x * e.y } func (e Euclid) At(i, j int) float64 { d := e.x * e.y if i < 0 || d <= i || j < 0 || d <= j { panic("bounds error") } if i == j { return 0 } x := float64(j%e.x - i%e.x) y := float64(j/e.x - i/e.x) return 1 / math.Hypot(x, y) } func (e Euclid) T() mat.Matrix { return mat.Transpose{Matrix: e} } func ExampleGlobalMoransI_areal() { locality := Euclid{10, 10} data1 := []float64{ 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, } i1, _, z1 := spatial.GlobalMoransI(data1, nil, locality) data2 := []float64{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, } i2, _, z2 := spatial.GlobalMoransI(data2, nil, locality) fmt.Printf("%v scattered points Moran's I=%.4v z-score=%.4v\n", floats.Sum(data1), i1, z1) fmt.Printf("%v clustered points Moran's I=%.4v z-score=%.4v\n", floats.Sum(data2), i2, z2) // Output: // // 24 scattered points Moran's I=-0.02999 z-score=-1.913 // 24 clustered points Moran's I=0.09922 z-score=10.52 }