From ad9736d8bbc09c19dbf1807f6496b1822ff16c48 Mon Sep 17 00:00:00 2001 From: amy Date: Wed, 4 Mar 2026 14:30:23 -0800 Subject: [PATCH 1/6] initial integration of external packages --- DESCRIPTION | 2 - NAMESPACE | 2 - R/calculate_log_penalty.R | 5 +- R/fastnnls.R | 335 ++++++++++++++++++++ R/logsum.R | 74 +++++ R/simpl_auglag_fnnls.R | 3 +- README.Rmd | 9 - README.md | 16 +- tests/testthat/test-calculate_log_penalty.R | 2 - vignettes/dilution-series.Rmd | 2 +- 10 files changed, 419 insertions(+), 31 deletions(-) create mode 100644 R/fastnnls.R create mode 100644 R/logsum.R diff --git a/DESCRIPTION b/DESCRIPTION index 627f9d5..b719737 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -14,8 +14,6 @@ RoxygenNote: 7.3.3 Depends: R (>= 3.5.0), cir, - fastnnls, - logsum, numDeriv, parallel, stats diff --git a/NAMESPACE b/NAMESPACE index d43b040..2a073fb 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -5,7 +5,5 @@ export(bootstrap_lrt) export(estimate_parameters) export(evaluate_criterion_lr) import(cir) -import(fastnnls) -import(logsum) import(parallel) import(stats) diff --git a/R/calculate_log_penalty.R b/R/calculate_log_penalty.R index a27be49..a2a4a96 100644 --- a/R/calculate_log_penalty.R +++ b/R/calculate_log_penalty.R @@ -9,7 +9,6 @@ #' treated as known #' @param barrier_t The current value of t, the barrier penalty parameter #' -#' @import logsum #' #' @return The calculated value of the barrier penalty calculate_log_penalty <- function(varying_lr_df, @@ -22,13 +21,13 @@ calculate_log_penalty <- function(varying_lr_df, log_P <- lapply(which_rho_k, function(k) (varying_lr_df$value[varying_lr_df$param == "rho" & varying_lr_df$k == k]) %>% - (function(x) c(x,0) - logsum::sum_of_logs(c(x,0)))) + (function(x) c(x,0) - sum_of_logs(c(x,0)))) log_P_tilde <- lapply(which_rho_tilde_k, function(k) (varying_lr_df$value[ varying_lr_df$param == "rho_tilde" & varying_lr_df$k == k]) %>% - (function(x) c(x,0) - logsum::sum_of_logs(c(x,0)))) + (function(x) c(x,0) - sum_of_logs(c(x,0)))) log_ra_sum <- do.call(sum,log_P) + do.call(sum,log_P_tilde) return((-1/barrier_t)*log_ra_sum) diff --git a/R/fastnnls.R b/R/fastnnls.R new file mode 100644 index 0000000..6a7e400 --- /dev/null +++ b/R/fastnnls.R @@ -0,0 +1,335 @@ +fast_nnls <- function(ZTx, + ZTZ, + active = NULL, + unconstrained = NULL, + tolerance = 1e-10){ + # store number of covariates + p <- nrow(ZTZ) + + if(length(intersect(active,unconstrained)) >0){ + stop("A variable cannot be assigned to the unconstrained set and to the active set.") + } + ### getting stuck in this initial loop for some reason! check it out! + if(!is.null(active)){ + + #set d = 0 to start + d <- matrix(0,nrow = p,ncol = 1) + #check appropriateness of initial active set + s <- matrix(0,nrow = p,ncol = 1) + not_active <- !(1:p %in% active) + s_passive <- qr.solve(ZTZ[not_active,not_active,drop = F],ZTx[not_active,drop = F],tol = 1e-14) + s[not_active,] <- s_passive + + ### redefine not_active to excluded unconstrained variables (if included) + if(!is.null(unconstrained)){ + not_active <- !(1:p %in% union(active,unconstrained)) + s_passive <- s[not_active] + } + #Enter inner loop + if(length(s_passive) >0){ + while(ifelse(length(s_passive)>0,min(s_passive)<= 0,FALSE)){ + + alphas <- (-(d[not_active]) / (d[not_active] - s_passive)) + alphas <- alphas[s_passive<0] + alpha <- min(-alphas) + + + d_archive <- d + d <- d + alpha*(s - d) + stopifnot(sum(is.na(d))==0) + + if(is.null(unconstrained)){ + active <- (1:p)[d==0] + not_active <- !(1:p %in% active) + } + if(!is.null(unconstrained)){ + active <- (1:p)[(d==0)&(!((1:p)%in%unconstrained))] + not_active <- !(1:p %in% active) + } + + + s <- matrix(0,nrow = p) + if(length(active)>0){ + s_passive <- qr.solve(ZTZ[not_active,not_active],ZTx[not_active,],tol = 1e-14) + s[not_active,] <- s_passive + } else{ + s <- s_passive <- qr.solve(ZTZ,ZTx,tol = 1e-14) + } + + if(!is.null(unconstrained)){ + not_active <- !(1:p %in% union(active,unconstrained)) + s_passive <- s[not_active] + } + + }} + d <- s + active <- (1:p)[d==0] + + w <- ZTx - ZTZ%*%d + } + if(is.null(active)){ + if(is.null(unconstrained)){ + active <- 1:p + d <- matrix(0,nrow = p, ncol = 1) + w <- ZTx + } else{ + active <- (1:p)[!(1:p %in% unconstrained)] + d <- matrix(0,nrow = p, ncol = 1) + d[unconstrained] <- + qr.solve(ZTZ[unconstrained,unconstrained],ZTx[unconstrained,], + tol = 1e-14) + w <- (ZTx - ZTZ%*%d) + } + } + + # counter <- 0 + #Enter main loop - ???? are loop conditions correct ??? + while( (ifelse(length(active) >0,max(w[active]), -1)>tolerance) ){ + # counter <- counter + 1 + # print(counter) + + to_remove <- which.max(w[active]) + # print(to_remove) + active <- active[-to_remove] + + + if(length(active)>0){ + s <- matrix(0,nrow = p) + not_active <- !(1:p %in% active) + + s_passive <- qr.solve(ZTZ[not_active,not_active],ZTx[not_active,],tol = 1e-14) + s[not_active,] <- s_passive + } else{ + s <- s_passive <- qr.solve(ZTZ,ZTx,tol = 1e-14) + } + + ### redefine not_active to excluded unconstrained variables (if included) + if(!is.null(unconstrained)){ + not_active <- !(1:p %in% union(active,unconstrained)) + s_passive <- s[not_active] + } + + #Enter inner loop + if(length(s_passive) >0){ + while(ifelse(length(s_passive)>0,min(s_passive)<= 0,FALSE)){ + + alphas <- (-(d[not_active]) / (d[not_active] - s_passive)) + alphas <- alphas[s_passive<0] + alpha <- min(-alphas) + + + d_archive <- d + d <- d + alpha*(s - d) + stopifnot(sum(is.na(d))==0) + + if(is.null(unconstrained)){ + active <- (1:p)[d==0] + not_active <- !(1:p %in% active) + } + if(!is.null(unconstrained)){ + active <- (1:p)[(d==0)&(!((1:p)%in%unconstrained))] + not_active <- !(1:p %in% active) + } + + s <- matrix(0,nrow = p) + if(length(active)>0){ + s_passive <- qr.solve(ZTZ[not_active,not_active],ZTx[not_active,],tol = 1e-14) + s[not_active,] <- s_passive + } else{ + s <- s_passive <- qr.solve(ZTZ,ZTx,tol = 1e-14) + } + + ### redefine not_active to excluded unconstrained variables (if included) + if(!is.null(unconstrained)){ + not_active <- !(1:p %in% union(active,unconstrained)) + s_passive <- s[not_active] + } + + }} + + d <- s + + stopifnot(sum(is.na(d))==0) + + + w <- (ZTx - ZTZ%*%d) + + # counter <- counter + 1 + + # print(counter) + # stopifnot(counter<13) + + + + } + + return(d) +} + +fast_nnls_Matrix <- function(ZTx, + ZTZ, + active = NULL, + unconstrained = NULL, + tolerance = 1e-10){ + # store number of covariates + p <- nrow(ZTZ) + + if(length(intersect(active,unconstrained)) >0){ + stop("A variable cannot be assigned to the unconstrained set and to the active set.") + } + ### getting stuck in this initial loop for some reason! check it out! + if(!is.null(active)){ + + #set d = 0 to start + d <- matrix(0,nrow = p,ncol = 1) + #check appropriateness of initial active set + s <- matrix(0,nrow = p,ncol = 1) + not_active <- !(1:p %in% active) + s_passive <- qr.solve(ZTZ[not_active,not_active,drop = F],ZTx[not_active,drop = F],tol = 1e-14) + s[not_active,] <- s_passive + + ### redefine not_active to excluded unconstrained variables (if included) + if(!is.null(unconstrained)){ + not_active <- !(1:p %in% union(active,unconstrained)) + s_passive <- s[not_active] + } + #Enter inner loop + if(length(s_passive) >0){ + while(ifelse(length(s_passive)>0,min(s_passive)<= 0,FALSE)){ + + alphas <- (-(d[not_active]) / (d[not_active] - s_passive)) + alphas <- alphas[s_passive<0] + alpha <- min(-alphas) + + + d_archive <- d + d <- d + alpha*(s - d) + stopifnot(sum(is.na(d))==0) + + if(is.null(unconstrained)){ + active <- (1:p)[d==0] + not_active <- !(1:p %in% active) + } + if(!is.null(unconstrained)){ + active <- (1:p)[(d==0)&(!((1:p)%in%unconstrained))] + not_active <- !(1:p %in% active) + } + + + s <- matrix(0,nrow = p) + if(length(active)>0){ + s_passive <- qr.solve(ZTZ[not_active,not_active],ZTx[not_active,],tol = 1e-14) + s[not_active,] <- s_passive + } else{ + s <- s_passive <- qr.solve(ZTZ,ZTx,tol = 1e-14) + } + + if(!is.null(unconstrained)){ + not_active <- !(1:p %in% union(active,unconstrained)) + s_passive <- s[not_active] + } + + }} + d <- s + active <- (1:p)[d==0] + + w <- ZTx - ZTZ%*%d + } + if(is.null(active)){ + if(is.null(unconstrained)){ + active <- 1:p + d <- matrix(0,nrow = p, ncol = 1) + w <- ZTx + } else{ + active <- (1:p)[!(1:p %in% unconstrained)] + d <- matrix(0,nrow = p, ncol = 1) + d[unconstrained] <- + qr.solve(ZTZ[unconstrained,unconstrained],ZTx[unconstrained,], + tol = 1e-14) + w <- (ZTx - ZTZ%*%d) + } + } + + # counter <- 0 + #Enter main loop - ???? are loop conditions correct ??? + while( (ifelse(length(active) >0,max(w[active]), -1)>tolerance) ){ + # counter <- counter + 1 + # print(counter) + + to_remove <- which.max(w[active]) + # print(to_remove) + active <- active[-to_remove] + + + if(length(active)>0){ + s <- matrix(0,nrow = p) + not_active <- !(1:p %in% active) + + s_passive <- qr.solve(ZTZ[not_active,not_active],ZTx[not_active,],tol = 1e-14) + s[not_active,] <- s_passive + } else{ + s <- s_passive <- qr.solve(ZTZ,ZTx,tol = 1e-14) + } + + ### redefine not_active to excluded unconstrained variables (if included) + if(!is.null(unconstrained)){ + not_active <- !(1:p %in% union(active,unconstrained)) + s_passive <- s[not_active] + } + + #Enter inner loop + if(length(s_passive) >0){ + while(ifelse(length(s_passive)>0,min(s_passive)<= 0,FALSE)){ + + alphas <- (-(d[not_active]) / (d[not_active] - s_passive)) + alphas <- alphas[s_passive<0] + alpha <- min(-alphas) + + + d_archive <- d + d <- d + alpha*(s - d) + stopifnot(sum(is.na(d))==0) + + if(is.null(unconstrained)){ + active <- (1:p)[d==0] + not_active <- !(1:p %in% active) + } + if(!is.null(unconstrained)){ + active <- (1:p)[(d==0)&(!((1:p)%in%unconstrained))] + not_active <- !(1:p %in% active) + } + + s <- matrix(0,nrow = p) + if(length(active)>0){ + s_passive <- qr.solve(ZTZ[not_active,not_active],ZTx[not_active,],tol = 1e-14) + s[not_active,] <- s_passive + } else{ + s <- s_passive <- qr.solve(ZTZ,ZTx,tol = 1e-14) + } + + ### redefine not_active to excluded unconstrained variables (if included) + if(!is.null(unconstrained)){ + not_active <- !(1:p %in% union(active,unconstrained)) + s_passive <- s[not_active] + } + + }} + + d <- s + + stopifnot(sum(is.na(d))==0) + + + w <- (ZTx - ZTZ%*%d) + + # counter <- counter + 1 + + # print(counter) + # stopifnot(counter<13) + + + + } + + return(d) +} diff --git a/R/logsum.R b/R/logsum.R new file mode 100644 index 0000000..5d98936 --- /dev/null +++ b/R/logsum.R @@ -0,0 +1,74 @@ +#' Sum positive numbers via their logarithms +#' Given x and y, this function returns log(exp(x) + exp(y)). +#' +#' @author David Clausen +#' +#' @param x the thing to be summed +#' +sum_of_logs <- function(x, y = NULL){ #calculates log(sum(exp(x))) + + if(is.null(y)){ + if(length(x) ==1){ + return(x) + } else{ + if(sum(!is.infinite(x)) == 0){ + if(sum(sign(x) != -1) == 0){ + return(-Inf) + } else{ + return(Inf) + } + } + x <- x[order(x, decreasing = TRUE)] + return(x[1] + log(1 + sum(exp(x[2:length(x)] - x[1]))))} + } else{ + if(length(x) != length(y)){ + stop("If y is provided, x and y must be the same length") + } + n <- length(x) + maxes <- pmax(x,y) + mins <- pmin(x,y) + return(maxes + log(1 + exp(mins - maxes))) + } +} + + + +diff_of_logs <- function(larger, smaller){ + return(larger + log( 1 - exp(smaller - larger) ) ) +} + + +signed_log_sum <- function(log_magnitudes, + signs){ + # if no nonzero summands, return zero + if(sum(signs != 0) == 0){ + return(c(0,0)) + } + + # if no negative summands, return sum of positive summands + if(sum(signs == -1) == 0){ + return(c(sum_of_logs(log_magnitudes[signs == 1]),1)) + } + + # if no positive summands, return sum of negative summands (with sign -1) + if(sum(signs == 1) == 0){ + return(c(sum_of_logs(log_magnitudes[signs == -1]),-1)) + } + + # otherwise sum positive and negative magnitudes separately + positives <- log_magnitudes[signs == 1] + negatives <- log_magnitudes[signs == -1] + + pos_logsum <- sum_of_logs(positives) + neg_logsum <- sum_of_logs(negatives) + + # if positive magnitude equals negative magnitude, return zero + if(pos_logsum == neg_logsum){ + return(c(0,0)) + } + + # otherwise return difference of positive and negative terms with appropriate sign + return(c(diff_of_logs(max(pos_logsum,neg_logsum), + min(pos_logsum, neg_logsum)), + ifelse(pos_logsum > neg_logsum, 1, -1))) +} \ No newline at end of file diff --git a/R/simpl_auglag_fnnls.R b/R/simpl_auglag_fnnls.R index ad43275..7f55e22 100644 --- a/R/simpl_auglag_fnnls.R +++ b/R/simpl_auglag_fnnls.R @@ -1,4 +1,3 @@ -#' @import fastnnls #' #' simpl_auglag_fnnls <- function(x, @@ -52,7 +51,7 @@ simpl_auglag_fnnls <- function(x, } ## END Amy July 8 2023 - x <- fastnnls::fast_nnls(ZTx = Ab, ZTZ = ATA, + x <- fast_nnls(ZTx = Ab, ZTZ = ATA, tolerance = constraint_tolerance) V <- abs(sum(x) - 1) diff --git a/README.Rmd b/README.Rmd index a5a0577..79f8e2a 100644 --- a/README.Rmd +++ b/README.Rmd @@ -37,15 +37,6 @@ You can install the development version of tinyvamp from [GitHub](https://github remotes::install_github("statdivlab/tinyvamp") ``` -If you haven't already, you may need to install `fastnnls` and `logsum`, too: - -``` r -# install.packages("remotes") -remotes::install_github("ailurophilia/fastnnls") -remotes::install_github("ailurophilia/logsum") -remotes::install_github("statdivlab/tinyvamp") -``` - diff --git a/README.md b/README.md index 628eca3..b2ebfdc 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,7 @@ # tinyvamp + [![Coverage @@ -33,21 +34,16 @@ You can install the development version of tinyvamp from remotes::install_github("statdivlab/tinyvamp") ``` -If you haven’t already, you may need to install `fastnnls` and `logsum`, -too: - -``` r -# install.packages("remotes") -remotes::install_github("ailurophilia/fastnnls") -remotes::install_github("ailurophilia/logsum") -remotes::install_github("statdivlab/tinyvamp") -``` - + + + + + ## Humans diff --git a/tests/testthat/test-calculate_log_penalty.R b/tests/testthat/test-calculate_log_penalty.R index 3fb077d..6d96298 100644 --- a/tests/testthat/test-calculate_log_penalty.R +++ b/tests/testthat/test-calculate_log_penalty.R @@ -1,6 +1,4 @@ test_that("log penalty is correct", { - require(logsum) - P <- matrix(1/7,ncol = 7, nrow = 1) P_tilde <- matrix(1/7,ncol = 7, nrow = 1) diff --git a/vignettes/dilution-series.Rmd b/vignettes/dilution-series.Rmd index 26ca777..ec12a4b 100644 --- a/vignettes/dilution-series.Rmd +++ b/vignettes/dilution-series.Rmd @@ -25,7 +25,7 @@ In this vignette, we will walk through how to use `tinyvamp` to estimate detecti ## Setup -We will start by loading the relevant packages. You might need to install `logsum` and `fastnnls` if you haven't already -- you can do this with `remotes::install_github("ailurophilia/logsum")` and `remotes::install_github("ailurophilia/fastnnls")`. Also, `speedyseq` is awesome, and you can get it with `remotes::install_github("mikemc/speedyseq")`. +We will start by loading the relevant packages. `speedyseq` is awesome, and you can get it with `remotes::install_github("mikemc/speedyseq")`. ```{r setup} library(tidyverse) From 0391561bbbe8c8002159c31e54b590360d534d6d Mon Sep 17 00:00:00 2001 From: amy Date: Thu, 5 Mar 2026 10:00:30 -0800 Subject: [PATCH 2/6] add dplyr and tibble to suggests --- DESCRIPTION | 4 +++- man/evaluate_criterion_lr.Rd | 29 +++++++++++++++++++++++++++++ man/sum_of_logs.Rd | 19 +++++++++++++++++++ vignettes/compare-experiments.Rmd | 5 +++-- vignettes/dilution-series.Rmd | 3 ++- 5 files changed, 56 insertions(+), 4 deletions(-) create mode 100644 man/evaluate_criterion_lr.Rd create mode 100644 man/sum_of_logs.Rd diff --git a/DESCRIPTION b/DESCRIPTION index b719737..a576558 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -20,9 +20,11 @@ Depends: Imports: Matrix Suggests: + dplyr, knitr, phyloseq, rmarkdown, - testthat (>= 3.0.0) + testthat (>= 3.0.0), + tibble Config/testthat/edition: 3 VignetteBuilder: knitr diff --git a/man/evaluate_criterion_lr.Rd b/man/evaluate_criterion_lr.Rd new file mode 100644 index 0000000..b6e64a5 --- /dev/null +++ b/man/evaluate_criterion_lr.Rd @@ -0,0 +1,29 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/evaluate_criterion_lr.R +\name{evaluate_criterion_lr} +\alias{evaluate_criterion_lr} +\title{Criterion Evaluation Function} +\usage{ +evaluate_criterion_lr( + W, + X, + Z, + Z_tilde, + Z_tilde_gamma_cols, + Z_tilde_list = NULL, + X_tilde, + fixed_df, + varying_df, + varying_lr_df = NULL, + barrier_t = NULL, + criterion = "Poisson", + lr_scale = TRUE, + include_log_penalty = TRUE, + wts = NULL, + gmm_inv_wts = NULL, + return_gmm_inv_weights = FALSE +) +} +\description{ +Criterion Evaluation Function +} diff --git a/man/sum_of_logs.Rd b/man/sum_of_logs.Rd new file mode 100644 index 0000000..79ac1eb --- /dev/null +++ b/man/sum_of_logs.Rd @@ -0,0 +1,19 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/logsum.R +\name{sum_of_logs} +\alias{sum_of_logs} +\title{Sum positive numbers via their logarithms +Given x and y, this function returns log(exp(x) + exp(y)).} +\usage{ +sum_of_logs(x, y = NULL) +} +\arguments{ +\item{x}{the thing to be summed} +} +\description{ +Sum positive numbers via their logarithms +Given x and y, this function returns log(exp(x) + exp(y)). +} +\author{ +David Clausen +} diff --git a/vignettes/compare-experiments.Rmd b/vignettes/compare-experiments.Rmd index 8de34bf..8db9a85 100644 --- a/vignettes/compare-experiments.Rmd +++ b/vignettes/compare-experiments.Rmd @@ -29,10 +29,11 @@ Because of its flexibility, fitting a model using `tinyvamp` involves specifying ## Setup -We will start by loading the relevant packages. You might need to install `logsum` and `fastnnls` if you haven't already -- you can do this with `remotes::install_github("ailurophilia/logsum")` and `remotes::install_github("ailurophilia/fastnnls")`. +We will start by loading the relevant packages. ```{r setup} -library(tidyverse) +library(dplyr) +library(tibble) library(tinyvamp) ``` diff --git a/vignettes/dilution-series.Rmd b/vignettes/dilution-series.Rmd index ec12a4b..8cd7145 100644 --- a/vignettes/dilution-series.Rmd +++ b/vignettes/dilution-series.Rmd @@ -28,7 +28,8 @@ In this vignette, we will walk through how to use `tinyvamp` to estimate detecti We will start by loading the relevant packages. `speedyseq` is awesome, and you can get it with `remotes::install_github("mikemc/speedyseq")`. ```{r setup} -library(tidyverse) +library(dplyr) +library(tibble) library(tinyvamp) library(speedyseq) ``` From d383308c06dd817037981ea1cae87ee8b4f81eea Mon Sep 17 00:00:00 2001 From: amy Date: Thu, 5 Mar 2026 10:04:00 -0800 Subject: [PATCH 3/6] add tidyverse back in --- DESCRIPTION | 3 +-- vignettes/compare-experiments.Rmd | 3 +-- vignettes/dilution-series.Rmd | 3 +-- 3 files changed, 3 insertions(+), 6 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index a576558..6e01623 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -20,11 +20,10 @@ Depends: Imports: Matrix Suggests: - dplyr, knitr, phyloseq, rmarkdown, testthat (>= 3.0.0), - tibble + tidyverse Config/testthat/edition: 3 VignetteBuilder: knitr diff --git a/vignettes/compare-experiments.Rmd b/vignettes/compare-experiments.Rmd index 8db9a85..d1d336a 100644 --- a/vignettes/compare-experiments.Rmd +++ b/vignettes/compare-experiments.Rmd @@ -32,8 +32,7 @@ Because of its flexibility, fitting a model using `tinyvamp` involves specifying We will start by loading the relevant packages. ```{r setup} -library(dplyr) -library(tibble) +library(tidyverse) library(tinyvamp) ``` diff --git a/vignettes/dilution-series.Rmd b/vignettes/dilution-series.Rmd index 8cd7145..ec12a4b 100644 --- a/vignettes/dilution-series.Rmd +++ b/vignettes/dilution-series.Rmd @@ -28,8 +28,7 @@ In this vignette, we will walk through how to use `tinyvamp` to estimate detecti We will start by loading the relevant packages. `speedyseq` is awesome, and you can get it with `remotes::install_github("mikemc/speedyseq")`. ```{r setup} -library(dplyr) -library(tibble) +library(tidyverse) library(tinyvamp) library(speedyseq) ``` From a0d07862ab90037fe47ceaec2979a8088d5a7fa2 Mon Sep 17 00:00:00 2001 From: amy Date: Thu, 5 Mar 2026 10:19:48 -0800 Subject: [PATCH 4/6] clean up some problems --- DESCRIPTION | 1 + R/bootstrap_ci.R | 2 ++ data/karstens.rdata | Bin 90365 -> 0 bytes tests/testthat/test-do_one_simulation.R | 1 + 4 files changed, 4 insertions(+) delete mode 100644 data/karstens.rdata diff --git a/DESCRIPTION b/DESCRIPTION index 6e01623..8aa9b33 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -23,6 +23,7 @@ Suggests: knitr, phyloseq, rmarkdown, + speedyseq, testthat (>= 3.0.0), tidyverse Config/testthat/edition: 3 diff --git a/R/bootstrap_ci.R b/R/bootstrap_ci.R index b4319d5..6522b73 100644 --- a/R/bootstrap_ci.R +++ b/R/bootstrap_ci.R @@ -4,6 +4,8 @@ #' @import parallel #' #' +#' +#' #' @export bootstrap_ci <- function(W, fitted_model, diff --git a/data/karstens.rdata b/data/karstens.rdata deleted file mode 100644 index 82718a750c4b990fa6a1d714b6594095705b2823..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 90365 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 Date: Thu, 5 Mar 2026 10:21:18 -0800 Subject: [PATCH 5/6] replace speedyseq with phyloseq doh --- DESCRIPTION | 2 +- vignettes/dilution-series.Rmd | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 8aa9b33..2b8a01a 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -23,7 +23,7 @@ Suggests: knitr, phyloseq, rmarkdown, - speedyseq, + phyloseq, testthat (>= 3.0.0), tidyverse Config/testthat/edition: 3 diff --git a/vignettes/dilution-series.Rmd b/vignettes/dilution-series.Rmd index ec12a4b..854ff01 100644 --- a/vignettes/dilution-series.Rmd +++ b/vignettes/dilution-series.Rmd @@ -25,12 +25,13 @@ In this vignette, we will walk through how to use `tinyvamp` to estimate detecti ## Setup -We will start by loading the relevant packages. `speedyseq` is awesome, and you can get it with `remotes::install_github("mikemc/speedyseq")`. +We will start by loading the relevant packages. We recommend using `speedyseq` instead of `phyloseq`. It's awesome, and you can get it with `remotes::install_github("mikemc/speedyseq")`. ```{r setup} library(tidyverse) library(tinyvamp) -library(speedyseq) +library(phyloseq) +# library(speedyseq) ``` Now let's load the relevant data and inspect it. This data is from [Karstens et al. (2019)](https://journals.asm.org/doi/full/10.1128/mSystems.00290-19?rfr_dat=cr_pub++0pubmed&url_ver=Z39.88-2003&rfr_id=ori%3Arid%3Acrossref.org), who generated 9 samples via three-fold dilutions of a synthetic community containing 8 distinct strains of bacteria which each account for 12.5% of the DNA in the community. Despite only 8 strains being present in the synthetic community, 248 total strains were identified using DADA2 (see Section 12.1 of [our paper](https://arxiv.org/pdf/2204.12733.pdf) for details on data processing). From 8cac1421cefcbecf22ab4fb6a6a483869fbddcbd Mon Sep 17 00:00:00 2001 From: amy Date: Thu, 5 Mar 2026 10:31:10 -0800 Subject: [PATCH 6/6] fix up phyloseq use --- vignettes/dilution-series.Rmd | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/vignettes/dilution-series.Rmd b/vignettes/dilution-series.Rmd index 854ff01..1c504fa 100644 --- a/vignettes/dilution-series.Rmd +++ b/vignettes/dilution-series.Rmd @@ -50,7 +50,7 @@ karstens_phyloseq %>% sample_data We know which genera correspond to taxa in the mock, so let's create a vector telling us which rows of the ASV table contain data on the mock taxa ```{r} -genera_data <- karstens_phyloseq %>% tax_table %>% as_tibble %>% select("Genus") %>% pull +genera_data <- karstens_phyloseq %>% tax_table %>% as.data.frame %>% as_tibble %>% select("Genus") %>% pull Pseudomonas <- genera_data %>% str_detect("Pseudomonas") %>% which Escherichia <- genera_data %>% str_detect("Escherichia") %>% which Salmonella <- genera_data %>% str_detect("Salmonella") %>% which @@ -244,7 +244,8 @@ full_karstens_model$varying %>% as_tibble Wow, `r full_karstens_model$varying %>% as_tibble %>% nrow` parameters were estimated pretty quickly! That's thanks to *a lot* of hard work and cleverness on David's part. Lets look specifically at the estimated efficiencies, and I will join it to the taxon names data to make it easier to interpret ```{r, message=FALSE} -full_karstens_model$varying %>% as_tibble %>% filter(param == "B") %>% +estd_bs <- full_karstens_model$varying %>% as_tibble %>% dplyr::filter(param == "B") +estd_bs %>% inner_join(tibble(j=241:247, name = genera_data[mock_taxa][-8]), by="j") ```