Здесь я нашел очень интересный блог: критический порог в температурные эффекты и эмпирический подход очень интересны, поэтому я хочу реализовать его идею в R. Тем не менее, у меня есть многослойные растровые данные исторической суточной температуры Германии (историческая среднесуточная температура за 15 лет) в больших RasterBrick объект. Согласно эмпирическому подходу, описанному в вдохновенном посте < / a>, мне нужно построить распределение температуры из моих многослойных растровых данных.

Обновление 2: воспроизводимый шейп-файл :

Я знаю, что загрузка шейп-файла со стороннего веб-сайта нецелесообразна, поэтому здесь я предлагаю воспроизводимый шейп-файл, чтобы попробовать:

library(sf)
library(maps)
library(rgeos)
library(mapdata)

germany <- st_as_sf(map("Germany", plot = FALSE, fill = TRUE))
write_sf(germany, "germany.shp")

Чтобы легко продолжить мой пост, я создал воспроизводимые растровые данные для работы в R. Я также предоставляю шейп-файл Германии, взятый с веб-сайта Евростата; вот шейп-файл на лету (я могу гарантировать, что ссылка вполне безопасна, а файл очень мал для использования): shapefile евростата < / a> и вот удобные воспроизводимые растровые данные:

воспроизводимые данные

library(raster)
library(lubridate)
library(tidyverse)

r <- raster(xmn=5.75, xmx= 15, ymn = 47.25, ymx =55,res=c(0.25,0.25))
Deu_crop <- do.call(stack,lapply(1:5479,function(i) setValues(r,round(runif(n = ncell(r),min = -10,max = 25)))))
names(Deu_crop) <- paste0('X',gsub('-','.',ymd('1980.01.01') + days(1:5479)))
shp <- shapefile('eurostat_NUTS3/deu_adm_2006.shp')
e <- raster::extract(Deu_crop,shp)
names(e) <- shp$NUTS_ID

Чтобы протестировать рабочий процесс, представленный в вдохновленном посте < / a>, мне нужно разработать несколько глобальных переменных, которые будут использоваться в вспомогательных функциях, представленных в здесь. Но я не понимаю, как спроектировать некоторые критические глобальные переменные, которые используются для выполнения его рабочего процесса; Рекомендуется определять глобальную переменную типа: w - данные о погоде; tempDat: отдельные агрегированные данные о погоде; Trows: охват агрегированных данных сетки; и T: вектор целочисленной температуры (подробности можно найти здесь: подробнее).

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

Вот мой подход к агрегированию многослойных растровых данных для каждого полигона из шейп-файла (шейп-файл Евростата) перед использованием вспомогательной функции в вдохновенном посте:

первая попытка манипулировать многослойным растром :

rasterHelper <- function(ix,e){
  gather(data.frame(e[[ix]],stringsAsFactors = F),'colname','temp') %>% 
    group_by(colname) %>% summarise(temp = mean(temp)) %>% ungroup() %>% # spatial mean
    mutate(year = sub('X(\\d{4}).+','\\1',colname)) %>% 
    group_by(year) %>% summarise_all(funs(sum)) %>% mutate(NUTS_ID = names(e)[ix])
}
do.call(rbind,lapply(1:length(e),function(ix) rasterHelper(ix)))

Но моя вышеупомянутая попытка не работает; В своей попытке я собираюсь агрегировать растровые данные температуры для каждого полигона. Реализация вдохновленного сообщения очень полезно, но все еще сложно отслеживать работу с многослойными растровыми данными. Я предполагаю, что должен работать над каждым растровым слоем и построить распределение температуры во времени, но на самом деле не имею твердого представления, как это сделать в R. Есть идеи?

Обновление :

Вот статья, которая меня вдохновила: нелинейный температурный эффект ... , но реализовать предложенный метод для меня все еще сложно, даже если я следил за рабочим процессом, представленным в соответствующем блоге: поиск критического порога в температурном эффекте

Кто-нибудь укажет мне, как применить его эмпирический подход к многослойным растровым данным в R? Как я могу оценить распределение температуры во времени? Как я могу сделать это в R? Еще мысли? Спасибо

6
jyson 20 Июн 2018 в 07:42

1 ответ

Лучший ответ

Я не совсем уверен, что ты хочешь делать.

Чтобы настроить меньший пример:

library(raster)
lux <- shapefile(system.file("external/lux.shp", package="raster"))
r <- raster(lux)
s <- stack(lapply(1:12, function(i) setValues(r, 1:ncell(r))))

e <- extract(s, lux)

Теперь вы говорите, что хотите агрегировать - это немного двусмысленно, но, возможно, вы хотите

x <- lapply(e, function(i) apply(i,2,mean))

Эквивалентно

y <- extract(s, lux, fun='mean')
2
Robert Hijmans 20 Июн 2018 в 16:44