Description Usage Arguments Details Value Note Author(s) Examples
View source: R/generate-nonstationary-grf-object.R
Creates a list containing the elements necessary for doing essential computations with the non-stationary GRF approximation.
1 2 3 4 5 | generate.nonstationary.grf.object(x.lower = -1, x.upper = 1,
y.lower = -1, y.upper = 1, resolution.x = 100,
resolution.y = 100, range.function = 1, scale.function = 1,
vector.field = c(0, 0), initial.seed = 0, params = NULL,
num.functions = NULL, function.names = NULL)
|
x.lower, x.upper, y.lower, y.upper |
Specifies the boundaries of the rectangular region that the GRF is defined on. |
resolution.x, resolution.y |
The number of grid cells used for the regular grid, in the x- and y-direction, respectively. |
range.function |
A strictly positive function that specifies the range of the GRF in each location. The function must be vectorized: It takes in an n x 2 matrix of locations and returns a vector of length n, containing the value of the range in each location. |
scale.function |
A strictly positive function that is used for controlling the scale (standard deviation) of the GRF in each location. The function must be vectorized: It takes in an n x 2 matrix of locations and returns a vector of length n, containing the value of the scale in each location. |
vector.field |
A vector field that controls nature of the non-stationarity in each location.
For a given location, the length and the direction of the corresponding vector plays the same role as 'strength.parameter' and 'direction.parameter' in |
initial.seed |
The initial seed value used when generating functions. |
params |
Optional, a list containing all of the above parameters. |
num.functions |
The number of functions to initialize the GRF object with. |
function.names |
The names of the functions to initialize the GRF object with. |
If the GRF object is to be initialized with functions, either num.functions or function.names must be specified.
An object (technically, a list) containing:
model.components |
A list containing the components defining the GRF: The precision matrix |
grid |
A |
initial.seed |
The initial seed value used when generating functions. |
params |
A list of the remaining input parameters listed above. |
For an explanation of how 'range.function', 'scale.function' and 'vector.field' affect the GRF, see the corresponding parameters 'range.parameter', 'scale.parameter', 'strength.parameter' and 'direction.parameter' in generate.grf.object.
While the parameter interpretations for the stationary GRF only hold as an approximation in the non-stationary case, it still provides useful intuition.
Mathias Isaksen mathiasleanderi@gmail.com
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 | # Example of non-stationary GRF on the square [-1, 1]^2
library(GRFics)
# A range function that increases linearly with distance.
# The range is 0.01 in the origin (0, 0), and 0.5 in the corners (±1, ±1).
range.function = function(X) {
r = sqrt(X[, 1]^2+X[, 2]^2)
return(0.01 + (0.5-0.01)*r/sqrt(2))
}
# A spiral-like vector field, where the length increases with distance from origin.
vector.field = function(X) {
r = sqrt(X[, 1]^2+X[, 2]^2)
theta = atan2(X[, 2], X[, 1]) + pi/4
return(data.frame(vx = 3*r*cos(theta), vy = 3*r*sin(theta)))
}
library(ggplot2)
# Plots of range.function and vector.field
plot.grid = generate.grid.centers(-1, 1, -1, 1, 20, 20)
range.df = cbind(plot.grid, range = range.function((plot.grid)))
# Length of vector.field is scaled by 0.02 for plotting
vector.df = cbind(plot.grid, 0.02*vector.field(plot.grid))
vector.length = sqrt(vector.df$vx^2+vector.df$vy^2)
# range.function is shown using color, while vector.field is shown using arrows
ggplot()+
geom_raster(data = range.df, aes(x = x, y = y, fill = range))+
geom_segment(data = vector.df, aes(x = x-vx/2, xend = x+vx/2,
y = y-vy/2, yend = y+vy/2),
arrow = arrow(length = unit(0.2*vector.length, "npc")))+
scale_fill_gradient(low = "blue", high = "white")+
coord_fixed()
# Prepare GRF object
grf.object = generate.nonstationary.grf.object(-1, 1, -1, 1, 100, 100,
range.function = range.function,
vector.field = vector.field,
function.names = "Original",
initial.seed = 1000)
# Extract data frame containing the 100 x 100 grid coordinates and
# the value of the GRF in each grid cell.
original.df = get.function.df(grf.object)
# Interpolate GRF on finer grid for comparison
interp.locations = generate.grid.centers(-1, 1, -1, 1, 500, 500)
interp.values = evaluate.grf(interp.locations, grf.object, rescale.method = "none")
interp.df = data.frame(x = interp.locations[, 1],
y = interp.locations[, 2],
z = interp.values,
name = "Interpolation")
# Plot of original and interpolated function
ggplot()+
geom_raster(data = rbind(original.df, interp.df),
aes(x = x, y = y, fill = z))+
coord_fixed()+
facet_grid(cols = vars(name))+
scale_fill_gradient(low = "black", high = "white")
# Create new vector field, where the direction is given by the non-stationary GRF
vector.grid = grf.object$grid # Use same 100 x 100 grid as the GRF is defined on
# Use uniform.transform = T to ensure that values are between 0 and 1 and all directions are equally respresented,
# and multiply by 2pi to get directions between 0 and 2pi (in radians)
vector.direction = 2*pi*evaluate.grf(vector.grid, grf.object, rescale.method = "uniform")
nonstat.vector.df = data.frame(
x = vector.grid$x,
y = vector.grid$y,
vx = 0.02*cos(vector.direction),
vy = 0.02*sin(vector.direction))
# Plot of random vector field (should be viewed in a large window)
ggplot()+
geom_segment(data = nonstat.vector.df, aes(x = x-vx/2, xend = x+vx/2,
y = y-vy/2, yend = y+vy/2),
arrow = arrow(length = unit(0.003, "npc")))+
coord_fixed()
|
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.