Come posso eseguire l'analisi dei componenti principali ponderati geograficamente usando ArcGIS, Python e SPSS / R?


32

Sto cercando una descrizione / metodologia per condurre un'analisi delle componenti principali ponderate geograficamente (GWPCA). Sono contento di usare Python per qualsiasi parte di questo e immagino che SPSS o R vengano usati per eseguire il PCA sulle variabili geograficamente ponderate.

Il mio set di dati è composto da circa 30 variabili indipendenti misurate in circa 550 tratti di censimento (geometria vettoriale).

So che questa è una domanda carica. Ma, mentre cerco e cerco, non sembra esserci alcuna soluzione là fuori. Ciò che ho incontrato sono equazioni matematiche che spiegano la composizione fondamentale di GWPCA (e GWR). Quello che cerco è più applicato in un certo senso, che sto cercando quali passi principali devo compiere per passare dai dati grezzi ai risultati GWPCA.


Vorrei espandere la prima parte con questa modifica a causa dei commenti ricevuti di seguito.

Per rivolgersi a Paul ...

Sto basando il mio interesse per GWPCA sul seguente documento:

Lloyd, CD, (2010). Analizzare le caratteristiche della popolazione usando l'analisi delle componenti principali ponderate geograficamente: un caso di studio dell'Irlanda del Nord nel 2001. Computer, ambiente e sistemi urbani, 34 (5), p.389-399.

Per coloro che non hanno accesso alla letteratura, ho allegato schermate delle sezioni particolari che spiegano la matematica di seguito:

Articolo

E per rispondere a whuber ...

Senza entrare nel dettaglio (riservatezza), stiamo tentando di ridurre le 30 variabili, che riteniamo siano tutti ottimi indicatori (anche se a livello globale), all'insieme di componenti con autovalori maggiore di 1. Calcolando i componenti geograficamente ponderati, tentiamo comprendere le varianze locali spiegate da questi componenti.

Penso che il nostro obiettivo principale sarà quello di provare il concetto di GWPCA, ovvero mostrare la natura spazialmente esplicita dei nostri dati e che non possiamo considerare tutte le variabili indipendenti come esplicative su scala globale. Piuttosto, la scala locale (quartieri) che ciascun componente identificherà ci aiuterà a comprendere la natura multidimensionale dei nostri dati (come le variabili possono essere combinate tra loro per spiegare determinati quartieri nella nostra area di studio).

Speriamo di mappare la percentuale di varianza spiegata da ciascun componente (separatamente), per comprendere l'estensione del vicinato spiegata dal componente in questione (aiutarci a comprendere la spazialità locale dei nostri componenti). Forse alcuni altri esempi di mappatura, ma nessuno mi viene in mente al momento.

Inoltre:

La matematica alla base del GWPCA va oltre ciò che capisco dato il mio background nell'analisi geografica e nelle statistiche sociali. L'applicazione della matematica è molto importante, cioè cosa devo collegare a queste variabili / formule.


1
Non conosco una soluzione pronta all'uso in R, ma non dovrebbe essere troppo difficile. Si prega di pubblicare la matematica pertinente se si desidera più feedback di: "R probabilmente può fare questo".
Paul Hiemstra,

2
Che tipo di risultati stai cercando? Gli autovalori più grandi? Un numero stimato di componenti principali? I passaggi principali dovrebbero essere abbastanza chiari: a un certo punto, selezionare i pesi, calcolare la matrice ponderata di covarianza (o correlazione), ottenere il PCA dal SVD di quella matrice. Ripetere l'operazione per diversi punti. Stai cercando i dettagli di uno di questi passaggi?
whuber

