# 3.1 Local Moran

The Local Moran statistic was suggested in Anselin ([1995](http://geodacenter.github.io/workbook/6a_local_auto/lab6a.html#ref-Anselin:95)) as a way to identify local clusters and local spatial outliers. For more details, please read <http://geodacenter.github.io/workbook/6a_local_auto/lab6a.html>

## local\_moran()

{% hint style="info" %}
local\_moran() is a PostgreSQL WINDOW function. Please call it  with an OVER clause.
{% endhint %}

### Synopsis

Short version:

```sql
float[] local_moran(numeric val,  bytea weights)
```

Full version:

```sql
float[] local_moran(numeric val,  bytea weights,
    integer permutations, 
    character varying permutation_method,
    float significance_cutoff, 
    integer cpu_threads, 
    integer seed)
```

### Arguments

| Name                 | Type              | Description                                                                                                |
| -------------------- | ----------------- | ---------------------------------------------------------------------------------------------------------- |
| val                  | *numeric*         | the numeric column that contains the values for LISA statistics                                            |
| weights              | bytea             | the bytea column that stores the spatial weights information                                               |
| permutations         | integer           | the number of permutations for the LISA computation. Default: 999.                                         |
| permutation\_method  | character varying | the permutation method used for the LISA computation. Options are 'complete', 'lookup'. Default: 'lookup'. |
| significance\_cutoff | float             | the cutoff value for significance p-values to filter not-significant clusters. Default: 0.05.              |
| cpu\_threads         | integer           | the number of cpu threads used for parallel LISA computation. Default: 6.                                  |
| seed                 | integer           | the seed for random number generator used in LISA statistics. Default: 123456789.                          |

### Return

| Type     | Description                                                                                    |
| -------- | ---------------------------------------------------------------------------------------------- |
| float\[] | an array contains 3 values, which are {'lisa value', 'pseudo-p value' and 'cluster indicator'} |

### Examples

Apply local moran statistics on the variable "hr60" (homicide rate 1960 in [natregimes dataset](https://geodacenter.github.io/data-and-lab/natregimes/)) using queen contiguity weights "queen\_w":

{% hint style="info" %}
Please see chapter '[Contiguity Based Weights](https://xunli.gitbook.io/postgeoda/2.-spatial-weights/2.1-contiguity-based-weights)' for how to create a Queen contiguity weights.
{% endhint %}

```sql
SELECT local_moran(hr60, queen_w) OVER() FROM natregimes;

           local_moran           
---------------------------------
 {0.429182287641945,0.023,2}
 {0.420470386168536,0.042,2}
 {0.545607183523346,0.009,2}
 ...
```

One can specify the arguments of local moran using the full version of local\_moran() function. For example, apply local moran statistics using 9,999 permutations, significance cutoff value 0.01:

```sql
SELECT local_moran(
    hr60, queen_w, 9999, 'lookup', 0.01, 6, 123456789
) OVER() FROM natregimes;

           local_moran            
----------------------------------
 {0.429182287641945,0.0227,0}
 {0.420470386168536,0.0359,0}
 {0.545607183523346,0.0071,2}
 ...
```

### Cluster Indicators

The predefined values of the cluster indicators of local moran are:

| Cluster indicator value | Description     | Color   |
| ----------------------- | --------------- | ------- |
| 0                       | Not significant | #eeeeee |
| 1                       | High-High       | #ff0000 |
| 2                       | Low-Low         | #0000ff |
| 3                       | Low-High        | #a7adf9 |
| 4                       | High-Low        | #f4ada8 |
| 5                       | Undefined Value | #464646 |
| 6                       | Isolated        | #999999 |

One can extract the cluster indicators and make a local moran cluster map using the 'Color" values in the table above:

```sql
SELECT tmp.local_moran[3] FROM (
    SELECT local_moran(hr60, queen_w) OVER() FROM natregimes
) AS tmp;
```

Or by extracting the pseudo-p values to make a significance map:

```sql
SELECT tmp.local_moran[2] FROM (
    SELECT local_moran(hr60, queen_w) OVER() FROM natregimes
) AS tmp;
```
