2015-06-19 12 views
6

Mam stos 4 rastrów. Chciałbym średniej korelacji w czasie między pikselem a każdym z 8 sąsiadów.obliczyć średnią korelację dla sąsiednich pikseli w czasie

niektóre dane:

library(raster) 

r1=raster(matrix(runif(25),nrow=5)) 
r2=raster(matrix(runif(25),nrow=5)) 
r3=raster(matrix(runif(25),nrow=5)) 
r4=raster(matrix(runif(25),nrow=5)) 
s=stack(r1,r2,r3,r4) 

więc na piksel na pozycji X, która ma 8 sąsiadów w NE, E, SE, S itp pozycji, chcę średnią

cor(x,NE) 
cor(x,E) 
cor(x,SE) 
cor(x,S) 
cor(x,SW) 
cor(x,W) 
cor(x,NW) 
cor(x,N) 

oraz średnią wartość zapisaną na pozycji x w wynikowym rastrze. Komórki brzegowe byłyby NA lub, jeśli to możliwe, flagą do obliczania średniej korelacji tylko z komórkami, które dotyka (3 lub 5 komórek). Dzięki!

+1

Prawdopodobnie szukasz funkcji "ogniskowej". –

+0

'focal()' przyjmuje tylko obiekt warstwy rastrowej jako argument, a nie stos. Nie będzie on wyodrębniany na wielu warstwach. –

Odpowiedz

5

Nie wierzę, że sugestia @ Pascala o użyciu focal() może zadziałać, ponieważ focal() przyjmuje pojedynczą warstwę rastrową jako argument, a nie stos. To jest rozwiązanie, które jest najłatwiejsze do zrozumienia. Można zwiększyć wydajność, minimalizując liczbę wyodrębniania wartości dla każdej komórki ogniskowej:

library(raster) 

set.seed(2002) 
r1 <- raster(matrix(runif(25),nrow=5)) 
r2 <- raster(matrix(runif(25),nrow=5)) 
r3 <- raster(matrix(runif(25),nrow=5)) 
r4 <- raster(matrix(runif(25),nrow=5)) 
s <- stack(r1,r2,r3,r4) 

## Calculate adjacent raster cells for each focal cell: 
a <- adjacent(s, 1:ncell(s), directions=8, sorted=T) 

## Create column to store correlations: 
out <- data.frame(a) 
out$cors <- NA 

## Loop over all focal cells and their adjacencies, 
## extract the values across all layers and calculate 
## the correlation, storing it in the appropriate row of 
## our output data.frame: 
for (i in 1:nrow(a)) { 
    out$cors[i] <- cor(c(s[a[i,1]]), c(s[a[i,2]])) 
} 

## Take the mean of the correlations by focal cell ID: 
r_out_vals <- aggregate(out$cors, by=list(out$from), FUN=mean) 

## Create a new raster object to store our mean correlations in 
## the focal cell locations: 
r_out <- s[[1]] 
r_out[] <- r_out_vals$x 

plot(r_out) 
+0

sprytny! Nie wiedziałem o "sąsiedztwie". Próbowałem użyć 'focal' z pętlą' for' do zmiany macierzy wag i 'stackApply' w celu wyodrębnienia niezbędnych wartości do ramek danych ... samego pomysłu, ale nie tak gładkiego. i kłopotliwy ból głowy. dzięki! – Dominik

+1

Istnieje również metoda "corLocal", ale jest to dla nieco innego przypadku. – RobertH

+0

Nie ma za co, a dzięki Robertowi (oprócz pisania paczki) za wymienienie funkcji corLocal, jest to ogromna oszczędność czasu w bardziej powszechnym przypadku użycia korelacji, dla którego został zaprojektowany. –

Powiązane problemy