piacere mio, whuber. per illustrare il mio punto. n.rows = 20 n.cols = 30 sq = seq (1.600) rast = raster (matrice (sq, nrow = n.rows, byrow = T)) rast2 = raster (matrice (sq, nrow = n.cols)) rast2 è capovolto. se guardi le tue mappe, vedrai che in realtà hai 20 colonne invece di 30 (celle larghe sull'asse x, solo 20 di esse). volevo solo dare una mano.

Potresti essere interessato a sapere che è in arrivo un nuovo pacchetto migliorato di metodi GW per R, incluso GW PCA, che è stato presentato a GISRUK 2013 il mese scorso.
AnserGIS

Sulla base della descrizione estesa dell'OP dell'analisi desiderata, raccomanderei caldamente di studiare la letteratura sulle "Coordinate principali delle matrici vicine" (AKA, autovettori di Moran). Questo metodo è stato originariamente proposto in 'Borcard D., & P. ​​Legendre (2002) Analisi spaziale su vasta scala di dati ecologici mediante le coordinate principali delle matrici vicine. Modellistica ecologica 153: 51-68 'ed è molto potente per la valutazione dei dati su più domini su scala spaziale, cosa che GWPCA non farà. Questo metodo è implementato nelle librerie spaceMaker e PCNM R.
Jeffrey Evans,

Risposte:


29

"PCA geograficamente ponderato" è molto descrittivo: in R, il programma praticamente si scrive da solo. (Ha bisogno di più righe di commento rispetto alle righe di codice effettive.)

Cominciamo con i pesi, perché è qui che l'azienda di parti PCA ponderata geograficamente dalla stessa PCA. Il termine "geografico" indica che i pesi dipendono dalle distanze tra un punto base e le posizioni dei dati. Lo standard - ma non solo - la ponderazione è una funzione gaussiana; cioè, decadimento esponenziale con distanza quadrata. L'utente deve specificare il tasso di decadimento o - in modo più intuitivo - una distanza caratteristica su cui si verifica un ammontare fisso di decadimento.

distance.weight <- function(x, xy, tau) {
  # x is a vector location
  # xy is an array of locations, one per row
  # tau is the bandwidth
  # Returns a vector of weights
  apply(xy, 1, function(z) exp(-(z-x) %*% (z-x) / (2 * tau^2)))
}

PCA si applica a una covarianza o matrice di correlazione (che è derivata da una covarianza). Ecco quindi una funzione per calcolare le covarianze ponderate in modo numericamente stabile.

covariance <- function(y, weights) {
  # y is an m by n matrix
  # weights is length m
  # Returns the weighted covariance matrix of y (by columns).
  if (missing(weights)) return (cov(y))
  w <- zapsmall(weights / sum(weights)) # Standardize the weights
  y.bar <- apply(y * w, 2, sum)         # Compute column means
  z <- t(y) - y.bar                     # Remove the means
  z %*% (w * t(z))  
}

La correlazione viene derivata nel solito modo, usando le deviazioni standard per le unità di misura di ciascuna variabile:

correlation <- function(y, weights) {
  z <- covariance(y, weights)
  sigma <- sqrt(diag(z))       # Standard deviations
  z / (sigma %o% sigma)
}

Ora possiamo fare il PCA:

gw.pca <- function(x, xy, y, tau) {
  # x is a vector denoting a location
  # xy is a set of locations as row vectors
  # y is an array of attributes, also as rows
  # tau is a bandwidth
  # Returns a `princomp` object for the geographically weighted PCA
  # ..of y relative to the point x.
  w <- distance.weight(x, xy, tau)
  princomp(covmat=correlation(y, w))
}

(Finora sono nette 10 righe di codice eseguibile. Ne occorrerà solo un'altra, di seguito, dopo aver descritto una griglia su cui eseguire l'analisi.)


Illustriamo con alcuni dati di esempio casuali comparabili a quelli descritti nella domanda: 30 variabili in 550 posizioni.

set.seed(17)
n.data <- 550
n.vars <- 30
xy <- matrix(rnorm(n.data * 2), ncol=2)
y <- matrix(rnorm(n.data * n.vars), ncol=n.vars)

I calcoli geograficamente ponderati vengono spesso eseguiti su una serie selezionata di posizioni, ad esempio lungo un transetto o in punti di una griglia regolare. Usiamo una griglia grossolana per ottenere una prospettiva sui risultati; più tardi - una volta che siamo sicuri che tutto funzioni e stiamo ottenendo ciò che vogliamo - possiamo perfezionare la griglia.

# Create a grid for the GWPCA, sweeping in rows
# from top to bottom.
xmin <- min(xy[,1]); xmax <- max(xy[,1]); n.cols <- 30
ymin <- min(xy[,2]); ymax <- max(xy[,2]); n.rows <- 20
dx <- seq(from=xmin, to=xmax, length.out=n.cols)
dy <- seq(from=ymin, to=ymax, length.out=n.rows)
points <- cbind(rep(dx, length(dy)),
                as.vector(sapply(rev(dy), function(u) rep(u, length(dx)))))

C'è una domanda su quali informazioni desideriamo conservare da ciascun PCA. Tipicamente, un PCA per n variabili restituisce un elenco ordinato di n autovalori e - in varie forme - un corrispondente elenco di n vettori, ciascuno di lunghezza n . Sono n * (n + 1) numeri da mappare! Prendendo alcuni spunti dalla domanda, mappiamo gli autovalori. Questi vengono estratti dall'output di gw.pcatramite l' $sdevattributo, che è l'elenco degli autovalori per valore decrescente.

# Illustrate GWPCA by obtaining all eigenvalues at each grid point.
system.time(z <- apply(points, 1, function(x) gw.pca(x, xy, y, 1)$sdev))

Questo si completa in meno di 5 secondi su questa macchina. Si noti che nella chiamata a è stata utilizzata una distanza caratteristica (o "larghezza di banda") di 1 gw.pca.


Il resto è una questione di pulizia. Mappiamo i risultati usando la rasterlibreria. (Invece, si potrebbero scrivere i risultati in un formato griglia per la post-elaborazione con un GIS.)

library("raster")
to.raster <- function(u) raster(matrix(u, nrow=n.cols), 
                                xmn=xmin, xmx=xmax, ymn=ymin, ymx=ymax)
maps <- apply(z, 1, to.raster)
par(mfrow=c(2,2))
tmp <- lapply(maps, function(m) {plot(m); points(xy, pch=19)})

Mappe

Queste sono le prime quattro delle 30 mappe, che mostrano i quattro autovalori più grandi. (Non eccitarti troppo per le loro dimensioni, che superano 1 in ogni posizione. Ricorda che questi dati sono stati generati in modo totalmente casuale e quindi, se hanno una struttura di correlazione - che gli autovalori di grandi dimensioni in queste mappe sembrano indicare --è dovuto esclusivamente al caso e non riflette nulla di "reale" che spiega il processo di generazione dei dati.)

È istruttivo cambiare la larghezza di banda. Se è troppo piccolo, il software si lamenterà delle singolarità. (Non ho inserito alcun errore durante il controllo di questa implementazione bare-bones.) Ridurlo da 1 a 1/4 (e utilizzando gli stessi dati di prima) offre risultati interessanti:

Mappe 2

Nota la tendenza dei punti attorno al confine a fornire autovalori principali insolitamente grandi (mostrati nelle posizioni verdi della mappa in alto a sinistra), mentre tutti gli altri autovalori sono depressi per compensare (mostrati dal rosa chiaro nelle altre tre mappe) . Questo fenomeno, e molte altre sottigliezze della PCA e della ponderazione geografica, dovranno essere compresi prima di poter sperare in modo affidabile di interpretare la versione ponderata geograficamente della PCA. E poi ci sono gli altri 30 * 30 = 900 autovettori (o "caricamenti") da considerare ....


1
Notevole come al solito @whuber, grazie mille!
Michael Markieta,

1
volevo solo farti sapere che nella funzione to.raster, devi avere una matrice (u, nrow = n.rows, byrow = TRUE) invece della matrice (u, nrow = n.cols).

1
@cqh Grazie per aver guardato questo codice così attentamente! Indichi una preoccupazione legittima; Ricordo di aver dovuto affrontare questo problema. Tuttavia, penso che il codice sia corretto così com'è. Se avessi confuso l'ordine delle righe / colonne, le illustrazioni sarebbero state completamente (e ovviamente) rovinate. (Ecco perché ho provato con diversi conteggi di righe e colonne.) Mi scuso per l'espressione sfortunata nrow=n.cols, ma è così che ha funzionato (in base a come è pointsstato creato) e non volevo tornare indietro e rinominare tutto.
whuber

14

Aggiornare:

Ora esiste un pacchetto R specializzato disponibile su CRAN - GWmodel che include PCA geograficamente ponderato tra gli altri strumenti. Dal sito web dell'autore :

Il nostro nuovo pacchetto R per la modellazione geograficamente ponderata, GWmodel, è stato recentemente caricato su CRAN. GWmodel offre una gamma di approcci di analisi dei dati ponderati geograficamente all'interno di un singolo pacchetto, tra cui statistiche descrittive, correlazione, regressione, modelli lineari generali e analisi delle componenti principali. I modelli di regressione comprendono vari dati per strutture gaussiane, logistiche e di Poisson, nonché la regressione della cresta per gestire i predittori correlati. Una nuova funzionalità di questo pacchetto è la fornitura di versioni robuste di ogni tecnica - queste sono resistenti agli effetti dei valori anomali.

Le posizioni per la modellazione possono essere in un sistema di coordinate proiettato o specificate utilizzando le coordinate geografiche. Le metriche della distanza includono Euclidean, taxicab (Manhattan) e Minkowski, nonché le distanze del Grande Cerchio per le posizioni specificate dalle coordinate di latitudine / longitudine. Sono inoltre disponibili vari metodi di calibrazione automatica e sono disponibili alcuni utili strumenti per la creazione di modelli che consentono di selezionare tra predittori alternativi.

Vengono inoltre forniti set di dati di esempio, che vengono utilizzati nella documentazione di accompagnamento nelle illustrazioni dell'uso delle varie tecniche.

Maggiori dettagli in un'anteprima di un prossimo articolo .


Dubito che esista una soluzione "pronta all'uso, collega i tuoi dati". Ma spero vivamente di essere smentito dal momento che mi piacerebbe testare questo metodo con alcuni dei miei dati.

Alcune opzioni da considerare:


Marí-Dell'Olmo e colleghi hanno utilizzato l'analisi del fattore bayesiano per calcolare l'indice di deprivazione per piccole aree in Spagna:

Analisi del fattore bayesiano per calcolare un indice di deprivazione e la sua incertezza. Marí-Dell'Olmo M, Martínez-Beneito MA, Borrell C, Zurriaga O, Nolasco A, Domínguez-Berjón MF. Epidemiologia . Maggio 2011; 22 (3): 356-64.

Nell'articolo forniscono le specifiche per il modello WinBUGS eseguito da R che potrebbe iniziare.


Il pacchetto adegenet R implementa laspcafunzione. Sebbene si concentri sui dati genetici, potrebbe anche essere il più vicino possibile a una soluzione al tuo problema. O usando direttamente questo pacchetto / funzione o modificando il suo codice. C'è una vignetta sul problema che dovrebbe metterti in funzione.


I ricercatori di Strategic Research Cluster sembrano lavorare attivamente sull'argomento. Soprattutto Paul Harris e Chris Brunsdon (qui la presentazione su cui mi sono imbattuto). La recente pubblicazione di Paul e Urska ( testo completo ) potrebbe anche essere una risorsa utile:

Demšar U, Harris P, Brunsdon C, Fotheringham AS, McLoone S (2012) Analisi delle componenti principali sui dati spaziali: una panoramica. Annali dell'Associazione dei geografi americani

Perché non provi a contattarli e a chiedere quali soluzioni stanno esattamente usando? Potrebbero essere disposti a condividere il loro lavoro o indicarti una buona direzione.


Cheng, Q. (2006) Analisi dei componenti principali spaziali e ponderati spazialmente per l'elaborazione delle immagini. IGARSS 2006: 972-975

la carta menziona l'utilizzo del sistema GIS GeoDAS . Potrebbe essere un altro vantaggio.


2
+1 La presentazione di Brunsdon sottolinea l'uso del PCA come strumento esplorativo per trovare valori anomali multivariati locali. (Questo uso è anche presente nella spcavignetta.) È un uso potente e legittimo per GWPCA. (Tuttavia, questo metodo potrebbe essere molto migliorato, ed essere più nello spirito dell'analisi esplorativa dei dati spaziali, se il PCA fosse sostituito da una procedura più solida.)
whuber

Sembra che un'alternativa sarebbe il kernel PCA. tribesandclimatechange.org/docs/tribes_450.pdf
Jeffrey Evans il

1
Grazie per le informazioni aggiornate-- GWmodelsembra un pacchetto che merita di essere acquistato.
whuber
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.