2016-06-05 7 views
2

У меня есть два растровых стека, и я хочу провести анализ регрессии. Если каждый растр в каждом стеке составлял месяц в году (6 точек данных составляли бы три месяца в два года, т. Е. Январь, февраль и март в течение двух разных лет), как я могу рассчитать наклон, используя индексы, так что результат генерирует 3 наклонные растры (по одному на каждый месяц), пожалуйста?Растровая линейная и условная регрессия с использованием растровых стеков по месяцам в R

#First raster track 
r <- raster(ncol=10, nrow=10) 
r[]=1:ncell(r) 
S <- stack(r,r,r,r,r,r) 

#Second raster stack 
r1 <- raster(ncol=10, nrow=10) 
r1[]=1:ncell(r1) 
N <- stack(r1,r1,r1,r1,r1,r1) 

#combine both raster stacks 
s <- stack(S,N) 

#function to calculate slope 
fun=function(x) { if (is.na(x[1])){ NA } else { lm(x[7:12] ~ x[1:6])$coefficients [2]}} 

#apply function 
slope <- calc(s, fun) 

Результат должен быть 3 растров.

Второй вопрос: Если бы я хотел сделать условную регрессию с использованием третьего растрового стека, какими были бы коды?

ответ

2

Try весело с 1:12

fun(1:12) 

# Error in model.frame.default(formula = x[6:12] ~ x[1:6], drop.unused.levels = TRUE) : 
# variable lengths differ (found for 'x[1:6]') 

должно быть

fun=function(x) { if (is.na(x[1])){ NA } else { lm(x[7:12] ~ x[1:6])$coefficients [2]}} 

Рабочий пример

library(raster) 
r <- raster(ncol=10, nrow=10) 
set.seed(99) 
s <- stack(sapply(1:12, function(i) setValues(r, runif(ncell(r))))) 

fun <- function(x) { if (is.na(x[1])){ NA } else { lm(x[7:12] ~ x[1:6])$coefficients [2]}} 

slope <- calc(s, fun) 

Для трех трасс:

fun3 <- function(x) { 
    r <- rep(NA, 3) 
    if (!is.na(x[1])) { 
     r[1] <- lm(x[3:4] ~ x[1:2])$coefficients[2] 
     r[2] <- lm(x[7:8] ~ x[5:6])$coefficients[2] 
     r[3] <- lm(x[11:12] ~ x[9:10])$coefficients[2] 
    } 
    r 
} 

slope3 <- calc(s, fun3) 
+0

Спасибо за исправление @RobertH. Любые идеи о том, как проводить регрессию по индексам или месяцам, пожалуйста? –

+0

Я добавил, что – RobertH