vignettes/Centroid-Vectors.R

## ----setup, echo = FALSE------------------------------------------------------
knitr::opts_chunk$set(collapse = TRUE, comment = "#>", 
                      fig.width = 6, fig.height = 5)

library(viridis)
palette(viridis(3))

## ----load-data----------------------------------------------------------------
# remove previously loaded items from the current environment and remove previous graphics.
rm(list=ls())
graphics.off()

# Here, I set the seed each time so that the results are comparable. 
# This is useful as it means that anyone that runs your code, *should*
# get the same results as you, although random number generators change 
# from time to time.
set.seed(1)

library(SIBER)
library(ggplot2)
library(magrittr) # to enable piping
library(dplyr)


# load in the included demonstration dataset
data("demo.siber.data")
#
# create the siber object
siber.example <- createSiberObject(demo.siber.data)

# Create lists of plotting arguments to be passed onwards to each 
# of the three plotting functions.
community.hulls.args <- list(col = 1, lty = 1, lwd = 1)
group.ellipses.args  <- list(n = 100, p.interval = 0.95, lty = 1, lwd = 2)
group.hull.args      <- list(lty = 2, col = "grey20")



par(mfrow=c(1,1))
plotSiberObject(siber.example,
                  ax.pad = 2, 
                  hulls = F, community.hulls.args, 
                  ellipses = T, group.ellipses.args,
                  group.hulls = T, group.hull.args,
                  bty = "L",
                  iso.order = c(1,2),
                  xlab = expression({delta}^13*C~'permille'),
                  ylab = expression({delta}^15*N~'permille')
                  )



## ----fit-mvn------------------------------------------------------------------

# options for running jags
parms <- list()
parms$n.iter <- 2 * 10^4   # number of iterations to run the model for
parms$n.burnin <- 1 * 10^3 # discard the first set of values
parms$n.thin <- 10     # thin the posterior by this many
parms$n.chains <- 2        # run this many chains

parms$save.output = FALSE
parms$save.dir = tempdir()

# define the priors
priors <- list()
priors$R <- 1 * diag(2)
priors$k <- 2
priors$tau.mu <- 1.0E-3

# fit the ellipses which uses an Inverse Wishart prior
# on the covariance matrix Sigma, and a vague normal prior on the 
# means. Fitting is via the JAGS method.
ellipses.posterior <- siberMVN(siber.example, parms, priors)


## ----extract-centroids--------------------------------------------------------
# extract the centroids from the fitted model object
centroids <- siberCentroids(ellipses.posterior)

# calculate pairwise polar vectors among all groups
# this is not actually used in this example
angles_distances <- allCentroidVectors(centroids, do.plot = FALSE)



## ----ggplot-polar, fig.width=9------------------------------------------------

# = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = 
# function to do the histograms on each group
my.hist <- function(df){
  test <- hist(df$angles, 
             breaks = seq(from = -pi, to = pi, length = 60), 
             plot = FALSE)

X <- data.frame(counts = test$counts, mids = test$mids, dens = test$density, 
                counts.stdzd = test$counts / max(test$counts))

return(X)

}
# = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = 

# calculate the points for each group's ellipse
hist.by.groups <- angles_distances %>% group_by(comparison) %>%
                             do(my.hist(.))

all.roses <- ggplot(data = hist.by.groups, aes(x = mids, y = counts.stdzd)) +
  geom_bar(stat = "identity") + 
  coord_polar(start = pi / 2, direction = -1) +
  facet_wrap( ~ comparison) +
  theme(axis.ticks.y = element_blank(), 
         axis.text.y = element_blank()) + 
  scale_x_continuous( breaks = c(-pi, -pi/2, 0, pi/2, pi),
                      labels = c("","-\u03C0/2","0","\u03C0/2", "\u03C0"))
print(all.roses)


## ----polar-density, fig.width = 10, fig.height = 7----------------------------

median_vectors <- dplyr::summarise(group_by(angles_distances, comparison),
          medAngle = median(angles), medDist = median(distances))

origins <- data.frame(comparison = median_vectors$comparison, 
                      x = 0, y = 0)

ends    <- with(median_vectors, data.frame(comparison = comparison,
                                           x = medDist * cos(medAngle),
                                           y = medDist * sin(medAngle)))

# = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
# generate the start and end points of the medians for the arrows
for_arrows <- dplyr::bind_rows(origins, ends)

# rename the comparison label for nice plot labels below
# aa <- unlist(strsplit(as.character(for_arrows$comparison), "[.]"))
# aa <- aa[seq(3,length(aa),5)]
# for_arrows$comparison2 <- factor(aa)


# = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = 
# create the cartesian points for the estimated tips of the arrows
cart_positions <- with(angles_distances, data.frame(x = distances * cos(angles),
                             y = distances * sin(angles),
                             comparison = comparison ))

# rename as above
# bb <- unlist(strsplit(as.character(angles_distances$comparison), "[.]"))
# bb <- bb[seq(3,length(bb),5)]
# cart_positions$comparison2 <- factor(bb)



# = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = 
# plot it
ggplot(cart_positions, aes(x,y) ) + 
  geom_bin2d(bins = 20) +
  scale_fill_gradient(low = "white", high = "black") +
  coord_cartesian(xlim = c(-20, +20), ylim = c(-20, +20)) +
  facet_wrap( ~ comparison, scales = "fixed") + 
  theme_classic() +
  geom_path(data = for_arrows, 
            arrow = arrow(type = "open", length = unit(0.2, "cm")),
            col = "red", alpha = 0.6) +
  ylab(expression(paste(delta^{15}, "N (permille)"))) +
  xlab(expression(paste(delta^{13}, "C (permille)"))) + 
  theme(text = element_text(size=15))
AndrewLJackson/SIBER documentation built on Oct. 21, 2023, 8:09 a.m.