Линейная регрессия между двумя растровыми изображениями в R

Мне нужна линейная регрессия для расчета эмпирического параметра. L1 - растровое изображение, формат.tif. L2 также является растровым изображением, рассчитанным заранее. Оба изображения имеют одинаковое количество столбцов и строк.

Формула имеет вид: L1 = a + b * L2, что переводится в R как:

lm(L1 ~ L2)

Во второй формуле мне позже понадобится nd b.

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

Редактировать: пока у меня есть этот код:

s = stack(L1,L2)
fun = function(x) {if (is.na(x[1])) { NA } else {lm(x[1] ~ x[2])$coefficients[2]}}

Тем не менее, это требует очень много времени для расчета и не приводит к результату

1 ответ

Решение

Вы бы использовали calc если вы хотите сделать локальную регрессию, это отдельная регрессия для каждой ячейки сетки (пикселя). Но это не имеет смысла в этом случае, поскольку у вас есть только два растра; и, следовательно, только одна точка данных на ячейку сетки.

В вашем случае вы хотите глобальной регрессии. Вы можете это так:

s <- stack(L1, L2)
v <- data.frame(na.omit(values(s)))
# this step may not be necessary
names(v) <- c('L1', 'L2')
m <- lm(L2 ~ L1, data=v)
m

если s слишком велик для этого, вы можете сделать что-то вроде

v <- sampleRegular(s, 100000)  
v <- data.frame(na.omit(v))

и т.п.

Другие вопросы по тегам