Merencanakan lereng yang diperkirakan, seperti dalam pertanyaan, adalah hal yang hebat untuk dilakukan. Namun, alih-alih memfilter berdasarkan signifikansi - atau dalam hubungannya dengan itu - mengapa tidak memetakan seberapa baik setiap regresi cocok dengan data? Untuk ini, kesalahan kuadrat rata-rata dari regresi mudah ditafsirkan dan bermakna.
Sebagai contoh, R
kode di bawah ini menghasilkan serangkaian waktu dari 11 raster, melakukan regresi, dan menampilkan hasilnya dalam tiga cara: di baris bawah, sebagai grid terpisah dari perkiraan kemiringan dan rata-rata kuadrat kesalahan; di baris atas, sebagai hamparan kisi-kisi tersebut bersama dengan kemiringan yang mendasarinya (yang dalam praktiknya tidak akan pernah Anda miliki, tetapi diberikan oleh simulasi komputer untuk perbandingan). Hamparan, karena menggunakan warna untuk satu variabel (perkiraan kemiringan) dan kecerahan untuk yang lain (MSE), tidak mudah untuk ditafsirkan dalam contoh khusus ini, tetapi bersama dengan peta yang terpisah di baris bawah mungkin berguna dan menarik.
(Harap abaikan legenda tumpang tindih pada hamparan. Perhatikan juga, bahwa skema warna untuk peta "Lereng benar" tidak persis sama dengan yang digunakan untuk peta perkiraan lereng: kesalahan acak menyebabkan beberapa perkiraan lereng menjangkau span). kisaran yang lebih ekstrem daripada lereng sejati. Ini adalah fenomena umum yang terkait dengan regresi menuju rata-rata .)
BTW, ini bukan cara paling efisien untuk melakukan sejumlah besar regresi untuk rangkaian waktu yang sama: sebagai gantinya, matriks proyeksi dapat dihitung dan diterapkan ke setiap "tumpukan" piksel lebih cepat daripada mengkomputasi ulang untuk setiap regresi. Tapi itu tidak masalah untuk ilustrasi kecil ini.
# Specify the extent in space and time.
#
n.row <- 60; n.col <- 100; n.time <- 11
#
# Generate data.
#
set.seed(17)
sd.err <- outer(1:n.row, 1:n.col, function(x,y) 5 * ((1/2 - y/n.col)^2 + (1/2 - x/n.row)^2))
e <- array(rnorm(n.row * n.col * n.time, sd=sd.err), dim=c(n.row, n.col, n.time))
beta.1 <- outer(1:n.row, 1:n.col, function(x,y) sin((x/n.row)^2 - (y/n.col)^3)*5) / n.time
beta.0 <- outer(1:n.row, 1:n.col, function(x,y) atan2(y, n.col-x))
times <- 1:n.time
y <- array(outer(as.vector(beta.1), times) + as.vector(beta.0),
dim=c(n.row, n.col, n.time)) + e
#
# Perform the regressions.
#
regress <- function(y) {
fit <- lm(y ~ times)
return(c(fit$coeff[2], summary(fit)$sigma))
}
system.time(b <- apply(y, c(1,2), regress))
#
# Plot the results.
#
library(raster)
plot.raster <- function(x, ...) plot(raster(x, xmx=n.col, ymx=n.row), ...)
par(mfrow=c(2,2))
plot.raster(b[1,,], main="Slopes with errors")
plot.raster(b[2,,], add=TRUE, alpha=.5, col=gray(255:0/256))
plot.raster(beta.1, main="True slopes")
plot.raster(b[1,,], main="Estimated slopes")
plot.raster(b[2,,], main="Mean squared errors", col=gray(255:0/256))