Nothing
# this script is try to fit the Argo data at North Atlantic Ocean
# large-scale mapping using global sinusoidal or Mollweide projection.
load("tests/data/argo_2018_10.Rdata")
data(argo_float)
str(argo_float)
argo_al$JulDay <- NULL
nrow(argo_df)
argo_df$Long <- (argo_df$Long + 180) %% 360 - 180
names(argo_df)
library(maps)
library(ggplot2)
library(splancs)
library(viridis)
# North Atlantic Ocean
world_map <- ggplot2::map_data("world")
sel_lon = c(-80, -6, -6, -80)
sel_lat = c(50, 50, 0, 0)
sel_poly <- cbind(sel_lon, sel_lat)
argo_idx_sel <- inout(with(argo_df, cbind(Long, Lat)), sel_poly)
idx <- inout(with(world_map, cbind(long, lat)), sel_poly)
# Plot
gg <- ggplot(world_map[idx, ], aes(x = long, y = lat)) +
geom_polygon(aes(group=group), fill = "grey70", color = "white") +
geom_point(
data = as.data.frame(argo_df[argo_idx_sel,]),
aes(x = Long, y = Lat, col = temp_10), size = 0.7
) +
scale_color_gradientn(colours = viridis(100)) +
coord_fixed(1.3) +
theme_void()
print(gg)
# Project longlat -> x and y
library(sp)
coordinates(argo_df) <- ~ Long + Lat
proj4string(argo_df) <- CRS("+proj=longlat +datum=WGS84")
moll_crs <- "+proj=moll +lon_0=0 +x_0=0 +y_0=0 +datum=WGS84 +units=km +no_defs"
argo_df_xy <- spTransform(argo_df, CRS(moll_crs))
head(argo_df_xy)
# INLA build mesh
library(INLA)
argo_al <- argo_df_xy[argo_idx_sel, ]
mesh <- fmesher::fm_mesh_2d(coordinates(argo_al),
max.n = 1000, cutoff=100, max.edge = c(200, 1000))
mesh$n
plot(mesh)
points(coordinates(argo_al))
head(argo_al)
str(argo_al)
# plot salinity + temperature
gtemp <- ggplot(data = as.data.frame(argo_al)) +
geom_point(aes(x=Long, y=Lat, col=temp_10)) +
scale_color_gradientn(colours = viridis(100))
gpsal <- ggplot(data = as.data.frame(argo_al)) +
geom_point(aes(x=Long, y=Lat, col=psal_10)) +
scale_color_gradientn(colours = viridis(100))
library(gridExtra)
grid.arrange(gtemp, gpsal, ncol = 2)
##### ngme fit
library(ngme2)
myspde <- model_matern(
mesh=mesh,
loc=coordinates(argo_al),
name="spde"
)
############################## Model 1
m0 <- y ~ 1 + lat +
# f(lat, model="rw1", noise=noise_normal()) +
f(model=myspde, noise=noise_nig())
res0 <- ngme(
formula = m0,
data = list(y = argo_al$temp_10,
lat = scale(argo_al@coords[, 2])),
control = control_opt(
iterations = 1000,
stepsize = 0.5,
n_parallel_chain = 4
),
family = "normal"
)
res0
traceplot(res0, "mn")
traceplot(res0, "beta")
traceplot(res0, "spde")
w <- res0$models[["field1"]]$W
length(w)
plot(w)
############################## Model 2
# 1. interpolate salinity first
mod_sal <- ngme(
formula = sal ~ 1 + f(model=myspde, noise=noise_nig()),
data = list(
sal = argo_al$psal_10
),
control = control_opt(
iterations = 1000,
n_parallel_chain = 4
)
)
mod_sal
sal_intp <- predict(mod_sal, data=rep(1, mesh$n), loc=list(myspde=mesh$loc[, 1:2]))
# 2. fit the non-stationary model with intepolated salinity
# non-stationary mu
m1 <- y ~ 1 + f(model=myspde, noise=noise_nig(
theta_mu = c(0, 0),
# B_mu = cbind(1, scale(mesh$loc[, 2]))
B_mu = cbind(1, sal_intp)
))
mod_temp <- ngme(
formula = m1,
data = list(y = argo_al$temp_10),
control = control_opt(
iterations = 1000,
n_parallel_chain = 4
),
family = "normal"
)
mod_temp
traceplot(mod_temp, "mn")
traceplot(mod_temp, "spde")
traceplot2(mod_temp, "spde", "mu", 2)
p1 <- traceplot2(mod_temp, "spde", "sigma")
p1 + ylim(0, 0.1)
#
m1 <- y ~ 1 + f(model=myspde, noise=noise_nig(
theta_mu = c(0, 0),
# B_mu = cbind(1, scale(mesh$loc[, 2]))
B_mu = cbind(1, sal_intp-mean(sal_intp))
))
mod_temp <- ngme(
formula = m1,
data = list(y = argo_al$temp_10),
control = control_opt(
iterations = 1000,
n_parallel_chain = 4,
max_relative_step = 20,
max_absolute_step = 20
),
family = "normal"
)
mod_temp
traceplot(mod_temp, "mn")
traceplot(mod_temp, "spde")
Any scripts or data that you put into this service are public.
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.