Vẽ các sườn dốc ước tính, như trong câu hỏi, là một điều tuyệt vời để làm. Tuy nhiên, thay vì lọc theo mức độ quan trọng - hoặc kết hợp với nó - tại sao không vạch ra một số biện pháp về mức độ mỗi hồi quy phù hợp với dữ liệu? Đối với điều này, lỗi bình phương trung bình của hồi quy dễ dàng được giải thích và có ý nghĩa.
Ví dụ, R
mã dưới đây tạo ra một chuỗi thời gian gồm 11 raster, thực hiện hồi quy và hiển thị kết quả theo ba cách: ở hàng dưới cùng, như các lưới riêng biệt của độ dốc ước tính và lỗi bình phương; ở hàng trên cùng, vì lớp phủ của các lưới đó cùng với các sườn bên dưới thực sự (mà trong thực tế bạn sẽ không bao giờ có, nhưng được mô phỏng bằng máy tính để so sánh). Lớp phủ, vì nó sử dụng màu cho một biến (độ dốc ước tính) và độ sáng cho một biến khác (MSE), không dễ diễn giải trong ví dụ cụ thể này, nhưng cùng với các bản đồ riêng ở hàng dưới cùng có thể hữu ích và thú vị.
(Vui lòng bỏ qua các huyền thoại chồng chéo trên lớp phủ. Lưu ý rằng sơ đồ màu cho bản đồ "Độ dốc thực" không hoàn toàn giống với bản đồ của các độ dốc ước tính: lỗi ngẫu nhiên khiến một số độ dốc ước tính kéo dài phạm vi cực đoan hơn độ dốc thực sự. Đây là một hiện tượng chung liên quan đến hồi quy trung bình .)
BTW, đây không phải là cách hiệu quả nhất để thực hiện một số lượng lớn hồi quy cho cùng một khoảng thời gian: thay vào đó, ma trận chiếu có thể được tính toán trước và áp dụng cho từng "ngăn xếp" pixel nhanh hơn so với tính toán lại cho mỗi hồi quy. Nhưng điều đó không quan trọng đối với minh họa nhỏ này.
# 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))