From 6974a431bab3eaebd12bd48742b27bdee64e4153 Mon Sep 17 00:00:00 2001 From: Sam Wilks Date: Wed, 15 Nov 2023 10:08:55 +0000 Subject: [PATCH 01/18] Update CRAN-SUBMISSION details --- CRAN-SUBMISSION | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CRAN-SUBMISSION b/CRAN-SUBMISSION index 6d944721..da955b62 100644 --- a/CRAN-SUBMISSION +++ b/CRAN-SUBMISSION @@ -1,3 +1,3 @@ Version: 1.2.7 -Date: 2023-09-01 05:06:17 UTC -SHA: 427a0fcec70ce202358ed9f72e4a207d150cfb85 +Date: 2023-09-04 03:42:56 UTC +SHA: 21967637c83cde51e4846f1274aeadcc20de3503 From 8589033e910d7c5b2afd73a834da0c402d292f06 Mon Sep 17 00:00:00 2001 From: Sam Wilks Date: Wed, 15 Nov 2023 10:12:42 +0000 Subject: [PATCH 02/18] Function `splitTiterLayers()` now exported. --- NAMESPACE | 1 + NEWS.md | 3 +++ R/map_merge.R | 3 +++ man/splitTiterLayers.Rd | 3 +++ 4 files changed, 10 insertions(+) diff --git a/NAMESPACE b/NAMESPACE index 6d409a51..a7a4ba6e 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -211,6 +211,7 @@ export(save.coords) export(save.titerTable) export(setLegend) export(sortOptimizations) +export(splitTiterLayers) export(srAnnotations) export(srAspect) export(srBaseCoords) diff --git a/NEWS.md b/NEWS.md index 754f8644..7aeefdf2 100644 --- a/NEWS.md +++ b/NEWS.md @@ -221,3 +221,6 @@ # Racmacs 1.2.7 * `on.exit()` calls added to code in `R/map_plot.R` and `inst/shinyapps/RacmacsGUI/app.R` where changes to graphical parameters and user options are made. * `snapshotMap()` function removed. + +# Racmacs 1.2.8 +* Function `splitTiterLayers()` now exported. diff --git a/R/map_merge.R b/R/map_merge.R index 13c9d185..dbfdd64e 100644 --- a/R/map_merge.R +++ b/R/map_merge.R @@ -296,7 +296,10 @@ RacMerge.options <- function( #' #' @param map An acmap object with titer table layers #' +#' @returns A list of acmap objects +#' #' @family map merging functions +#' @export #' splitTiterLayers <- function( map diff --git a/man/splitTiterLayers.Rd b/man/splitTiterLayers.Rd index 6e7d6a78..fb285aed 100644 --- a/man/splitTiterLayers.Rd +++ b/man/splitTiterLayers.Rd @@ -10,6 +10,9 @@ splitTiterLayers(map) \arguments{ \item{map}{An acmap object with titer table layers} } +\value{ +A list of acmap objects +} \description{ Split a map made up from titer layers into a list of separate maps each with a titer table corresponding to one of the layers From 05db7c99e78652b57eb0f48601e7b1d481dfc993 Mon Sep 17 00:00:00 2001 From: Sam Wilks Date: Wed, 15 Nov 2023 10:12:52 +0000 Subject: [PATCH 03/18] Update to version 1.2.8 --- DESCRIPTION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DESCRIPTION b/DESCRIPTION index 04951530..24c8b2ae 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,7 +1,7 @@ Package: Racmacs Type: Package Title: Antigenic Cartography Macros -Version: 1.2.7 +Version: 1.2.8 Date: 2023-09-01 Authors@R: c(person(given = "Sam", From abf77a95cdfe61d0abaff5622d7a32694c14f7a1 Mon Sep 17 00:00:00 2001 From: Sam Wilks Date: Wed, 15 Nov 2023 10:13:46 +0000 Subject: [PATCH 04/18] Add CRAN status badge and instructions for installing from CRAN --- README.md | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index e2ffa291..1544d835 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,7 @@ [![R-CMD-check](https://github.com/acorg/Racmacs/actions/workflows/R-CMD-check.yaml/badge.svg)](https://github.com/acorg/Racmacs/actions/workflows/R-CMD-check.yaml) +[![CRAN status](https://www.r-pkg.org/badges/version/Racmacs)](https://CRAN.R-project.org/package=Racmacs) @@ -11,13 +12,23 @@ The Racmacs package provides a toolkit for making antigenic maps from assay data For an introduction to antigenic cartography, see the article [an introduction to antigenic cartography](https://acorg.github.io/Racmacs/articles/intro-to-antigenic-cartography.html). For a general introduction to using Racmacs to make an antigenic map from titer data see the article [making an antigenic map from titer data](https://acorg.github.io/Racmacs/articles/making-a-map-from-scratch.html). For documentation of the functions available see the [references](https://acorg.github.io/Racmacs/reference/index.html) section. ## Installation instructions -### Install the devtools package +### Installing the latest CRAN release +Pre-compiled version of Racmacs can now be installed directly from CRAN with: +```R +install.packages("Racmacs") +``` + +### Installing the latest development release +The latest developmental release of Racmacs can be installed from github but may require some setting up +of your compiler toolchain as described below. + +#### Install the devtools package If not already installed, install the `devtools` package, this provides functions to help with installation. ```R install.packages("devtools") ``` -### Install Racmacs +#### Install Racmacs Now you can install Racmacs directly from the latest development source code. In future pre-built binary versions will also be included. @@ -29,8 +40,6 @@ devtools::install_github("acorg/Racmacs") #### Problems compiling on MacOS When installing Racmacs on a mac os, compilation will most likely fail under the default setup since the necessary libraries that are linked to cannot be found. The recommended solution, which should both solve this problem and speed up the code, is for mac users to follow the instructions below for setting up your environment to use the gcc and associated fortran compiler. -In the future we will try to provide pre-built binary versions of Racmacs for the latest major operating systems and R versions to avoid the need to build the package locally. - #### Building Racmacs to run code in parallel Racmacs uses [OpenMP](https://www.openmp.org) instructions to specify when code can be run in parallel to increase performance. The resulting speed-up can be significant, but you need to check whether the compiler you use supports OpenMP. From 75011158b58c485d30d6ad70c587eb720ddce832 Mon Sep 17 00:00:00 2001 From: Sam Wilks Date: Wed, 15 Nov 2023 10:16:14 +0000 Subject: [PATCH 05/18] Separate out documentation for `titerTableFlat()` function --- R/map_props.R | 6 +++--- man/titerTable.Rd | 18 ------------------ man/titerTableFlat.Rd | 24 ++++++++++++++++++++++++ 3 files changed, 27 insertions(+), 21 deletions(-) create mode 100644 man/titerTableFlat.Rd diff --git a/R/map_props.R b/R/map_props.R index 66fe3226..d86cc1bb 100644 --- a/R/map_props.R +++ b/R/map_props.R @@ -98,18 +98,18 @@ titerTable <- function(map) { #' through the `titerTable()` function, the flat version of the titer table is #' retrieved (only really a relevant distinction for merged maps). When you set #' titers through `titerTable<-()` titer table layers are lost. These functions -#' allow you to manipulate the flat version without effecting the titer table +#' allow you to manipulate the flat version without affecting the titer table #' layers information. #' #' @name titerTableFlat -#' @rdname titerTable +#' @rdname titerTableFlat titerTableFlat <- function(map) { check.acmap(map) map$titer_table_flat } -#' @rdname titerTable +#' @rdname titerTableFlat `titerTableFlat<-` <- function(map, value) { check.acmap(map) check.dimensions(value, map) diff --git a/man/titerTable.Rd b/man/titerTable.Rd index 30576a42..2b5c973e 100644 --- a/man/titerTable.Rd +++ b/man/titerTable.Rd @@ -3,17 +3,11 @@ \name{titerTable} \alias{titerTable} \alias{titerTable<-} -\alias{titerTableFlat} -\alias{titerTableFlat<-} \title{Getting and setting map titers} \usage{ titerTable(map) titerTable(map) <- value - -titerTableFlat(map) - -titerTableFlat(map) <- value } \arguments{ \item{map}{The acmap object} @@ -28,18 +22,6 @@ Functions to get and set the map titer table. Note that when setting the titer table like this any titer table layer information is lost, this is normally not a problem unless the map is a result of merging two titer tables together previously and you then go on the merge the titers again. - -These are underlying functions to get and set the "flat" version of the titer -table only. When a map is merged, the titer tables are merged but a record of -the original titers associated with each map are kept as titer table layers -so that information on the original set of titers that made up the merge is -not lost. At the same time, the merged titer version of the titer table is -created and saved as the titer_table_flat attribute. When you access titers -through the \code{titerTable()} function, the flat version of the titer table is -retrieved (only really a relevant distinction for merged maps). When you set -titers through \verb{titerTable<-()} titer table layers are lost. These functions -allow you to manipulate the flat version without effecting the titer table -layers information. } \seealso{ \code{\link[=adjustedTiterTable]{adjustedTiterTable()}}, \code{\link[=htmlTiterTable]{htmlTiterTable()}} diff --git a/man/titerTableFlat.Rd b/man/titerTableFlat.Rd new file mode 100644 index 00000000..540a7f6e --- /dev/null +++ b/man/titerTableFlat.Rd @@ -0,0 +1,24 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/map_props.R +\name{titerTableFlat} +\alias{titerTableFlat} +\alias{titerTableFlat<-} +\title{Getting and setting the flat titer table} +\usage{ +titerTableFlat(map) + +titerTableFlat(map) <- value +} +\description{ +These are underlying functions to get and set the "flat" version of the titer +table only. When a map is merged, the titer tables are merged but a record of +the original titers associated with each map are kept as titer table layers +so that information on the original set of titers that made up the merge is +not lost. At the same time, the merged titer version of the titer table is +created and saved as the titer_table_flat attribute. When you access titers +through the \code{titerTable()} function, the flat version of the titer table is +retrieved (only really a relevant distinction for merged maps). When you set +titers through \verb{titerTable<-()} titer table layers are lost. These functions +allow you to manipulate the flat version without affecting the titer table +layers information. +} From 7227c20c73ebe78e35dcd6589d0665ea8d59600f Mon Sep 17 00:00:00 2001 From: Sam Wilks Date: Thu, 16 Nov 2023 16:12:36 +0000 Subject: [PATCH 06/18] Ignore .afdesign --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index d7e33e5d..8b0e509e 100644 --- a/.gitignore +++ b/.gitignore @@ -10,6 +10,7 @@ *.o *.o.tmp *.code-workspace +*.afdesign .vscode* doc inst/doc From f42ec9b8c5f93b68c3d72dfd7e98d9d8fa02b2cb Mon Sep 17 00:00:00 2001 From: Sam Wilks Date: Thu, 16 Nov 2023 16:22:06 +0000 Subject: [PATCH 07/18] Update with description about number of cores used --- vignettes/making-a-map-from-scratch.Rmd | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/vignettes/making-a-map-from-scratch.Rmd b/vignettes/making-a-map-from-scratch.Rmd index ee9b8758..178e647a 100644 --- a/vignettes/making-a-map-from-scratch.Rmd +++ b/vignettes/making-a-map-from-scratch.Rmd @@ -36,6 +36,12 @@ For this example we will be reading the titer data from the first antigenic map # Load the Racmacs package library(Racmacs) +# Set an option for the number of computer cores to run in parallel when optimizing maps +# The default when running on CRAN is to use 2 +options(RacOptimizer.num_cores = 1) +# However you can also set the number of cores to the maximum number like this +# options(RacOptimizer.num_cores = parallel::detectCores()) + # Read in the titer table path_to_titer_file <- system.file("extdata/h3map2004_hitable.csv", package = "Racmacs") titer_table <- read.titerTable(path_to_titer_file) From ce01f62d4d6eb9602094021b0871bd78c4b8fae2 Mon Sep 17 00:00:00 2001 From: Sam Wilks Date: Thu, 16 Nov 2023 16:22:16 +0000 Subject: [PATCH 08/18] Remove .afdesign --- .gitignore | 1 - 1 file changed, 1 deletion(-) diff --git a/.gitignore b/.gitignore index 8b0e509e..d7e33e5d 100644 --- a/.gitignore +++ b/.gitignore @@ -10,7 +10,6 @@ *.o *.o.tmp *.code-workspace -*.afdesign .vscode* doc inst/doc From 51037e6ef1c8a2d0f342ddbaad3ae5cd590fdfe3 Mon Sep 17 00:00:00 2001 From: Sam Wilks Date: Thu, 16 Nov 2023 16:40:29 +0000 Subject: [PATCH 09/18] Use `readxl::read_excel()` for reading excel files instead of `gdata::read.xls()` --- DESCRIPTION | 2 +- NEWS.md | 1 + R/rac_process_titers.R | 16 +++++++++------- tests/testdata/titer_tables/titer_table1.xlsx | Bin 0 -> 10517 bytes tests/testthat/test-reading_HI_table.R | 10 ++++++++++ 5 files changed, 21 insertions(+), 8 deletions(-) create mode 100644 tests/testdata/titer_tables/titer_table1.xlsx diff --git a/DESCRIPTION b/DESCRIPTION index 24c8b2ae..d17677db 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -47,7 +47,7 @@ Suggests: rstudioapi, plotly, geometry, - gdata, + readxl, stringr, tibble, tidyr, diff --git a/NEWS.md b/NEWS.md index 7aeefdf2..9e31dba4 100644 --- a/NEWS.md +++ b/NEWS.md @@ -224,3 +224,4 @@ # Racmacs 1.2.8 * Function `splitTiterLayers()` now exported. +* Use `readxl::read_excel()` for reading excel files instead of `gdata::read.xls()` diff --git a/R/rac_process_titers.R b/R/rac_process_titers.R index 9bf2eb93..30fee44b 100644 --- a/R/rac_process_titers.R +++ b/R/rac_process_titers.R @@ -29,17 +29,19 @@ read.titerTable <- function(filepath) { } else if (grepl("\\.xls$", filepath) | grepl("\\.xlsx$", filepath)) { # Check gdata package installed - package_required("gdata") + package_required("readxl") # Read from xls - titer_table <- gdata::read.xls( - xls = filepath, - row.names = 1, - check.names = FALSE, - stringsAsFactors = FALSE, - colClasses = "character" + titer_table_tibble <- readxl::read_excel( + path = filepath, + col_types = "text", + .name_repair = "minimal" ) + # Convert to a character matrix + titer_table <- as.matrix(titer_table_tibble[,-1]) + rownames(titer_table) <- titer_table_tibble[[1]] + } else if (grepl("\\.txt$", filepath)) { # Read from tab delimted txt diff --git a/tests/testdata/titer_tables/titer_table1.xlsx b/tests/testdata/titer_tables/titer_table1.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..0eab8d4b676896692c5b530de70943d2fb4ea1a9 GIT binary patch literal 10517 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 Date: Mon, 20 Nov 2023 12:25:40 +0000 Subject: [PATCH 10/18] Update documentation for titerTableFlat --- R/map_props.R | 6 ++++++ man/titerTableFlat.Rd | 8 ++++++++ 2 files changed, 14 insertions(+) diff --git a/R/map_props.R b/R/map_props.R index d86cc1bb..e5009567 100644 --- a/R/map_props.R +++ b/R/map_props.R @@ -101,7 +101,13 @@ titerTable <- function(map) { #' allow you to manipulate the flat version without affecting the titer table #' layers information. #' +#' @param map The acmap object +#' @param value A character matrix of titers to set +#' +#' @returns Returns a character matrix of titers. +#' #' @name titerTableFlat +#' #' @rdname titerTableFlat titerTableFlat <- function(map) { diff --git a/man/titerTableFlat.Rd b/man/titerTableFlat.Rd index 540a7f6e..ea9701a8 100644 --- a/man/titerTableFlat.Rd +++ b/man/titerTableFlat.Rd @@ -9,6 +9,14 @@ titerTableFlat(map) titerTableFlat(map) <- value } +\arguments{ +\item{map}{The acmap object} + +\item{value}{A character matrix of titers to set} +} +\value{ +Returns a character matrix of titers. +} \description{ These are underlying functions to get and set the "flat" version of the titer table only. When a map is merged, the titer tables are merged but a record of From fdd7357f7f026cbf962e1d69ba0b067268e7882d Mon Sep 17 00:00:00 2001 From: Sam Wilks Date: Mon, 20 Nov 2023 13:30:22 +0000 Subject: [PATCH 11/18] Add documentation family for `titerTableFlat()` --- R/map_props.R | 1 + man/acmapAttributes.Rd | 1 + man/adjustedLogTiterTable.Rd | 1 + man/adjustedTiterTable.Rd | 1 + man/dilutionStepsize.Rd | 1 + man/logtiterTableLayers.Rd | 1 + man/mapDescription.Rd | 1 + man/mapName.Rd | 1 + man/titerTable.Rd | 1 + man/titerTableFlat.Rd | 13 +++++++++++++ man/titerTableLayers.Rd | 1 + 11 files changed, 23 insertions(+) diff --git a/R/map_props.R b/R/map_props.R index e5009567..88457306 100644 --- a/R/map_props.R +++ b/R/map_props.R @@ -107,6 +107,7 @@ titerTable <- function(map) { #' @returns Returns a character matrix of titers. #' #' @name titerTableFlat +#' @family map attribute functions #' #' @rdname titerTableFlat diff --git a/man/acmapAttributes.Rd b/man/acmapAttributes.Rd index f556261a..76a668c4 100644 --- a/man/acmapAttributes.Rd +++ b/man/acmapAttributes.Rd @@ -39,6 +39,7 @@ Other map attribute functions: \code{\link{logtiterTableLayers}()}, \code{\link{mapDescription}()}, \code{\link{mapName}()}, +\code{\link{titerTableFlat}()}, \code{\link{titerTableLayers}()}, \code{\link{titerTable}()} } diff --git a/man/adjustedLogTiterTable.Rd b/man/adjustedLogTiterTable.Rd index 6116e02a..4385935d 100644 --- a/man/adjustedLogTiterTable.Rd +++ b/man/adjustedLogTiterTable.Rd @@ -26,6 +26,7 @@ Other map attribute functions: \code{\link{logtiterTableLayers}()}, \code{\link{mapDescription}()}, \code{\link{mapName}()}, +\code{\link{titerTableFlat}()}, \code{\link{titerTableLayers}()}, \code{\link{titerTable}()} } diff --git a/man/adjustedTiterTable.Rd b/man/adjustedTiterTable.Rd index 70c2be81..2af936b4 100644 --- a/man/adjustedTiterTable.Rd +++ b/man/adjustedTiterTable.Rd @@ -28,6 +28,7 @@ Other map attribute functions: \code{\link{logtiterTableLayers}()}, \code{\link{mapDescription}()}, \code{\link{mapName}()}, +\code{\link{titerTableFlat}()}, \code{\link{titerTableLayers}()}, \code{\link{titerTable}()} } diff --git a/man/dilutionStepsize.Rd b/man/dilutionStepsize.Rd index e2665d6b..f22d9eaa 100644 --- a/man/dilutionStepsize.Rd +++ b/man/dilutionStepsize.Rd @@ -45,6 +45,7 @@ Other map attribute functions: \code{\link{logtiterTableLayers}()}, \code{\link{mapDescription}()}, \code{\link{mapName}()}, +\code{\link{titerTableFlat}()}, \code{\link{titerTableLayers}()}, \code{\link{titerTable}()} } diff --git a/man/logtiterTableLayers.Rd b/man/logtiterTableLayers.Rd index 375e36e4..d04402ef 100644 --- a/man/logtiterTableLayers.Rd +++ b/man/logtiterTableLayers.Rd @@ -23,6 +23,7 @@ Other map attribute functions: \code{\link{dilutionStepsize}()}, \code{\link{mapDescription}()}, \code{\link{mapName}()}, +\code{\link{titerTableFlat}()}, \code{\link{titerTableLayers}()}, \code{\link{titerTable}()} } diff --git a/man/mapDescription.Rd b/man/mapDescription.Rd index 1f7672dc..2c4c654a 100644 --- a/man/mapDescription.Rd +++ b/man/mapDescription.Rd @@ -29,6 +29,7 @@ Other map attribute functions: \code{\link{dilutionStepsize}()}, \code{\link{logtiterTableLayers}()}, \code{\link{mapName}()}, +\code{\link{titerTableFlat}()}, \code{\link{titerTableLayers}()}, \code{\link{titerTable}()} } diff --git a/man/mapName.Rd b/man/mapName.Rd index 2b933a70..2d4bbbfc 100644 --- a/man/mapName.Rd +++ b/man/mapName.Rd @@ -29,6 +29,7 @@ Other map attribute functions: \code{\link{dilutionStepsize}()}, \code{\link{logtiterTableLayers}()}, \code{\link{mapDescription}()}, +\code{\link{titerTableFlat}()}, \code{\link{titerTableLayers}()}, \code{\link{titerTable}()} } diff --git a/man/titerTable.Rd b/man/titerTable.Rd index 2b5c973e..f7552abb 100644 --- a/man/titerTable.Rd +++ b/man/titerTable.Rd @@ -34,6 +34,7 @@ Other map attribute functions: \code{\link{logtiterTableLayers}()}, \code{\link{mapDescription}()}, \code{\link{mapName}()}, +\code{\link{titerTableFlat}()}, \code{\link{titerTableLayers}()} } \concept{map attribute functions} diff --git a/man/titerTableFlat.Rd b/man/titerTableFlat.Rd index ea9701a8..d37583eb 100644 --- a/man/titerTableFlat.Rd +++ b/man/titerTableFlat.Rd @@ -30,3 +30,16 @@ titers through \verb{titerTable<-()} titer table layers are lost. These function allow you to manipulate the flat version without affecting the titer table layers information. } +\seealso{ +Other map attribute functions: +\code{\link{acmapAttributes}}, +\code{\link{adjustedLogTiterTable}()}, +\code{\link{adjustedTiterTable}()}, +\code{\link{dilutionStepsize}()}, +\code{\link{logtiterTableLayers}()}, +\code{\link{mapDescription}()}, +\code{\link{mapName}()}, +\code{\link{titerTableLayers}()}, +\code{\link{titerTable}()} +} +\concept{map attribute functions} diff --git a/man/titerTableLayers.Rd b/man/titerTableLayers.Rd index f604002a..76c9fc8f 100644 --- a/man/titerTableLayers.Rd +++ b/man/titerTableLayers.Rd @@ -39,6 +39,7 @@ Other map attribute functions: \code{\link{logtiterTableLayers}()}, \code{\link{mapDescription}()}, \code{\link{mapName}()}, +\code{\link{titerTableFlat}()}, \code{\link{titerTable}()} } \concept{map attribute functions} From 8522fd4ed450a0b1f3b0a944be8f7162313adc64 Mon Sep 17 00:00:00 2001 From: Sam Wilks Date: Wed, 22 Nov 2023 09:33:21 +0000 Subject: [PATCH 12/18] Use spelling package and correct spelling errors --- DESCRIPTION | 4 +- NEWS.md | 4 +- R/map_blobs.R | 2 +- R/map_diagnostics_bootstrap.R | 6 +- R/map_diagnostics_bootstrap_blobs.R | 2 +- R/map_diagnostics_leverage.R | 2 +- R/map_optimizations.R | 2 +- R/map_optimize.R | 4 +- R/map_procrustes.R | 2 +- R/map_props_optimizations.R | 2 +- R/map_stress.R | 4 +- inst/WORDLIST | 104 ++++++++++++++++++ .../RacViewer/lib/functions/load.js | 18 +-- man/bootstrapBlobs.Rd | 2 +- man/bootstrapMap.Rd | 4 +- man/checkHemisphering.Rd | 2 +- man/colBases.Rd | 2 +- man/getOptimization.Rd | 2 +- man/mapBootstrapCoords.Rd | 2 +- man/moveTrappedPoints.Rd | 2 +- man/ptLeverage.Rd | 2 +- man/ptTriangulationBlob.Rd | 2 +- man/realignOptimizations.Rd | 2 +- man/recalculateStress.Rd | 2 +- man/tableDistances.Rd | 2 +- tests/spelling.R | 3 + vignettes/adding-sequences.Rmd | 2 +- vignettes/assessing_map_uncertainty.Rmd | 2 +- vignettes/intro-to-antigenic-cartography.Rmd | 2 +- vignettes/making-a-map-from-scratch.Rmd | 2 +- 30 files changed, 151 insertions(+), 42 deletions(-) create mode 100644 inst/WORDLIST create mode 100644 tests/spelling.R diff --git a/DESCRIPTION b/DESCRIPTION index d17677db..3da2da3b 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -53,7 +53,8 @@ Suggests: tidyr, base64enc, lifecycle, - MCMCpack + MCMCpack, + spelling LinkingTo: Rcpp, RcppArmadillo, @@ -67,3 +68,4 @@ VignetteBuilder: knitr URL: https://acorg.github.io/Racmacs/, https://github.com/acorg/Racmacs/ BugReports: https://github.com/acorg/Racmacs/issues License: AGPL-3 +Language: en-GB diff --git a/NEWS.md b/NEWS.md index 9e31dba4..13e37ad0 100644 --- a/NEWS.md +++ b/NEWS.md @@ -179,7 +179,7 @@ # Racmacs 1.1.38 * Add option to specify a subset of antigens and sera for which to calculate blobs in the `bootstrapBlobs()` function * Add method for plotting a map using ggplot i.e. `ggplot(map)`. -* When coloring by sequence a more distinct color pallette is used +* When coloring by sequence a more distinct color palette is used # Racmacs 1.1.39 * Correct error when plotting cases where blobs were calculated for only 1 antigen / serum @@ -189,7 +189,7 @@ # Racmacs 1.1.40 * Add some options to view.acmap to set the starting viewer translation, rotation and zoom * Add `grid.lwd` option to control grid linewidth in `ggplot(map)` -* Add antigen and sera names to vector when retreiving antigen and sera attributes like `agFill()` +* Add antigen and sera names to vector when retrieving antigen and sera attributes like `agFill()` # Racmacs 1.2.0 * Add new options and default methods to use when merging titers as described for `RacMerge.options()` diff --git a/R/map_blobs.R b/R/map_blobs.R index 897f3409..153a3ab4 100644 --- a/R/map_blobs.R +++ b/R/map_blobs.R @@ -106,7 +106,7 @@ srBaseBootstrapBlobs <- function(map, optimization_number = 1) { #' @param serum The serum to get the blob for #' @param optimization_number Optimization number from which to get blob information #' -#' @returns Returns an object of class "blob" that can be plotted using the `blob()` funciton. +#' @returns Returns an object of class "blob" that can be plotted using the `blob()` function. #' @name ptTriangulationBlob #' #' @family map diagnostic functions diff --git a/R/map_diagnostics_bootstrap.R b/R/map_diagnostics_bootstrap.R index c708c0c8..84667a44 100644 --- a/R/map_diagnostics_bootstrap.R +++ b/R/map_diagnostics_bootstrap.R @@ -26,7 +26,7 @@ #' @details ## Bootstrapping methods #' #' __"resample"__: -#' The [resample boostrap](https://en.wikipedia.org/wiki/Bootstrapping_(statistics)#Case_resampling) +#' The [resample bootstrap](https://en.wikipedia.org/wiki/Bootstrapping_(statistics)#Case_resampling) #' is the most standard bootstrap method, a random resample of the titer table data is #' taken _with replacement_. Depending on your specification, resampling is applied across #' either individual antigens, individual sera or both antigens and sera. @@ -53,7 +53,7 @@ #' The noisy bootstrap, sometimes termed a #' [smooth bootstrap](https://en.wikipedia.org/wiki/Bootstrapping_(statistics)#Smooth_bootstrap) #' involved adding normally distributed noise to each observation. The distribution of this noise can -#' be parametrised through the `ag_noise_sd` and `titer_noise_sd` arguments. `titer_noise_sd` refers to the +#' be parameterised through the `ag_noise_sd` and `titer_noise_sd` arguments. `titer_noise_sd` refers to the #' standard deviation (on the log scale) of noise added to each individual titer measurement in the table, #' while `antigen_noise_sd` refers to the standard deviation of noise applied to titers for each antigen. #' The reason for this distinction is that we have noticed with repeat measurements of influenza data there @@ -158,7 +158,7 @@ hasBootstrapData <- function(map, optimization_number) { #' Get bootstrap coordinates associated with a map #' #' This can be used to get information about the bootstrap run results -#' after `boostrapMap()` has been run. +#' after `bootstrapMap()` has been run. #' #' @param map The map object #' diff --git a/R/map_diagnostics_bootstrap_blobs.R b/R/map_diagnostics_bootstrap_blobs.R index 2d9f89ea..758105fe 100644 --- a/R/map_diagnostics_bootstrap_blobs.R +++ b/R/map_diagnostics_bootstrap_blobs.R @@ -11,7 +11,7 @@ #' in the bootstrap repeats. Note however that the accuracy of these estimates #' will depend on the number of bootstrap repeats performed, for example whether #' 100 or 1000 repeats were performed in the initial calculations using -#' `boostrapMap()`. +#' `bootstrapMap()`. #' #' @param map The acmap data object #' @param conf.level The proportion of positional variation captured by each blob diff --git a/R/map_diagnostics_leverage.R b/R/map_diagnostics_leverage.R index 248d2165..c3d1b7db 100644 --- a/R/map_diagnostics_leverage.R +++ b/R/map_diagnostics_leverage.R @@ -4,7 +4,7 @@ #' These functions attempt to estimate leverage of each antigen, sera or titer #' by removing it from the data, relaxing the map, then calculating the rmsd of #' the procrustes comparison between the original and newly relaxed map. Column -#' bases will be recalculated unless you have specifed them as fixed with +#' bases will be recalculated unless you have specified them as fixed with #' `fixedColBases()`. #' #' @param map An acmap object diff --git a/R/map_optimizations.R b/R/map_optimizations.R index 41c3b023..77be3526 100644 --- a/R/map_optimizations.R +++ b/R/map_optimizations.R @@ -107,7 +107,7 @@ listOptimizations <- function(map) { #' Get optimization details from an acmap object #' -#' Gets the details associated with the currently selected or specifed acmap +#' Gets the details associated with the currently selected or specified acmap #' optimization as a list. #' #' @param map The acmap data object diff --git a/R/map_optimize.R b/R/map_optimize.R index 01818c48..aff36dae 100644 --- a/R/map_optimize.R +++ b/R/map_optimize.R @@ -520,7 +520,7 @@ mapRelaxed <- function( #' @param optimization_number The map optimization number #' @param grid_spacing When doing a grid search of more optimal point positions #' the grid spacing to use -#' @param stress_lim The stess difference to use when classifying a point as +#' @param stress_lim The stress difference to use when classifying a point as #' "hemisphering" or not #' @param options A named list of options to pass to `RacOptimizer.options()` #' @@ -602,7 +602,7 @@ checkHemisphering <- function( #' @param optimization_number The map optimization number to apply it to #' @param grid_spacing Grid spacing in antigenic units of the search grid to use #' when searching for more optimal positions -#' @param max_iterations The maximum number of interations of searching for +#' @param max_iterations The maximum number of iterations of searching for #' trapped points then relaxing the map to be performed #' @param options List of named optimizer options, see `RacOptimizer.options()` #' diff --git a/R/map_procrustes.R b/R/map_procrustes.R index 7feeab01..14178bb8 100644 --- a/R/map_procrustes.R +++ b/R/map_procrustes.R @@ -208,7 +208,7 @@ hasProcrustes <- function(map, optimization_number = 1) { #' Realigns optimizations in the map #' -#' Realigns all map optimizations through rotatation and translation to match +#' Realigns all map optimizations through rotation and translation to match #' point positions as closely as possible to the first optimization run. This #' is done by default when optimizing a map and makes comparing point positions #' in each optimization run much easier to do by eye. diff --git a/R/map_props_optimizations.R b/R/map_props_optimizations.R index 7f13fd66..a02aef91 100644 --- a/R/map_props_optimizations.R +++ b/R/map_props_optimizations.R @@ -117,7 +117,7 @@ mapTranslation <- optimization_getter(ac_opt_get_translation) #' #' Note that although the output from `colBases()` might be the same in a case #' where a minimum column basis was set or a case where column bases were set -#' explcitely, when a minimum column basis is set, the column bases will still +#' explicitly, when a minimum column basis is set, the column bases will still #' depend on the log titers recorded against a given sera, so changing the #' titers may therefore change the actual column bases calculated. For fixed #' column bases case, column bases will remain fixed at their values diff --git a/R/map_stress.R b/R/map_stress.R index 29c2247b..c7ed83c5 100644 --- a/R/map_stress.R +++ b/R/map_stress.R @@ -2,7 +2,7 @@ #' Return calculated table distances for an acmap #' #' Takes the acmap object and, assuming the column bases associated with the -#' currently selected or specifed optimization, returns the table distances +#' currently selected or specified optimization, returns the table distances #' calculated from the titer data. For more information on column bases and #' their role in antigenic cartography see #' `vignette("intro-to-antigenic-cartography")` @@ -233,7 +233,7 @@ mapResiduals <- function( #' Recalculate the stress associated with an acmap optimization #' #' Recalculates the stress associated with the currently selected or -#' user-specifed optimization. +#' user-specified optimization. #' #' @param map The acmap data object #' @param optimization_number The optimization number diff --git a/inst/WORDLIST b/inst/WORDLIST new file mode 100644 index 00000000..139eb803 --- /dev/null +++ b/inst/WORDLIST @@ -0,0 +1,104 @@ +Armijo +BN +CMD +Color +Coudert +Frankensteining +HAUs +HK +MDS +OpenMP +RBCs +Rac +RacOptimizer +RacViewer +Relatedly +Rmd +Sera +Titer +acmacs +acmap +acmaps +ag +alt +antigenically +bayesian +bootstrapBlobs +brotli +color +colored +coloring +colors +conf +coords +csv +devtools +dilutionStepsize +dirichilet +div +doi +ensmallen +etc +fortran +frac +gcc +ggplot +github +hemisphering +htmlAdjustedTiterTable +htmlwidget +int +intel +javascript +js +jsCode +json +kde +kernal +ks +labeled +labeling +lessthan +linewidth +linux +lispmds +listmds +logtiter +nd +nondetectable +nows +num +optimizeAgReactivity +org +os +parameterised +plotspec +procrusted +procrustes +racmap +racviewer +rapidjson +reactivities +reoptimization +reoptimizations +reoptimize +reoptimized +reoptimizing +rmsd +rmse +sd +sera +sr +standalone +threejs +tibble +titer +titerTable +titers +triangulationBlobs +var +webgl +xlim +xls +xz +ylim diff --git a/inst/htmlwidgets/RacViewer/lib/functions/load.js b/inst/htmlwidgets/RacViewer/lib/functions/load.js index d87c7b8e..b448e300 100644 --- a/inst/htmlwidgets/RacViewer/lib/functions/load.js +++ b/inst/htmlwidgets/RacViewer/lib/functions/load.js @@ -7,15 +7,15 @@ Racmacs.Viewer.prototype.load = function( light ){ - // Set default options + // Set default options if (options["grid.col"] === undefined) options["grid.col"] = "#cfcfcf"; if (options["background.col"] === undefined) options["background.col"] = "#ffffff"; if (options["point.opacity"] === undefined || options["point.opacity"] === null) { options["point.opacity"] = this.styleset.noselections.unhovered.unselected.opacity; }; - if(options.maintain_viewpoint){ - var selected_points = this.getSelectedPointIndices(); + if(options.maintain_viewpoint){ + var selected_points = this.getSelectedPointIndices(); var selected_projection = this.data.projection(); } @@ -155,7 +155,7 @@ Racmacs.Viewer.prototype.load = function( } - // Add any boostrap info + // Add any bootstrap info var bootstrap = this.data.bootstrap(); if(bootstrap !== undefined){ this.showBootstrapPoints(bootstrap); @@ -171,10 +171,10 @@ Racmacs.Viewer.prototype.load = function( // Set camera zoom if(this.data.numProjections() > 0 && !options.maintain_viewpoint) { - + var zoom = this.data.getViewerSetting("zoom"); if(zoom === null){ - + var scale = this.scene.getWorldScale(); xlim = [xlim[0]*scale[0], xlim[1]*scale[0]]; ylim = [ylim[0]*scale[1], ylim[1]*scale[1]]; @@ -227,7 +227,7 @@ Racmacs.Viewer.prototype.load = function( this.colorpanel.showColorByGroup(); } else { - + this.colorpanel.hideColorByGroup(); } @@ -257,8 +257,8 @@ Racmacs.Viewer.prototype.load = function( this.updatePointStyles(); // Reselect any points - if(options.maintain_viewpoint){ - this.selectByPointIndices(selected_points); + if(options.maintain_viewpoint){ + this.selectByPointIndices(selected_points); this.switchToProjection(selected_projection); } diff --git a/man/bootstrapBlobs.Rd b/man/bootstrapBlobs.Rd index 935fe914..8e7fa953 100644 --- a/man/bootstrapBlobs.Rd +++ b/man/bootstrapBlobs.Rd @@ -48,7 +48,7 @@ blobs that are calculated to encompass 95\% of the positional variation seen in the bootstrap repeats. Note however that the accuracy of these estimates will depend on the number of bootstrap repeats performed, for example whether 100 or 1000 repeats were performed in the initial calculations using -\code{boostrapMap()}. +\code{bootstrapMap()}. } \seealso{ Other map diagnostic functions: diff --git a/man/bootstrapMap.Rd b/man/bootstrapMap.Rd index ee251525..d9ac57f2 100644 --- a/man/bootstrapMap.Rd +++ b/man/bootstrapMap.Rd @@ -57,7 +57,7 @@ methods you can apply. \subsection{Bootstrapping methods}{ \strong{"resample"}: -The \href{https://en.wikipedia.org/wiki/Bootstrapping_(statistics)#Case_resampling}{resample boostrap} +The \href{https://en.wikipedia.org/wiki/Bootstrapping_(statistics)#Case_resampling}{resample bootstrap} is the most standard bootstrap method, a random resample of the titer table data is taken \emph{with replacement}. Depending on your specification, resampling is applied across either individual antigens, individual sera or both antigens and sera. @@ -84,7 +84,7 @@ want to stick with the "resample" method. The noisy bootstrap, sometimes termed a \href{https://en.wikipedia.org/wiki/Bootstrapping_(statistics)#Smooth_bootstrap}{smooth bootstrap} involved adding normally distributed noise to each observation. The distribution of this noise can -be parametrised through the \code{ag_noise_sd} and \code{titer_noise_sd} arguments. \code{titer_noise_sd} refers to the +be parameterised through the \code{ag_noise_sd} and \code{titer_noise_sd} arguments. \code{titer_noise_sd} refers to the standard deviation (on the log scale) of noise added to each individual titer measurement in the table, while \code{antigen_noise_sd} refers to the standard deviation of noise applied to titers for each antigen. The reason for this distinction is that we have noticed with repeat measurements of influenza data there diff --git a/man/checkHemisphering.Rd b/man/checkHemisphering.Rd index 70539126..540b3a19 100644 --- a/man/checkHemisphering.Rd +++ b/man/checkHemisphering.Rd @@ -20,7 +20,7 @@ checkHemisphering( \item{grid_spacing}{When doing a grid search of more optimal point positions the grid spacing to use} -\item{stress_lim}{The stess difference to use when classifying a point as +\item{stress_lim}{The stress difference to use when classifying a point as "hemisphering" or not} \item{options}{A named list of options to pass to \code{RacOptimizer.options()}} diff --git a/man/colBases.Rd b/man/colBases.Rd index 3c44240a..25e008bc 100644 --- a/man/colBases.Rd +++ b/man/colBases.Rd @@ -42,7 +42,7 @@ vector of values. Note that although the output from \code{colBases()} might be the same in a case where a minimum column basis was set or a case where column bases were set -explcitely, when a minimum column basis is set, the column bases will still +explicitly, when a minimum column basis is set, the column bases will still depend on the log titers recorded against a given sera, so changing the titers may therefore change the actual column bases calculated. For fixed column bases case, column bases will remain fixed at their values diff --git a/man/getOptimization.Rd b/man/getOptimization.Rd index 9f68a4ac..66b6b323 100644 --- a/man/getOptimization.Rd +++ b/man/getOptimization.Rd @@ -15,7 +15,7 @@ getOptimization(map, optimization_number = 1) Returns a list with information about the optimization } \description{ -Gets the details associated with the currently selected or specifed acmap +Gets the details associated with the currently selected or specified acmap optimization as a list. } \seealso{ diff --git a/man/mapBootstrapCoords.Rd b/man/mapBootstrapCoords.Rd index c6cb1dfc..30cdeb4c 100644 --- a/man/mapBootstrapCoords.Rd +++ b/man/mapBootstrapCoords.Rd @@ -22,7 +22,7 @@ the bootstrap runs } \description{ This can be used to get information about the bootstrap run results -after \code{boostrapMap()} has been run. +after \code{bootstrapMap()} has been run. } \seealso{ Other map diagnostic functions: diff --git a/man/moveTrappedPoints.Rd b/man/moveTrappedPoints.Rd index 25806fcd..8a37c218 100644 --- a/man/moveTrappedPoints.Rd +++ b/man/moveTrappedPoints.Rd @@ -20,7 +20,7 @@ moveTrappedPoints( \item{grid_spacing}{Grid spacing in antigenic units of the search grid to use when searching for more optimal positions} -\item{max_iterations}{The maximum number of interations of searching for +\item{max_iterations}{The maximum number of iterations of searching for trapped points then relaxing the map to be performed} \item{options}{List of named optimizer options, see \code{RacOptimizer.options()}} diff --git a/man/ptLeverage.Rd b/man/ptLeverage.Rd index 372590e9..e127d6ac 100644 --- a/man/ptLeverage.Rd +++ b/man/ptLeverage.Rd @@ -30,7 +30,7 @@ points. These functions attempt to estimate leverage of each antigen, sera or titer by removing it from the data, relaxing the map, then calculating the rmsd of the procrustes comparison between the original and newly relaxed map. Column -bases will be recalculated unless you have specifed them as fixed with +bases will be recalculated unless you have specified them as fixed with \code{fixedColBases()}. } \seealso{ diff --git a/man/ptTriangulationBlob.Rd b/man/ptTriangulationBlob.Rd index ecde949f..d340c6d7 100644 --- a/man/ptTriangulationBlob.Rd +++ b/man/ptTriangulationBlob.Rd @@ -29,7 +29,7 @@ ptTriangulationBlobs(map, optimization_number = 1) \item{serum}{The serum to get the blob for} } \value{ -Returns an object of class "blob" that can be plotted using the \code{blob()} funciton. +Returns an object of class "blob" that can be plotted using the \code{blob()} function. } \description{ Get antigen or serum triangulation blob information for plotting with the \code{blob()} function. diff --git a/man/realignOptimizations.Rd b/man/realignOptimizations.Rd index 4a4efcaf..f0095090 100644 --- a/man/realignOptimizations.Rd +++ b/man/realignOptimizations.Rd @@ -13,7 +13,7 @@ realignOptimizations(map) Returns the map with realigned optimizations } \description{ -Realigns all map optimizations through rotatation and translation to match +Realigns all map optimizations through rotation and translation to match point positions as closely as possible to the first optimization run. This is done by default when optimizing a map and makes comparing point positions in each optimization run much easier to do by eye. diff --git a/man/recalculateStress.Rd b/man/recalculateStress.Rd index 5985e76d..37d72130 100644 --- a/man/recalculateStress.Rd +++ b/man/recalculateStress.Rd @@ -16,7 +16,7 @@ Returns the recalculated map stress for a given optimization } \description{ Recalculates the stress associated with the currently selected or -user-specifed optimization. +user-specified optimization. } \seealso{ See \code{pointStress()} for getting the stress of individual points. diff --git a/man/tableDistances.Rd b/man/tableDistances.Rd index 4c6b6067..1cfc5cdc 100644 --- a/man/tableDistances.Rd +++ b/man/tableDistances.Rd @@ -16,7 +16,7 @@ Returns a matrix of numeric table distances } \description{ Takes the acmap object and, assuming the column bases associated with the -currently selected or specifed optimization, returns the table distances +currently selected or specified optimization, returns the table distances calculated from the titer data. For more information on column bases and their role in antigenic cartography see \code{vignette("intro-to-antigenic-cartography")} diff --git a/tests/spelling.R b/tests/spelling.R new file mode 100644 index 00000000..6713838f --- /dev/null +++ b/tests/spelling.R @@ -0,0 +1,3 @@ +if(requireNamespace('spelling', quietly = TRUE)) + spelling::spell_check_test(vignettes = TRUE, error = FALSE, + skip_on_cran = TRUE) diff --git a/vignettes/adding-sequences.Rmd b/vignettes/adding-sequences.Rmd index e1c5c0c9..aae449f4 100644 --- a/vignettes/adding-sequences.Rmd +++ b/vignettes/adding-sequences.Rmd @@ -46,7 +46,7 @@ srSequences(map) <- sr_sequences ``` -Note that when adding the sequence data, the expected format is a dense character matrix, any row or column names are ignored and it is assumed that there will be a row corresponding to the sequence for each antigen or sera. Missing sequences for an antigen or sera are encoded by a row of dashes `-`. Sequence positions will be labelled by column number, starting from 1, and there's currently not yet support for labelling sequence positions differently by column name or anything like that but it might be added in the future. +Note that when adding the sequence data, the expected format is a dense character matrix, any row or column names are ignored and it is assumed that there will be a row corresponding to the sequence for each antigen or sera. Missing sequences for an antigen or sera are encoded by a row of dashes `-`. Sequence positions will be labelled by column number, starting from 1, and there's currently not yet support for labeling sequence positions differently by column name or anything like that but it might be added in the future. ## Viewing sequence data Now that sequence data has been added to the map object, it will be available to view alongside the map when `view()` is called on the map object. diff --git a/vignettes/assessing_map_uncertainty.Rmd b/vignettes/assessing_map_uncertainty.Rmd index d254746e..19af69f9 100644 --- a/vignettes/assessing_map_uncertainty.Rmd +++ b/vignettes/assessing_map_uncertainty.Rmd @@ -60,7 +60,7 @@ Generally, the resampling based bootstrap methods described above work best wher In all datasets we have so far studied we find there are two important categories of noise to consider, the first is the expected noise due to general assay variation that tends to lead to unbiased variation in repeat data. We call this “titer” noise and is generally what most people think about when it comes to experimental noise. The second and far more pernicious noise is noise in antigen measurements that leads to a consistent bias in any given set of repeats, in this category for influenza are things like slight fluctuation in starting virus concentration after titrating to 4HAUs, different RBCs being used etc. Relatedly there is also bias that may be consistently present for an antigen even between repeats due to inherent but non-antigenically related differences, often referred to as high or low avidity strains, or strains with a tendency to be more easily neutralized etc. Since both these types of error have the same result of biasing all titers against an antigen to be consistently higher or lower, we call this “antigen noise”. -While antigenic cartography typically does a great job of averaging out titer noise, antigen noise is trickier since there is no a priori way to know whether an antigen has low titers because of additional antigenic escape or falsely biased low reactivity in the assay. In the real world we often have clues, for example biased varation between repeats done at different times or low titers against homologous sera, but such information is not built into the cartography software. We can however simulate the effects of such noise in creating uncertainty in the map and that is the idea of the `method = “noisy”` bootstrap approach. As you can perhaps imagine, in addition to options shared with the methods above, key parameters are how much titer and antigen noise to simulate. Based on our influenza work both the titer noise and antigen noise is set at a default of standard deviation = 0.7, but depending on your data these may be wild over- or under-estimates. By default both titer and antigen noise are applied, with tirer noise randomly determined and applied separately to each cell in the titer table for each repeat and antigen noise determined and applied to each row. In practise, especially given the tricky nature of estimating antigen reactivity bias, it can be useful to look at the effect of titer noise on it’s own first, by setting the `antigen_noise_sd = 0`, then see the effect in combination with some possible per-antigen noise. +While antigenic cartography typically does a great job of averaging out titer noise, antigen noise is trickier since there is no a priori way to know whether an antigen has low titers because of additional antigenic escape or falsely biased low reactivity in the assay. In the real world we often have clues, for example biased variation between repeats done at different times or low titers against homologous sera, but such information is not built into the cartography software. We can however simulate the effects of such noise in creating uncertainty in the map and that is the idea of the `method = “noisy”` bootstrap approach. As you can perhaps imagine, in addition to options shared with the methods above, key parameters are how much titer and antigen noise to simulate. Based on our influenza work both the titer noise and antigen noise is set at a default of standard deviation = 0.7, but depending on your data these may be wild over- or under-estimates. By default both titer and antigen noise are applied, with titer noise randomly determined and applied separately to each cell in the titer table for each repeat and antigen noise determined and applied to each row. In practise, especially given the tricky nature of estimating antigen reactivity bias, it can be useful to look at the effect of titer noise on it’s own first, by setting the `antigen_noise_sd = 0`, then see the effect in combination with some possible per-antigen noise. ### Viewing bootstrap results Once you have run your desired bootstrap method you will want to visualise the results. One way is to open a map that you have run bootstrapping on in the Racmacs viewer. If bootstrapping data is present then when you select a point, a cloud of points appears representing the relative position of that point in each of the bootstrap runs done, allowing you to visualise variation explicitly. A second approach is to use the `bootstrapBlobs()` function to calculate an area that encompasses a certain proportion of the positional variation across the repeats. In this case, the conf.level argument sets the proportion of variation to capture, with the default set at 0.68, approximately equivalent to one standard deviation of the normal distribution. diff --git a/vignettes/intro-to-antigenic-cartography.Rmd b/vignettes/intro-to-antigenic-cartography.Rmd index e8c938bd..6171b984 100644 --- a/vignettes/intro-to-antigenic-cartography.Rmd +++ b/vignettes/intro-to-antigenic-cartography.Rmd @@ -100,7 +100,7 @@ __Bias__ While antigenic maps generally do a good job of accounting for random assay noise they are still vulnerable to systematic assay bias, for example if a strain tends to just react with low titers in general in the assay this will often cause the strain to move away antigenically, since low serum titers can also be associated with antigenic change. __Effect of outliers__ -Depending on how much data goes into making a map it can be more or less vulnerable to outliers in the data. Even maps with quite a lot of data can be vulnerable to for example the odd sera that justs reacts to everything in the assay for example. This is a good thing to look for and be aware of. +Depending on how much data goes into making a map it can be more or less vulnerable to outliers in the data. Even maps with quite a lot of data can be vulnerable to for example the odd sera that just reacts to everything in the assay for example. This is a good thing to look for and be aware of. __Map uncertainty__ Again, especially with little data, you may see patterns of antigenic difference suggested in the map but how strongly these differences are supported by the data can vary, sometimes hinging on reactivity seen in a single antigen or serum or even titer. We continue to develop methods like "noisy bootstrapping" of the maps to help better understand the level of uncertainty in such cases. diff --git a/vignettes/making-a-map-from-scratch.Rmd b/vignettes/making-a-map-from-scratch.Rmd index 178e647a..fd06d7fb 100644 --- a/vignettes/making-a-map-from-scratch.Rmd +++ b/vignettes/making-a-map-from-scratch.Rmd @@ -62,7 +62,7 @@ map <- acmap( ) ``` -The resulting object, that we've given the name `map` in this case, only has properties associated with the table. If the table had column names and row names, serum and antigen names are inferred from these. Alternatively, you can set these explicitely when creating the map with the `ag_names` and `sr_names` arguments. +The resulting object, that we've given the name `map` in this case, only has properties associated with the table. If the table had column names and row names, serum and antigen names are inferred from these. Alternatively, you can set these explicitly when creating the map with the `ag_names` and `sr_names` arguments. ## Running optimizations Although we now have the acmap object there is no "map" yet as such, since we need to invoke the optimiser function to try and determine the antigenic map that best represents the patterns of reactivity seen in the titer table. To do this we call the function `optimizeMap()` on the acmap object we've made, specifying the number of optimization runs and other parameters like the minimum column basis and number of dimensions. From 073b840db7beeb6bbba0dbf3222ff61f1afdd161 Mon Sep 17 00:00:00 2001 From: Sam Wilks Date: Wed, 22 Nov 2023 09:55:17 +0000 Subject: [PATCH 13/18] Update date --- DESCRIPTION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DESCRIPTION b/DESCRIPTION index 3da2da3b..2d338623 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -2,7 +2,7 @@ Package: Racmacs Type: Package Title: Antigenic Cartography Macros Version: 1.2.8 -Date: 2023-09-01 +Date: 2023-11-22 Authors@R: c(person(given = "Sam", family = "Wilks", From 1f84aecf6831be501e43f7e4c63c97542c7e0120 Mon Sep 17 00:00:00 2001 From: Sam Wilks Date: Wed, 22 Nov 2023 10:34:48 +0000 Subject: [PATCH 14/18] Update cran-comments --- cran-comments.md | 29 ----------------------------- 1 file changed, 29 deletions(-) diff --git a/cran-comments.md b/cran-comments.md index c61f6d1b..858617db 100644 --- a/cran-comments.md +++ b/cran-comments.md @@ -3,32 +3,3 @@ 0 errors | 0 warnings | 1 note * This is a new release. - -## Alterations upon resubmission - -Redundant "R" removed from title. - -Full name provided in the Author and Maintainer field. - -Package description expanded and reference added describing the methods implemented. - -Size of package tarball reduced. - -Return value information added to all .Rd files where value information was -found to be missing. - -Looked for but could not find examples of cases where the user's home filespace -or package directory are written to. Any further pointers on where potential -violations of this policy were found would be greatly appreciated. Many thanks! - -`on.exit()` calls added to code in `R/map_plot.R` and -`inst/shinyapps/RacmacsGUI/app.R` where changes to graphical parameters and -user options are made. - -## Alterations upon resubmission 2 - -Unnecessary additional spaces remove from the "Description" field of the package -DESCRIPTION file. - -Documentation added for the return value for the `view()` and -`keepOptimizations()` functions From c18e0b63d4f87c4b22a4c2b4c93b00d3e74651c0 Mon Sep 17 00:00:00 2001 From: Sam Wilks Date: Wed, 22 Nov 2023 18:00:12 +0000 Subject: [PATCH 15/18] Update cran-comments to describe fix to reason package was archived. --- cran-comments.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/cran-comments.md b/cran-comments.md index 858617db..3ee7b6e1 100644 --- a/cran-comments.md +++ b/cran-comments.md @@ -2,4 +2,5 @@ 0 errors | 0 warnings | 1 note -* This is a new release. +Package was archived because the function `gdata::read.xls()` was removed, this +is now replaced in this version by using `readxl::read_excel()` function. From c6127fade18cf13852b7b1327b41eb8d94dfaed6 Mon Sep 17 00:00:00 2001 From: Sam Wilks Date: Wed, 22 Nov 2023 18:04:29 +0000 Subject: [PATCH 16/18] Remove spelling test --- tests/spelling.R | 3 --- 1 file changed, 3 deletions(-) delete mode 100644 tests/spelling.R diff --git a/tests/spelling.R b/tests/spelling.R deleted file mode 100644 index 6713838f..00000000 --- a/tests/spelling.R +++ /dev/null @@ -1,3 +0,0 @@ -if(requireNamespace('spelling', quietly = TRUE)) - spelling::spell_check_test(vignettes = TRUE, error = FALSE, - skip_on_cran = TRUE) From f738ce3c333d12ada310f0c6aef4c01f9ab464cd Mon Sep 17 00:00:00 2001 From: Sam Wilks Date: Wed, 22 Nov 2023 18:05:22 +0000 Subject: [PATCH 17/18] Update CRAN-SUBMISSION --- CRAN-SUBMISSION | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/CRAN-SUBMISSION b/CRAN-SUBMISSION index da955b62..0524eb9a 100644 --- a/CRAN-SUBMISSION +++ b/CRAN-SUBMISSION @@ -1,3 +1,3 @@ -Version: 1.2.7 -Date: 2023-09-04 03:42:56 UTC -SHA: 21967637c83cde51e4846f1274aeadcc20de3503 +Version: 1.2.8 +Date: 2023-11-22 10:39:37 UTC +SHA: 1f84aecf6831be501e43f7e4c63c97542c7e0120 From 314f6227ad67879a3f2154a48e3535cfb1beff45 Mon Sep 17 00:00:00 2001 From: Sam Wilks Date: Thu, 23 Nov 2023 12:42:57 +0000 Subject: [PATCH 18/18] Update CRAN-SUBMISSION --- CRAN-SUBMISSION | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CRAN-SUBMISSION b/CRAN-SUBMISSION index 0524eb9a..0dac137f 100644 --- a/CRAN-SUBMISSION +++ b/CRAN-SUBMISSION @@ -1,3 +1,3 @@ Version: 1.2.8 -Date: 2023-11-22 10:39:37 UTC -SHA: 1f84aecf6831be501e43f7e4c63c97542c7e0120 +Date: 2023-11-22 18:14:09 UTC +SHA: f738ce3c333d12ada310f0c6aef4c01f9ab464cd