######***###### standard parameterization ######***######
# function with spherical predictors
set.seed(0)
n <- 1000
myfun <- function(x){
sin(pi*x[,1]) + cos(2*pi*x[,2]) + cos(pi*x[,3])
}
x3d <- cbind(runif(n), runif(n), runif(n)) - 0.5
x3d <- t(apply(x3d, 1, function(x) x / sqrt(sum(x^2))))
eta <- myfun(x3d)
y <- eta + rnorm(n, sd = 0.5)
# convert x latitude and longitude
x <- cbind(latitude = acos(x3d[,3]) - pi/2,
longitude = atan2(x3d[,2], x3d[,1])) * (180 / pi)
# select first 100 points as knots
knots <- x[1:100,]
# cubic spherical spline basis
X <- basis.sph(x, knots, intercept = TRUE)
# cubic spherical spline penalty
Q <- penalty.sph(knots)
# pad Q with zeros (for intercept)
Q <- rbind(0, cbind(0, Q))
# define smoothing parameter
lambda <- 1e-5
# estimate coefficients
coefs <- psolve(crossprod(X) + n * lambda * Q) %*% crossprod(X, y)
# estimate eta
yhat <- X %*% coefs
# check rmse
sqrt(mean((eta - yhat)^2))
######***###### ridge parameterization ######***######
# function with spherical predictors
set.seed(0)
n <- 1000
myfun <- function(x){
sin(pi*x[,1]) + cos(2*pi*x[,2]) + cos(pi*x[,3])
}
x3d <- cbind(runif(n), runif(n), runif(n)) - 0.5
x3d <- t(apply(x3d, 1, function(x) x / sqrt(sum(x^2))))
eta <- myfun(x3d)
y <- eta + rnorm(n, sd = 0.5)
# convert x latitude and longitude
x <- cbind(latitude = acos(x3d[,3]) - pi/2,
longitude = atan2(x3d[,2], x3d[,1])) * (180 / pi)
# select first 100 points as knots
knots <- x[1:100,]
# cubic spherical spline basis
X <- basis.sph(x, knots, intercept = TRUE, ridge = TRUE)
# cubic spherical spline penalty (ridge)
Q <- diag(rep(c(0, 1), times = c(1, ncol(X) - 1)))
# define smoothing parameter
lambda <- 1e-5
# estimate coefficients
coefs <- psolve(crossprod(X) + n * lambda * Q) %*% crossprod(X, y)
# estimate eta
yhat <- X %*% coefs
# check rmse
sqrt(mean((eta - yhat)^2))
Run the code above in your browser using DataLab