2015-06-19 16 views
6

4 dizi yığınım var. Bir piksel ile 8 komşusunun her biri arasındaki zaman arasındaki ortalama ilişkiyi istiyorum. zaman aralığı boyunca komşu pikseller için ortalama korelasyonu hesaplar

bazı veriler: NE 8 komşu olan, x konumuna, bir piksel için çok

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) 

, D, GD, S vb pozisyonları, I ortalama isteyen

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

ve oluşan rasterdeki x pozisyonunda kaydedilen ortalama değer. Kenar hücreleri NA olabilir ya da mümkünse, sadece dokunduğu hücrelerle (3 ya da 5 hücre) ortalama korelasyonu hesaplayan bir bayrak olacaktır. Teşekkürler!

+1

Muhtemelen 'fokal' işlevini arıyorsunuzdur. –

+0

'focal()', yalnızca bir raster katman nesnesini bir argüman olarak alır, yığın olarak değil. Birden çok katmana ayıklanmaz. –

cevap

5

@ Pascal'ın focal() kullanım önerisinin işe yaramayacağına inanıyorum çünkü focal(), bir yığın olarak değil, tek bir raster katmanı alır. Anlaması en kolay çözüm budur. Her bir fokal hücre için değerleri çıkardığınız zaman sayısını en aza indirerek daha verimli hale getirilebilir:

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

zeki! Ben komşu hakkında bilmiyordum. Gerekli değerleri bir veri çerçevesine çıkarmak için ağırlık matrisini ve 'stackApply'ı değiştirmek için' for' döngüsüyle 'fokal'ı kullanmaya çalışıyordum. ve bir defter tutma baş ağrısı. Teşekkürler! – Dominik

+1

Ayrıca 'corLocal' yöntemi de var, ama bu biraz farklı bir durum için. – RobertH

+0

Hoşgeldin, ve Robert (paketin yazılmasına ek olarak) corLocal işlevinden bahsetmek için teşekkürler, bunun için tasarlanmış daha yaygın korelasyon kullanım durumunda büyük bir zaman tasarrufu. –