Một cách tiếp cận khác có thể được sử dụng cho các GAM được trang bị bằng phần mềm mgcv của Simon Wood cho R là thực hiện suy luận sau từ GAM được trang bị cho tính năng quan tâm. Về cơ bản, điều này liên quan đến việc mô phỏng từ phân phối sau của các tham số của mô hình được trang bị, dự đoán các giá trị của đáp ứng trên một lưới mịnx địa điểm, tìm kiếm x trong đó đường cong được trang bị có giá trị tối đa của nó, lặp lại cho nhiều mô hình mô phỏng và tính toán độ tin cậy cho vị trí của cực đại là các lượng tử phân phối tối ưu từ các mô hình mô phỏng.
Thịt từ những gì tôi trình bày dưới đây được lấy từ trang 4 của ghi chú khóa học của Simon Wood (pdf)
Để có một cái gì đó giống với một ví dụ sinh khối, tôi sẽ mô phỏng sự phong phú của một loài dọc theo một độ dốc bằng cách sử dụng gói coenocliner của tôi .
library("coenocliner")
A0 <- 9 * 10 # max abundance
m <- 45 # location on gradient of modal abundance
r <- 6 * 10 # species range of occurence on gradient
alpha <- 1.5 # shape parameter
gamma <- 0.5 # shape parameter
locs <- 1:100 # gradient locations
pars <- list(m = m, r = r, alpha = alpha,
gamma = gamma, A0 = A0) # species parameters, in list form
set.seed(1)
mu <- coenocline(locs, responseModel = "beta", params = pars, expectation = FALSE)
Phù hợp với GAM
library("mgcv")
m <- gam(mu ~ s(locs), method = "REML", family = "poisson")
... dự đoán về một lưới tốt trong phạm vi x( locs
) ...
p <- data.frame(locs = seq(1, 100, length = 5000))
pp <- predict(m, newdata = p, type = "response")
và trực quan hóa chức năng được trang bị và dữ liệu
plot(mu ~ locs)
lines(pp ~ locs, data = p, col = "red")
Điều này tạo ra
5000 vị trí dự đoán có thể là quá mức cần thiết ở đây và chắc chắn cho cốt truyện, nhưng tùy thuộc vào chức năng được trang bị trong trường hợp sử dụng của bạn, bạn có thể cần một lưới tốt để đến gần mức tối đa của đường cong được trang bị.
Bây giờ chúng ta có thể mô phỏng từ phía sau của mô hình. Đầu tiên chúng ta có đượcXpma trận; ma trận, một khi được nhân với hệ số mô hình sẽ đưa ra dự đoán từ mô hình tại các vị trí mớip
Xp <- predict(m, p, type="lpmatrix") ## map coefs to fitted curves
Tiếp theo, chúng tôi thu thập các hệ số mô hình được trang bị và ma trận hiệp phương sai (Bayes) của chúng
beta <- coef(m)
Vb <- vcov(m) ## posterior mean and cov of coefs
Các hệ số là một bình thường đa biến với vectơ trung bình beta
và ma trận hiệp phương sai Vb
. Do đó, chúng ta có thể mô phỏng từ hệ số mới thông thường đa biến này cho các mô hình phù hợp với mô hình được trang bị nhưng khám phá sự không chắc chắn trong mô hình được trang bị. Ở đây chúng tôi tạo ra 10000 ( n
) `mô hình mô phỏng
n <- 10000
library("MASS") ## for mvrnorm
set.seed(10)
mrand <- mvrnorm(n, beta, Vb) ## simulate n rep coef vectors from posterior
Bây giờ chúng ta có thể tạo dự đoán cho các n
mô hình mô phỏng, chuyển đổi từ thang đo của dự báo tuyến tính sang thang đo đáp ứng bằng cách áp dụng nghịch đảo của hàm liên kết ( ilink()
) và sau đó tính toánxgiá trị (giá trị của p$locs
) tại điểm cực đại của đường cong được trang bị
opt <- rep(NA, n)
ilink <- family(m)$linkinv
for (i in seq_len(n)) {
pred <- ilink(Xp %*% mrand[i, ])
opt[i] <- p$locs[which.max(pred)]
}
Bây giờ chúng tôi tính toán khoảng tin cậy cho tối ưu bằng cách sử dụng các lượng tử xác suất của phân phối 10.000 tối ưu, một cho mỗi mô hình mô phỏng
ci <- quantile(opt, c(.025,.975)) ## get 95% CI
Đối với ví dụ này, chúng tôi có:
> ci
2.5% 97.5%
39.06321 52.39128
Chúng ta có thể thêm thông tin này vào cốt truyện trước đó:
plot(mu ~ locs)
abline(v = p$locs[which.max(pp)], lty = "dashed", col = "grey")
lines(pp ~ locs, data = p, col = "red")
lines(y = rep(0,2), x = ci, col = "blue")
points(y = 0, x = p$locs[which.max(pp)], pch = 16, col = "blue")
sản xuất
Như chúng ta mong đợi được cung cấp dữ liệu / quan sát, khoảng thời gian trên tối ưu được trang bị khá bất đối xứng.
Slide 5 trong ghi chú khóa học của Simon cho thấy lý do tại sao phương pháp này có thể được ưa thích hơn để bootstrapping. Ưu điểm của mô phỏng sau là nhanh chóng - GAM khởi động chậm. Hai vấn đề khác với bootstrapping là (lấy từ ghi chú của Simon!)
- Đối với việc khởi động tham số tham số độ lệch làm mịn gây ra các vấn đề, mô hình được mô phỏng từ bị sai lệch và sự phù hợp với các mẫu sẽ còn sai lệch hơn.
- Đối với việc 'lấy mẫu lại trường hợp' không tham số ', sự hiện diện của các bản sao sao chép của cùng một dữ liệu gây ra sự thiếu sót, đặc biệt là với lựa chọn độ mịn dựa trên GCV.
Cần lưu ý rằng mô phỏng sau được thực hiện ở đây là có điều kiện dựa trên các tham số độ mịn đã chọn cho mô hình / spline. Điều này có thể được tính đến, nhưng các ghi chú của Simon cho thấy điều này tạo ra sự khác biệt nhỏ nếu bạn thực sự gặp rắc rối khi thực hiện nó. (vì vậy tôi đã không ở đây ...)