base_name = paste(knitr::current_input(), '_figs/', sep='') knitr::opts_chunk$set( cache.path=paste('_knitr_cache/', base_name, sep='/'), fig.path=paste('figure/', base_name, sep='/'), dpi=300 ) suppressPackageStartupMessages(library(tidyverse)) suppressPackageStartupMessages(library(mvtnorm)) suppressPackageStartupMessages(library(viridis)) suppressPackageStartupMessages(library(lhs))
f = function(theta) { theta = matrix(theta, ncol=2) x = cbind(theta[,1], theta[,2]+0.03*theta[,1]^2-3) dmvnorm(x, c(0,0), diag(c(100, 1))) } df = crossing(theta1 = seq(-22, 22, .5), theta2 = seq(-12,7,.5)) %>% mutate(f = f(cbind(theta1,theta2))) ggplot(df) + geom_raster(aes(x=theta1, y=theta2, fill=f)) + geom_contour(aes(x=theta1, y=theta2, z=f), col='black', bins=10) + scale_fill_viridis()
set.seed(123) lhs = maximinLHS(n=100, k=2) %>% as_data_frame %>% setNames(c('theta1', 'theta2')) %>% mutate(theta1 = theta1 * 40 - 20, theta2 = theta2 * 15 - 10) design = lhs %>% mutate(f = f(cbind(theta1, theta2))) ggplot(design) + geom_point(aes(x=theta1, y=theta2, colour=f), cex=4) + scale_colour_viridis()
doit = function(r, design) { m = nrow(design) theta = design %>% select(-f) %>% as.matrix ff = design %>% select(f) %>% pull GGfun = function(xx, yy, sigma2) { drop(exp(-0.5/sigma2[1] * outer(xx[,1], yy[,1], '-')^2 -0.5/sigma2[2] * outer(xx[,2], yy[,2], '-')^2)) } # leave-one-out MSE as function of the kernel width wmscv = function(sigma2) { GGinv_ = solve(GGfun(theta, theta, sigma2)) ee_ = drop(1/diag(GGinv_) * GGinv_ %*% sqrt(ff)) wmscv = 1/m * drop(ee_ %*% diag(diag(GGinv_)) %*% ee_) return(wmscv) } # minimise wmscv wrt sigma2 opt = optim(c(1,1), wmscv) sigma2_opt = opt$par # apply approximation GG_ = GGfun(theta, theta, sigma2_opt) bb = drop(solve(GG_, sqrt(ff))) # approximate target function at input points bGG2b_ = drop(bb %*% GGfun(theta, theta, 2*sigma2_opt) %*% bb) post_r = apply(r, 1, function(rr) { gg = GGfun(matrix(rr, nrow=1), theta, sigma2_opt) (sum(bb * gg))^2 / (sqrt(pi^2*prod(sigma2_opt)) * bGG2b_) }) return(post_r) }
post_r_approx = df %>% mutate(fhat = doit(cbind(theta1, theta2), design))
ggplot(post_r_approx, aes(x=theta1, y=theta2)) + geom_raster(aes(fill=f)) + geom_contour(aes(z=fhat, colour=..level..)) + geom_point(data=design, mapping=aes(x=theta1, y=theta2), pch=1, cex=4, colour='white') + scale_colour_viridis() + scale_fill_viridis()
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.