Es ist eine großartige Sache, die geschätzten Steigungen wie in der Frage zu zeichnen. Anstatt jedoch nach Signifikanz zu filtern - oder in Verbindung damit - warum nicht ein Maß dafür bestimmen, wie gut jede Regression zu den Daten passt? Dafür ist der mittlere quadratische Fehler der Regression leicht zu interpretieren und aussagekräftig.
Der folgende R
Code generiert beispielsweise eine Zeitreihe mit 11 Rastern, führt die Regressionen durch und zeigt die Ergebnisse auf drei Arten an: in der unteren Zeile als separate Raster aus geschätzten Steigungen und mittleren quadratischen Fehlern; in der obersten Reihe als Überlagerung dieser Gitter zusammen mit den wahren darunterliegenden Gefällen (die Sie in der Praxis niemals haben werden, die aber die Computersimulation zum Vergleich bietet). Die Überlagerung ist in diesem Beispiel nicht einfach zu interpretieren, da sie Farbe für eine Variable (geschätzte Neigung) und Helligkeit für eine andere (MSE) verwendet. Sie kann jedoch zusammen mit den separaten Karten in der unteren Reihe nützlich und interessant sein.
(Bitte ignorieren Sie die überlappenden Legenden auf dem Overlay. Beachten Sie auch, dass das Farbschema für die Karte "Wahre Steigungen" nicht ganz das gleiche ist wie für die Karten der geschätzten Steigungen: Ein zufälliger Fehler führt dazu, dass sich einige der geschätzten Steigungen über a erstrecken Extremer Bereich als die tatsächlichen Steigungen. Dies ist ein allgemeines Phänomen im Zusammenhang mit der Regression zum Mittelwert .)
Übrigens ist dies nicht die effizienteste Methode, um eine große Anzahl von Regressionen für denselben Zeitraum durchzuführen : Stattdessen kann die Projektionsmatrix vorab berechnet und auf jeden "Stapel" von Pixeln angewendet werden, anstatt sie für jede Regression neu zu berechnen. Für diese kleine Illustration spielt das aber keine Rolle.
# 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))