Type: | Package |
Title: | Spherical Principal Curves |
Version: | 0.1.7 |
Author: | Jongmin Lee [aut, cre], Jang-Hyun Kim [ctb], Hee-Seok Oh [aut] |
Maintainer: | Jongmin Lee <jongminlee9218@gmail.com> |
Description: | Fitting dimension reduction methods to data lying on two-dimensional sphere. This package provides principal geodesic analysis, principal circle, principal curves proposed by Hauberg, and spherical principal curves. Moreover, it offers the method of locally defined principal geodesics which is underway. The detailed procedures are described in Lee, J., Kim, J.-H. and Oh, H.-S. (2021) <doi:10.1109/TPAMI.2020.3025327>. Also see Kim, J.-H., Lee, J. and Oh, H.-S. (2020) <doi:10.48550/arXiv.2003.02578>. |
Depends: | R (≥ 3.5.0) |
License: | GPL (≥ 3) |
Encoding: | UTF-8 |
Imports: | geosphere, rgl, sphereplot, stats |
SystemRequirements: | XQuartz (on MacOS) |
LazyData: | true |
NeedsCompilation: | no |
Packaged: | 2021-10-07 00:54:46 UTC; jongminlee |
Repository: | CRAN |
Date/Publication: | 2021-10-07 06:50:02 UTC |
Calculating reconstruction error
Description
This function calculates reconstruction error.
Usage
Cal.recon(data, line)
Arguments
data |
matrix or data frame consisting of spatial locations with two columns. Each row represents longitude and latitude. |
line |
longitude and latitude of a line as a matrix or data frame with two columns. |
Details
This function calculates reconstruction error from the data to the line. Longitude should range from -180 to 180 and latitude from -90 to 90. This function requires to load 'geosphere' R package.
Value
summation of squared distance from the data to the line on the unit sphere.
Author(s)
Jongmin Lee
Examples
library(geosphere) # This function needs to load 'geosphere' R packages.
data <- rbind(c(0, 0), c(50, -10), c(100, -70))
line <- rbind(c(30, 30), c(-20, 50), c(50, 80))
Cal.recon(data, line)
Crossproduct of vectors
Description
This function performs the cross product of two three-dimensional vectors.
Usage
Crossprod(vec1, vec2)
Arguments
vec1 |
three-dimensional vector. |
vec2 |
three-dimensional vector. |
Details
This function performs the cross product of two three-dimensional vectors.
Value
three-dimensional vector.
Author(s)
Jongmin Lee
Examples
Crossprod(c(1, 1, 1), c(5,6,10))
The number of distinct points.
Description
This function calculates the number of distinct point in the given data.
Usage
Dist.pt(data)
Arguments
data |
matrix or dataframe consisting of spatial locations with two columns. Each row represents longitude and latitude. |
Details
This function calculates the number of distinct points in the given data.
Value
a numeric.
Author(s)
Jongmin Lee
Examples
Dist.pt(rbind(c(0, 0), c(0, 1), c(1, 0), c(1, 1), c(0, 0)))
Earthquake
Description
It is an earthquake data from the U.S Geological Survey that collect significant earthquakes (8+ Mb magnitude) around the Pacific Ocean since the year 1900. The data are available from (https://www.usgs.gov). Additionally, note that distribution of the data has the following features: 1) scattered, 2) curvilinear one-dimensional structure on the sphere.
Usage
data(Earthquake)
Format
A data frame consisting of time, latitude, longitude, depth, magnitude, etc.
Examples
data(Earthquake)
names(Earthquake)
# collect spatial locations (longitude/latitude) of data.
earthquake <- cbind(Earthquake$longitude, Earthquake$latitude)
library(rgl)
library(sphereplot)
library(geosphere)
#### example 1: principal geodesic analysis (PGA)
PGA(earthquake)
#### example 2: principal circle
circle <- PrincipalCircle(earthquake) # get center and radius of principal circle
PC <- GenerateCircle(circle[1:2], circle[3]) # generate Principal circle
# plot
sphereplot::rgl.sphgrid()
sphereplot::rgl.sphpoints(earthquake, radius = 1, col = "blue", size = 12)
sphereplot::rgl.sphpoints(PC, radius = 1, col = "red", size = 9)
#### example 3: spherical principal curves (SPC, SPC.Hauberg)
SPC(earthquake) # spherical principal curves.
SPC.Hauberg(earthquake) # principal curves by Hauberg on sphere.
#### example 4: local principal geodesics (LPG)
LPG(earthquake, scale = 0.5, nu = 0.2, maxpt = 20)
LPG(earthquake, scale = 0.4, nu = 0.3)
Exponential map
Description
This function performs the exponential map at (0, 0, 1) on the unit 2-sphere.
Usage
Expmap(vec)
Arguments
vec |
element of two-dimensional Euclidean vector space. |
Details
This function performs exponential map at (0, 0, 1) on the unit sphere.
vec
is an element of the tangent plane of the unit sphere at (0, 0, 1), and the result is an element of the unit sphere in three-dimensional Euclidean space.
Value
three-dimensional vector.
Author(s)
Jongmin Lee
References
Fletcher, P. T., Lu, C., Pizer, S. M. and Joshi, S. (2004). Principal geodesic analysis for the study of nonlinear statistics of shape. IEEE Transactions on Medical Imaging, 23, 995-1005.
See Also
Examples
Expmap(c(1, 2))
Finding Extrinsic Mean
Description
This function identifies the extrinsic mean of data on the unit 2-sphere.
Usage
ExtrinsicMean(data, weights = rep(1, nrow(data)))
Arguments
data |
matrix or data frame consisting of spatial locations with two columns. Each row represents longitude and latitude (denoted by degrees). |
weights |
vector of weights. |
Details
This function identifies the extrinsic mean of data.
Value
two-dimensional vector.
Note
In the case of spheres, if data set is not contained in a hemisphere, then it is possible that the extrinsic mean of the data set does not exists; for example, a great circle.
Author(s)
Jongmin Lee
References
Jongmin Lee, Jang-Hyun Kim and Hee-Seok Oh. (2021). Spherical Principal Curves. IEEE Transactions on Pattern Analysis and Machine Intelligence, 43, 2165-2171. <doi.org/10.1109/TPAMI.2020.3025327>. Jang-Hyun Kim, Jongmin Lee and Hee-Seok Oh. (2020). Spherical Principal Curves <arXiv:2003.02578>.
See Also
Examples
#### comparison of Intrinsic mean and extrinsic mean.
#### example: noisy circular data set.
library(rgl)
library(sphereplot)
library(geosphere)
n <- 500 # the number of samples.
x <- 360 * runif(n) - 180
sigma <- 5
y <- 60 + sigma * rnorm(n)
simul.circle <- cbind(x, y)
data <- simul.circle
In.mean <- IntrinsicMean(data)
Ex.mean <- ExtrinsicMean(data)
## plot (color of data is "blue"; that of intrinsic mean is "red" and
## that of extrinsic mean is "green".)
sphereplot::rgl.sphgrid()
sphereplot::rgl.sphpoints(data, radius = 1, col = "blue", size = 12)
sphereplot::rgl.sphpoints(In.mean[1], In.mean[2], radius = 1, col = "red", size = 12)
sphereplot::rgl.sphpoints(Ex.mean[1], Ex.mean[2], radius = 1, col = "green", size = 12)
Generating circle on sphere
Description
This function makes a circle on the unit 2-sphere.
Usage
GenerateCircle(center, radius, T = 1000)
Arguments
center |
center of circle with spatial locations (longitude and latitude denoted by degrees). |
radius |
radius of circle. It should be in [0, pi]. |
T |
the number of points that make up circle. The points in circle are equally spaced. The default is 1000. |
Details
This function makes a circle on the unit 2-sphere.
Value
matrix consisting of spatial locations with two columns.
Author(s)
Jongmin Lee
See Also
Examples
library(rgl)
library(sphereplot)
library(geosphere)
circle <- GenerateCircle(c(0, 0), 1)
# plot (It requires to load 'rgl', 'sphereplot', and 'geosphere' R package.)
sphereplot::rgl.sphgrid()
sphereplot::rgl.sphpoints(circle[, 1], circle[, 2], radius = 1, col = "blue", size = 12)
Finding Intrinsic Mean
Description
This function calculates the intrinsic mean of data on sphere.
Usage
IntrinsicMean(data, weights = rep(1, nrow(data)), thres = 1e-5)
Arguments
data |
matrix or data frame consisting of spatial locations with two columns. Each row represents longitude and latitude (denoted by degrees). |
weights |
vector of weights. |
thres |
threshold of the stopping conditions. |
Details
This function calculates the intrinsic mean of data. The intrinsic mean is found by the gradient descent algorithm, which works well if the data is well-localized. In the case of spheres, if data is contained in a hemisphere, then the algorithm converges.
Value
two-dimensional vector.
Author(s)
Jongmin Lee
References
Fletcher, P. T., Lu, C., Pizer, S. M. and Joshi, S. (2004). Principal geodesic analysis for the study of nonlinear statistics of shape. IEEE Transactions on Medical Imaging, 23, 995-1005. Jongmin Lee, Jang-Hyun Kim and Hee-Seok Oh. (2021). Spherical Principal Curves. IEEE Transactions on Pattern Analysis and Machine Intelligence, 43. 2165-2171. <doi.org/10.1109/TPAMI.2020.3025327>.
See Also
Examples
#### comparison of Intrinsic mean and extrinsic mean.
#### example: circular data set.
library(rgl)
library(sphereplot)
library(geosphere)
n <- 500
x <- 360 * runif(n) - 180
sigma <- 5
y <- 60 + sigma * rnorm(n)
simul.circle <- cbind(x, y)
data <- simul.circle
In.mean <- IntrinsicMean(data)
Ex.mean <- ExtrinsicMean(data)
## plot (color of data is "blue"; that of intrinsic mean is "red" and
## that of extrinsic mean is "green".)
sphereplot::rgl.sphgrid()
sphereplot::rgl.sphpoints(data, radius = 1, col = "blue", size = 12)
sphereplot::rgl.sphpoints(In.mean[1], In.mean[2], radius = 1, col = "red", size = 12)
sphereplot::rgl.sphpoints(Ex.mean[1], Ex.mean[2], radius = 1, col = "green", size = 12)
Gaussian kernel function
Description
This function returns the value of a Gaussian kernel function.
Usage
Kernel.Gaussian(vec)
Arguments
vec |
any length of vector. |
Details
This function returns the value of a Gaussian kernel function. The value of kernel represents the similarity from origin. The function returns a vector whose length is same as vec
.
Value
vector.
Author(s)
Jongmin Lee
See Also
Kernel.indicator
, Kernel.quartic
.
Examples
Kernel.Gaussian(c(0, 1/2, 1, 2))
Indicator kernel function
Description
This function returns the value of an indicator kernel function.
Usage
Kernel.indicator(vec)
Arguments
vec |
any length of vector. |
Details
This function returns the value of an indicator kernel function. The value of kernel represents similarity from origin. The function returns a vector whose length is same as vec
.
Value
vector.
Author(s)
Jongmin Lee
See Also
Kernel.Gaussian
, Kernel.quartic
.
Examples
Kernel.indicator(c(0, 1/2, 1, 2))
Quartic kernel function
Description
This function returns the value of a quartic kernel function.
Usage
Kernel.quartic(vec)
Arguments
vec |
any length of vector. |
Details
This function returns the value of quartic kernel function. The value of kernel represents similarity from origin. The function returns a vector whose length is same as vec
.
Value
vector.
Author(s)
Jongmin Lee
See Also
Kernel.Gaussian
, Kernel.indicator
.
Examples
Kernel.quartic(c(0, 1/2, 1, 2))
Local principal geodesics
Description
Locally definded principal geodesic analysis.
Usage
LPG(data, scale = 0.04, tau = scale/3, nu = 0, maxpt = 500,
seed = NULL, kernel = "indicator", thres = 1e-4,
col1 = "blue", col2 = "green", col3 = "red")
Arguments
data |
matrix or data frame consisting of spatial locations with two columns. Each row represents longitude and latitude (denoted by degrees). |
scale |
scale parameter for this function. The argument is the degree to which |
tau |
forwarding or backwarding distance of each step. It is empirically recommended to choose a third of |
nu |
parameter to alleviate the bias of resulting curves. |
maxpt |
maximum number of points that each curve has. The default is 500. |
seed |
random seed number. |
kernel |
kind of kernel function. The default is the indicator kernel and alternatives are quartic or Gaussian. |
thres |
threshold of the stopping condition for the |
col1 |
color of data. The default is blue. |
col2 |
color of points in the resulting principal curves. The default is green. |
col3 |
color of the resulting curves. The default is red. |
Details
Locally definded principal geodesic analysis. The result is sensitive to scale
and nu
, especially scale
should be carefully chosen according to the structure of the given data.
Value
plot and a list consisting of
prin.curves |
spatial locations (represented by degrees) of points in the resulting curves. |
line |
connecting lines between points in |
num.curves |
the number of the resulting curves. |
Author(s)
Jongmin Lee
See Also
PGA
, SPC
, SPC.Hauberg
.
Examples
library(rgl)
library(sphereplot)
library(geosphere)
#### example 1: spiral data
## longitude and latitude are expressed in degrees
set.seed(40)
n <- 900 # the number of samples
sigma1 <- 1; sigma2 <- 2.5; # noise levels
radius <- 73; slope <- pi/16 # radius and slope of spiral
## polar coordinate of (longitude, latitude)
r <- runif(n)^(2/3) * radius; theta <- -slope * r + 3
## transform to (longitude, latitude)
correction <- (0.5 * r/radius + 0.3) # correction of noise level
lon1 <- r * cos(theta) + correction * sigma1 * rnorm(n)
lat1 <- r * sin(theta) + correction * sigma1 * rnorm(n)
lon2 <- r * cos(theta) + correction * sigma2 * rnorm(n)
lat2 <- r * sin(theta) + correction * sigma2 * rnorm(n)
spiral1 <- cbind(lon1, lat1); spiral2 <- cbind(lon2, lat2)
## plot spiral data
rgl.sphgrid(col.lat = 'black', col.long = 'black')
rgl.sphpoints(spiral1, radius = 1, col = 'blue', size = 12)
## implement the LPG to (noisy) spiral data
LPG(spiral1, scale = 0.06, nu = 0.1, seed = 100)
LPG(spiral2, scale = 0.12, nu = 0.1, seed = 100)
#### example 2: zigzag data set
set.seed(10)
n <- 50 # the number of samples is 6 * n = 300
sigma1 <- 2; sigma2 <- 5 # noise levels
x1 <- x2 <- x3 <- x4 <- x5 <- x6 <- runif(n) * 20 - 20
y1 <- x1 + 20 + sigma1 * rnorm(n); y2 <- -x2 + 20 + sigma1 * rnorm(n)
y3 <- x3 + 60 + sigma1 * rnorm(n); y4 <- -x4 - 20 + sigma1 * rnorm(n)
y5 <- x5 - 20 + sigma1 * rnorm(n); y6 <- -x6 - 60 + sigma1 * rnorm(n)
x <- c(x1, x2, x3, x4, x5, x6); y <- c(y1, y2, y3, y4, y5, y6)
simul.zigzag1 <- cbind(x, y)
## plot zigzag data
sphereplot::rgl.sphgrid(col.lat = 'black', col.long = 'black')
sphereplot::rgl.sphpoints(simul.zigzag1, radius = 1, col = 'blue', size = 12)
## implement the LPG to zigzag data
LPG(simul.zigzag1, scale = 0.1, nu = 0.1, maxpt = 45, seed = 50)
## noisy zigzag data
set.seed(10)
z1 <- z2 <- z3 <- z4 <- z5 <- z6 <- runif(n) * 20 - 20
w1 <- z1 + 20 + sigma2 * rnorm(n); w2 <- -z2 + 20 + sigma2 * rnorm(n)
w3 <- z3 + 60 + sigma2 * rnorm(n); w4 <- -z4 - 20 + sigma2 * rnorm(n)
w5 <- z5 - 20 + sigma2 * rnorm(n); w6 <- -z6 - 60 + sigma2 * rnorm(n)
z <- c(z1, z2, z3, z4, z5, z6); w <- c(w1, w2, w3, w4, w5, w6)
simul.zigzag2 <- cbind(z, w)
## implement the LPG to noisy zigzag data
LPG(simul.zigzag2, scale = 0.2, nu = 0.1, maxpt = 18, seed = 20)
#### example 3: Doubly circular data set
set.seed(30)
n <- 200
sigma <- 1
x1 <- 40 * runif(n) - 20
y1 <- (-x1^2 + 400)^(1/2) + 30 + sigma * rnorm(n)
x2 <- 40 * runif(n) - 20
y2 <- -(-x2^2 + 400)^(1/2) + 30 + sigma * rnorm(n)
y3 <- 40 * runif(n) + 10
x3 <- -(-y3^2 + 60 * y3 - 500)^(1/2) + sigma * rnorm(n)
y4 <- 40 * runif(n) + 10
x4 <- (-y4^2 + 60 * y4 - 500)^(1/2) + sigma * rnorm(n)
Dc1 <- cbind(c(x1, x2, x3, x4), c(y1, y2, y3, y4))
z1 <- 40 * runif(n) - 20
w1 <- (400 - z1^2)^(1/2) - 20 + sigma * rnorm(n)
z2 <- 40 * runif(n) - 20
w2 <- -(400 - z2^2)^(1/2) - 20 + sigma * rnorm(n)
w3 <- -40 * runif(n)
z3 <- (-w3^2 - 40 * w3)^(1/2) + sigma * rnorm(n)
w4 <- -40 * runif(n)
z4 <- -(-w4^2 - 40 * w4)^(1/2) + sigma * rnorm(n)
Dc2 <- cbind(c(z1, z2, z3, z4), c(w1, w2, w3, w4))
Dc <- rbind(Dc1, Dc2)
LPG(Dc, scale = 0.15, nu = 0.1, maxpt = 22,)
#### example 4: real earthquake data
data(Earthquake)
names(Earthquake)
earthquake <- cbind(Earthquake$longitude, Earthquake$latitude)
LPG(earthquake, scale = 0.5, nu = 0.2, maxpt = 20)
LPG(earthquake, scale = 0.4, nu = 0.3)
#### example 5: tree data
## tree consists of stem, branches and subbranches
## generate stem
set.seed(10)
n1 <- 200; n2 <- 100; n3 <- 15 # the number of samples in stem, a branch, and a subbranch
sigma1 <- 0.1; sigma2 <- 0.05; sigma3 <- 0.01 # noise levels
noise1 <- sigma1 * rnorm(n1); noise2 <- sigma2 * rnorm(n2); noise3 <- sigma3 * rnorm(n3)
l1 <- 70; l2 <- 20; l3 <- 1 # length of stem, branches, and subbranches
rep1 <- l1 * runif(n1) # repeated part of stem
stem <- cbind(0 + noise1, rep1 - 10)
## generate branch
rep2 <- l2 * runif(n2) # repeated part of branch
branch1 <- cbind(-rep2, rep2 + 10 + noise2); branch2 <- cbind(rep2, rep2 + noise2)
branch3 <- cbind(rep2, rep2 + 20 + noise2); branch4 <- cbind(rep2, rep2 + 40 + noise2)
branch5 <- cbind(-rep2, rep2 + 30 + noise2)
branch <- rbind(branch1, branch2, branch3, branch4, branch5)
## generate subbranches
rep3 <- l3 * runif(n3) # repeated part in subbranches
branches1 <- cbind(rep3 - 10, rep3 + 20 + noise3)
branches2 <- cbind(-rep3 + 10, rep3 + 10 + noise3)
branches3 <- cbind(rep3 - 14, rep3 + 24 + noise3)
branches4 <- cbind(-rep3 + 14, rep3 + 14 + noise3)
branches5 <- cbind(-rep3 - 12, -rep3 + 22 + noise3)
branches6 <- cbind(rep3 + 12, -rep3 + 12 + noise3)
branches7 <- cbind(-rep3 - 16, -rep3 + 26 + noise3)
branches8 <- cbind(rep3 + 16, -rep3 + 16 + noise3)
branches9 <- cbind(rep3 + 10, -rep3 + 50 + noise3)
branches10 <- cbind(-rep3 - 10, -rep3 + 40 + noise3)
branches11 <- cbind(-rep3 + 12, rep3 + 52 + noise3)
branches12 <- cbind(rep3 - 12, rep3 + 42 + noise3)
branches13 <- cbind(rep3 + 14, -rep3 + 54 + noise3)
branches14 <- cbind(-rep3 - 14, -rep3 + 44 + noise3)
branches15 <- cbind(-rep3 + 16, rep3 + 56 + noise3)
branches16 <- cbind(rep3 - 16, rep3 + 46 + noise3)
branches17 <- cbind(-rep3 + 10, rep3 + 30 + noise3)
branches18 <- cbind(-rep3 + 14, rep3 + 34 + noise3)
branches19 <- cbind(rep3 + 16, -rep3 + 36 + noise3)
branches20 <- cbind(rep3 + 12, -rep3 + 32 + noise3)
sub.branches <- rbind(branches1, branches2, branches3, branches4, branches5, branches6,
+ branches7, branches8, branches9, branches10, branches11, branches12, branches13,
+ branches14, branches15, branches16, branches17, branches18, branches19, branches20)
## tree consists of stem, branch and subbranches
tree <- rbind(stem, branch, sub.branches)
## plot tree data
sphereplot::rgl.sphgrid(col.lat = 'black', col.long = 'black')
sphereplot::rgl.sphpoints(tree, radius = 1, col = 'blue', size = 12)
## implement the LPG function to tree data
LPG(tree, scale = 0.03, nu = 0.2, seed = 10)
Logarithm map
Description
This function performs the logarithm map at (0, 0, 1) on the unit sphere.
Usage
Logmap(vec)
Arguments
vec |
element of the unit sphere in three-dimensional Euclidean vector space. |
Details
This function performs the logarithm map at (0, 0, 1) on the unit sphere. Note that, vec
is normalized to be contained in the unit sphere.
Value
two-dimensional vector.
Author(s)
Jongmin Lee
References
Fletcher, P. T., Lu, C., Pizer, S. M. and Joshi, S. (2004). Principal geodesic analysis for the study of nonlinear statistics of shape. IEEE Transactions on Medical Imaging, 23, 995-1005.
See Also
Examples
Logmap(c(1/sqrt(2), 1/sqrt(2), 0))
Principal geodesic analysis
Description
This function performs principal geodesic analysis.
Usage
PGA(data, col1 = "blue", col2 = "red")
Arguments
data |
matrix or data frame consisting of spatial locations with two columns. Each row represents longitude and latitude (denoted by degrees. |
col1 |
color of data. The default is blue. |
col2 |
color of the principal geodesic line. The default is red |
Details
This function performs principal geodesic analysis.
Value
plot and a list consisting of
line |
spatial locations (longitude and latitude by degrees) of points in the principal geodesic line. |
Note
This function requires to load 'sphereplot', 'geosphere' and 'rgl' R package.
Author(s)
Jongmin Lee
References
Fletcher, P. T., Lu, C., Pizer, S. M. and Joshi, S. (2004). Principal geodesic analysis for the study of nonlinear statistics of shape. IEEE Transactions on Medical Imaging, 23, 995-1005.
See Also
LPG
.
Examples
library(rgl)
library(sphereplot)
library(geosphere)
#### example 1: noisy half-great circle data
circle <- GenerateCircle(c(150, 60), radius = pi/2)
half.circle <- circle[circle[, 1] < 0, , drop = FALSE]
sigma <- 2
half.circle <- half.circle + sigma * rnorm(nrow(half.circle))
PGA(half.circle)
#### example 2: noisy S-shaped data
#### The data consists of two parts: x ~ Uniform[0, 20], y = sqrt(20 * x - x^2) + N(0, sigma^2),
#### x ~ Uniform[-20, 0], y = -sqrt(-20 * x - x^2) + N(0, sigma^2).
n <- 500
x <- 60 * runif(n)
sigma <- 2
y <- (60 * x - x^2)^(1/2) + sigma * rnorm(n)
simul.S1 <- cbind(x, y)
z <- -60 * runif(n)
w <- -(-60 * z - z^2)^(1/2)+ sigma * rnorm(n)
simul.S2 <- cbind(z, w)
simul.S <- rbind(simul.S1, simul.S2)
PGA(simul.S)
Principal circle on a sphere
Description
This function fits a principal circle on sphere via gradient descent algorithm.
Usage
PrincipalCircle(data, step.size = 1e-3, thres = 1e-5, maxit = 10000)
Arguments
data |
matrix or data frame consisting of spatial locations (longitude and latitude denoted by degrees) with two columns. |
step.size |
step size of gradient descent algorithm. For convergence of the algorithm, |
thres |
threshold of the stopping condition. The default is 1e-5. |
maxit |
maximum number of iterations. The default is 10000. |
Details
This function fits a principal circle on sphere via gradient descent algorithm. The function returns three-dimensional vectors whose components represent longitude and latitude of the center and the radius of the circle in regular order.
Value
three-dimensional vector.
Author(s)
Jongmin Lee
References
Jongmin Lee, Jang-Hyun Kim and Hee-Seok Oh. (2021). Spherical principal curves. IEEE Transactions on Pattern Analysis and Machine Intelligence, 43, 2165-2171. <doi.org/10.1109/TPAMI.2020.3025327>.
Jang-Hyun Kim, Jongmin Lee and Hee-Seok Oh (2020), Spherical principal curves <arXiv:2003.02578>.
See Also
Examples
library(rgl)
library(sphereplot)
library(geosphere)
#### example 1: half-great circle data
circle <- GenerateCircle(c(150, 60), radius = pi/2)
half.great.circle <- circle[circle[, 1] < 0, , drop = FALSE]
sigma <- 2
half.great.circle <- half.great.circle + sigma * rnorm(nrow(half.great.circle))
## find a principal circle
PC <- PrincipalCircle(half.great.circle)
result <- GenerateCircle(PC[1:2], PC[3])
## plot
rgl.sphgrid()
rgl.sphpoints(half.great.circle, radius = 1, col = "blue", size = 12)
rgl.sphpoints(result, radius = 1, col = "red", size = 6)
#### example 2: circular data
n <- 700
x <- seq(-180, 180, length.out = n)
sigma <- 5
y <- 45 + sigma * rnorm(n)
simul.circle <- cbind(x, y)
## find a principal circle
PC <- PrincipalCircle(simul.circle)
result <- GenerateCircle(PC[1:2], PC[3])
## plot
sphereplot::rgl.sphgrid()
sphereplot::rgl.sphpoints(simul.circle, radius = 1, col = "blue", size = 12)
sphereplot::rgl.sphpoints(result, radius = 1, col = "red", size = 6)
#### example 3: earthquake data
data(Earthquake)
names(Earthquake)
earthquake <- cbind(Earthquake$longitude, Earthquake$latitude)
PC <- PrincipalCircle(earthquake)
result <- GenerateCircle(PC[1:2], PC[3])
## plot
sphereplot::rgl.sphgrid(col.long = "black", col.lat = "black")
sphereplot::rgl.sphpoints(earthquake, radius = 1, col = "blue", size = 12)
sphereplot::rgl.sphpoints(result, radius = 1, col = "red", size = 6)
Projecting the nearest point
Description
This function performs the approximated projection for each data.
Usage
Proj.Hauberg(data, line)
Arguments
data |
matrix or data frame consisting of spatial locations with two columns. Each row represents longitude and latitude. |
line |
longitude and latitude of line as a matrix or data frame with two columns. |
Details
This function returns the nearest points in line
for each point in the data.
The function requires to load the 'geosphere' R package.
Value
matrix consisting of spatial locations with two columns.
Author(s)
Jongmin Lee
References
Hauberg, S. (2016). Principal curves on Riemannian manifolds. IEEE Transactions on Pattern Analysis and Machine Intelligence, 38, 1915-1921.
Jang-Hyun Kim, Jongmin Lee and Hee-Seok Oh. (2020). Spherical Principal Curves <arXiv:2003.02578>.
Jongmin Lee, Jang-Hyun Kim and Hee-Seok Oh. (2021). Spherical principal curves. IEEE Transactions on Pattern Analysis and Machine Intelligence, 43, 2165-2171. <doi.org/10.1109/TPAMI.2020.3025327>.
See Also
Examples
library(geosphere)
Proj.Hauberg(rbind(c(0, 0), c(10, -20)), rbind(c(50, 10), c(40, 20), c(30, 30)))
Rotating point on a sphere
Description
Rotate a point on the unit 2-sphere.
Usage
Rotate(pt1, pt2)
Arguments
pt1 |
spatial location. |
pt2 |
spatial location. |
Details
This function rotates pt2
to the extent that pt1
to spherical coordinate (0, 90).
The function returns a point as a form of three-dimensional Euclidean coordinate.
Value
three-dimensional vector.
Author(s)
Jongmin Lee
References
https://en.wikipedia.org/wiki/Rodrigues_rotation_formula
See Also
Examples
## If "pt1" is north pole (= (0, 90)), Rotate() function returns Euclidean coordinate of "pt2".
Rotate(c(0, 90), c(10, 10)) # It returns Euclidean coordinate of spatial location (10, 10).
# The Trans.Euclid() function converts spatial coordinate (10, 10) to Euclidean coordinate.
Trans.Euclid(c(10, 10))
Rotating point on a sphere
Description
Rotate a point on the unit 2-sphere.
Usage
Rotate.inv(pt1, pt2)
Arguments
pt1 |
spatial location. |
pt2 |
spatial location. |
Details
This function rotates pt2
to the extent that the spherical coordinate (0, 90) is rotated to pt1
.
The function is the inverse of the Rotate
function, and returns a point as a form of three-dimensional Euclidean coordinate.
Value
three-dimensional vector.
Author(s)
Jongmin Lee
References
https://en.wikipedia.org/wiki/Rodrigues_rotation_formula
See Also
Examples
## If "pt1" is north pole (= (0, 90)), Rotate.inv() returns Euclidean coordinate of "pt2".
# It returns Euclidean coordinate of spatial location (-100, 80).
Rotate.inv(c(0, 90), c(-100, 80))
# It converts spatial coordinate (-100, 80) to Euclidean coordinate.
Trans.Euclid(c(-100, 80))
Spherical principal curves
Description
This function fits a spherical principal curve.
Usage
SPC(data, q = 0.1, T = nrow(data), step.size = 1e-3, maxit = 10,
type = "Intrinsic", thres = 0.1, deletePoints = FALSE, plot.proj = FALSE,
kernel = "quartic", col1 = "blue", col2 = "green", col3 = "red")
Arguments
data |
matrix or data frame consisting of spatial locations with two columns. Each row represents a longitude and latitude (denoted by degrees). |
q |
numeric value of the smoothing parameter. The parameter plays the same role, as the bandwidth does in kernel regression, in the |
T |
the number of points making up the resulting curve. The default is 1000. |
step.size |
step size of the |
maxit |
maximum number of iterations. The default is 30. |
type |
type of mean on the sphere. The default is "Intrinsic" and the other choice is "Extrinsic". |
thres |
threshold of the stopping condition. The default is 0.1 |
deletePoints |
logical value. The argument is an option of whether to delete points or not. If |
plot.proj |
logical value. If the argument is TRUE, the projection line for each data is plotted. The default is FALSE. |
kernel |
kind of kernel function. The default is quartic kernel and alternatives are indicator or Gaussian. |
col1 |
color of data. The default is blue. |
col2 |
color of points in the principal curves. The default is green. |
col3 |
color of resulting principal curves. The default is red. |
Details
This function fits a spherical principal curves, and requires to load the 'rgl', 'sphereplot', and 'geosphere' R packages.
Value
plot and a list consisting of
prin.curves |
spatial locations (denoted by degrees) of points in the resulting principal curves. |
line |
connecting line bewteen points of |
converged |
whether or not the algorithm converged. |
iteration |
the number of iterations of the algorithm. |
recon.error |
sum of squared distances from the data to their projections. |
num.dist.pt |
the number of distinct projections. |
Note
This function requires to load 'rgl', 'sphereplot', and 'geosphere' R packages.
Author(s)
Jongmin Lee
References
Jang-Hyun Kim, Jongmin Lee and Hee-Seok Oh. (2020). Spherical Principal Curves <arXiv:2003.02578>.
Jongmin Lee, Jang-Hyun Kim and Hee-Seok Oh. (2021). Spherical principal curves. IEEE Transactions on Pattern Analysis and Machine Intelligence, 43, 2165-2171. <doi.org/10.1109/TPAMI.2020.3025327>.
See Also
Examples
library(rgl)
library(sphereplot)
library(geosphere)
#### example 2: waveform data
n <- 200
alpha <- 1/3; freq <- 4 # amplitude and frequency of wave
sigma1 <- 2; sigma2 <- 10 # noise levels
lon <- seq(-180, 180, length.out = n) # uniformly sampled longitude
lat <- alpha * 180/pi * sin(freq * lon * pi/180) + 10. # latitude vector
## add Gaussian noises on latitude vector
lat1 <- lat + sigma1 * rnorm(length(lon)); lat2 <- lat + sigma2 * rnorm(length(lon))
wave1 <- cbind(lon, lat1); wave2 <- cbind(lon, lat2)
## implement SPC to the (noisy) waveform data
SPC(wave1, q = 0.05)
SPC(wave2, q = 0.05)
#### example 1: earthquake data
data(Earthquake)
names(Earthquake)
earthquake <- cbind(Earthquake$longitude, Earthquake$latitude)
SPC(earthquake, q = 0.1)
## options 1: plot the projection lines (use option of plot.proj = TRUE)
SPC(earthquake, q = 0.1, plot.proj = TRUE)
## option 2: open principal curves (use option of deletePoints = TRUE)
SPC(earthquake, q = 0.04, deletePoints = TRUE)
principal curves by Hauberg on a sphere
Description
This function fits a principal curve by Hauberg on the unit 2-sphere.
Usage
SPC.Hauberg(data, q = 0.1, T = nrow(data), step.size = 1e-3, maxit = 10,
type = "Intrinsic", thres = 1e-2, deletePoints = FALSE, plot.proj = FALSE,
kernel = "quartic", col1 = "blue", col2 = "green", col3 = "red")
Arguments
data |
matrix or data frame consisting of spatial locations with two columns. Each row represents longitude and latitude (denoted by degrees). |
q |
numeric value of the smoothing parameter. The parameter plays the same role, as the bandwidth does in kernel regression, in the |
T |
the number of points making up the resulting curve. The default is 1000. |
step.size |
step size of the |
maxit |
maximum number of iterations. The default is 30. |
type |
type of mean on sphere. The default is "Intrinsic" and the alternative is "extrinsic". |
thres |
threshold of the stopping condition. The default is 0.01. |
deletePoints |
logical value. The argument is an option of whether to delete points or not. If |
plot.proj |
logical value. If the argument is TRUE, the projection line for each data is plotted. The default is FALSE. |
kernel |
kind of kernel function. The default is quartic kernel and alternatives are indicator or Gaussian. |
col1 |
color of data. The default is blue. |
col2 |
color of points in the principal curves. The default is green. |
col3 |
color of resulting principal curves. The default is red. |
Details
This function fits a principal curve proposed by Hauberg on the sphere, and requires to load the 'rgl', 'sphereplot', and 'geosphere' R packages.
Value
plot and a list consisting of
prin.curves |
spatial locations (denoted by degrees) of points in the resulting principal curves. |
line |
connecting line bewteen points of |
converged |
whether or not the algorithm converged. |
iteration |
the number of iterations of the algorithm. |
recon.error |
sum of squared distances from the data to their projections. |
num.dist.pt |
the number of distinct projections. |
plot |
plotting of the data and principal curves. |
Note
This function requires to load 'rgl', 'sphereplot', and 'geosphere' R packages.
Author(s)
Jongmin Lee
References
Hauberg, S. (2016). Principal curves on Riemannian manifolds. IEEE Transactions on Pattern Analysis and Machine Intelligence, 38, 1915-1921.
Jang-Hyun Kim, Jongmin Lee and Hee-Seok Oh. (2020). Spherical Principal Curves <arXiv:2003.02578>.
Jongmin Lee, Jang-Hyun Kim and Hee-Seok Oh. (2021). Spherical Principal Curves. IEEE Transactions on Pattern Analysis and Machine Intelligence, 43, 2165-2171. <doi.org/10.1109/TPAMI.2020.3025327>.
See Also
Examples
library(rgl)
library(sphereplot)
library(geosphere)
#### example 1: earthquake data
data(Earthquake)
names(Earthquake)
earthquake <- cbind(Earthquake$longitude, Earthquake$latitude)
SPC.Hauberg(earthquake, q = 0.1)
#### example 2: waveform data
## longitude and latitude are expressed in degrees
n <- 200
alpha <- 1/3; freq <- 4 # amplitude and frequency of wave
sigma <- 2 # noise level
lon <- seq(-180, 180, length.out = n) # uniformly sampled longitude
lat <- alpha * 180/pi * sin(freq * lon * pi/180) + 10. # latitude vector
## add Gaussian noises on latitude vector
lat1 <- lat + sigma * rnorm(length(lon))
wave <- cbind(lon, lat1)
## implement principal curves by Hauberg to the waveform data
SPC.Hauberg(wave, q = 0.05)
Transforming into Euclidean coordinate
Description
This function converts a spherical coordinate to a Euclidean coordinate.
Usage
Trans.Euclid(vec)
Arguments
vec |
two-dimensional spherical coordinate. |
Details
This function converts a two-dimensional spherical coordinate to a three-dimensional Euclidean coordinate. Longitude should be range from -180 to 180 and latitude from -90 to 90.
Value
three-dimensional vector.
Author(s)
Jongmin Lee
See Also
Examples
Trans.Euclid(c(0, 0))
Trans.Euclid(c(0, 90))
Trans.Euclid(c(90, 0))
Trans.Euclid(c(180, 0))
Trans.Euclid(c(-90, 0))
Transforming into spherical coordinate
Description
This function converts a Euclidean coordinate to a spherical coordinate.
Usage
Trans.sph(vec)
Arguments
vec |
three-dimensional Euclidean coordinate. |
Details
This function converts a three-dimensional Euclidean coordinate to a two-dimensional spherical coordinate.
If vec
is not in the unit sphere, it is divided by its magnitude so that the result lies on the unit sphere.
Value
two-dimensional vector.
Author(s)
Jongmin Lee
See Also
Examples
Trans.sph(c(1, 0, 0))
Trans.sph(c(0, 1, 0))
Trans.sph(c(0, 0, 1))
Trans.sph(c(-1, 0 , 0))
Trans.sph(c(0, -1, 0))