Соотнесите каждый растровый слой в кирпиче со значениями в кадре данных R - PullRequest
0 голосов
/ 06 ноября 2018

У меня есть этот фрейм данных в R:

library(raster)    

# create a random dataframe with yearly values for each column
df <- data.frame(year = seq(1981,2012), a = runif(32,1,33), b = rnorm(32, 6, 18), c = rnorm(32, 3, 12), 
                 d = rnorm(32, 0, 18))

а затем этот многослойный растр:

rs <- stack()

for (i in 1:1:32){
  xy <- matrix(rnorm(400),20,20)
  # Turn the matrix into a raster
  rast <- raster(xy)
  # Give it lat/lon coords for 20-30°E, 43-49°N
  extent(rast) <- c(20,30,43,49)
  rs <- addLayer(rs, rast)
}


# create a Z field for raster just created
years <- seq(as.Date("1981-01-01"), as.Date("2012-12-31"), by = "years")
aa <- setZ(rs, years)
names(rs) <- years

Мой вопрос: как можно получить пять растров, представляющих корреляцию (скажем, Спирмена) между каждым столбцом в фрейме данных df и растровым стеком rs ?

Спасибо всем за помощь!

Ответы [ 2 ]

0 голосов
/ 07 ноября 2018

Ну, я нашел решение; не знаю, если это лучше, но я думаю, что работает. Вот пример для столбца a из df; Я создал фиктивный растровый слой для каждой строки в столбце a; после этого я использовал corLocal для получения корреляции:

### create a raster layer for each row (year) for column 'a' in df
rs.r <- stack()
library(data.table)

### extract x and y coordinates for raster rs to create a raster stack 
cord <- rasterToPoints(rs[[1]], spatial = F)
cord<- cord[,1:2]
head(cord)

### create a raster where each layer is the value in column a from df
year.s <- unique(df$year)

for (i in 1:length(df$year)){
  print(df$year[i])
  re <- df$a[df$year==year.s[i]]
  c <- data.table(x = cord[,1], y = cord[,2], tt = re)
  m <- rasterFromXYZ(c)
  crs(m) <- "+proj=longlat +datum=WGS84 +ellps=WGS84 +towgs84=0,0,0 "
  rs.r <- addLayer(rs.r, m)
  crs(rs.r) <-" +proj=longlat +datum=WGS84 +ellps=WGS84 +towgs84=0,0,0"
}

names(rs.r) <- df$year ### set the names for the layers

ext <- extent(rs)
rs.r <- setExtent(rs.r, ext)


rs.r<- projectRaster(rs.r, rs,method = 'ngb')

spplot(corLocal(rs.r, rs, 'spearman'))
0 голосов
/ 06 ноября 2018

Я не уверен, что именно вы хотите сделать. В каждом столбце df имеется 32 значения, а в RasterStack - 32 слоя с 400 значениями,

Возможно, вы ищете соотношение между столбцами в df и средним значением слоев? Что вы можете сделать так:

Ваши данные

set.seed(0)
df <- data.frame(year = seq(1981,2012), a=runif(32,1,33), b=rnorm(32, 6, 18), c=rnorm(32, 3, 12), d=rnorm(32, 0, 18))
r <- raster(nrow=20, ncol=20, ext=extent(20,30,43,49))
rs <- stack(lapply(1:32, function(i) setValues(r, rnorm(400,20,20))))
years <- seq(as.Date("1981-01-01"), as.Date("2012-12-31"), by = "years")
names(rs) <- years

Решение

x <- cellStats(rs, mean)
sapply(2:5, function(i) cor(x, df[,i]))
#[1]  0.123391584 -0.007801092 -0.124336155  0.060774465
...