-
Notifications
You must be signed in to change notification settings - Fork 11
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
* First ideas * Introducing the context * Updates with references * Version to Review * appendix * Space between image * Formatting packages names * Grammar mistakes * Apply suggestions from code review (Ross Farrugia) Co-authored-by: Ross Farrugia <82581364+rossfarrugia@users.noreply.github.com> * Adding Ari Siggaard Knoph (Novo Nordisk) as a council member. * Wordlist * Ben's suggestions * Adding sections * Apply suggestions from Stefan review Co-authored-by: StefanThoma <40463122+StefanThoma@users.noreply.github.com> * Stefan review --------- Co-authored-by: Nicholas Eugenio <nicholas.eugenio@businesspartner.roche.com> Co-authored-by: Ben Straub <ben.x.straub@gsk.com> Co-authored-by: Ross Farrugia <82581364+rossfarrugia@users.noreply.github.com> Co-authored-by: StefanThoma <40463122+StefanThoma@users.noreply.github.com>
- Loading branch information
1 parent
c0a3c22
commit d8be6c6
Showing
6 changed files
with
223 additions
and
5 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,78 @@ | ||
# markdown helpers -------------------------------------------------------- | ||
|
||
markdown_appendix <- function(name, content) { | ||
paste(paste("##", name, "{.appendix}"), " ", content, sep = "\n") | ||
} | ||
markdown_link <- function(text, path) { | ||
paste0("[", text, "](", path, ")") | ||
} | ||
|
||
|
||
|
||
# worker functions -------------------------------------------------------- | ||
|
||
insert_source <- function(repo_spec, name, | ||
collection = "posts", | ||
branch = "main", | ||
host = "https://github.com", | ||
text = "source code") { | ||
path <- paste( | ||
host, | ||
repo_spec, | ||
"tree", | ||
branch, | ||
collection, | ||
name, | ||
"index.qmd", | ||
sep = "/" | ||
) | ||
return(markdown_link(text, path)) | ||
} | ||
|
||
insert_timestamp <- function(tzone = Sys.timezone()) { | ||
time <- lubridate::now(tzone = tzone) | ||
stamp <- as.character(time, tz = tzone, usetz = TRUE) | ||
return(stamp) | ||
} | ||
|
||
insert_lockfile <- function(repo_spec, name, | ||
collection = "posts", | ||
branch = "main", | ||
host = "https://github.com", | ||
text = "R environment") { | ||
path <- paste( | ||
host, | ||
repo_spec, | ||
"tree", | ||
branch, | ||
collection, | ||
name, | ||
"renv.lock", | ||
sep = "/" | ||
) | ||
return(markdown_link(text, path)) | ||
} | ||
|
||
|
||
|
||
# top level function ------------------------------------------------------ | ||
|
||
insert_appendix <- function(repo_spec, name, collection = "posts") { | ||
appendices <- paste( | ||
markdown_appendix( | ||
name = "Last updated", | ||
content = insert_timestamp() | ||
), | ||
" ", | ||
markdown_appendix( | ||
name = "Details", | ||
content = paste( | ||
insert_source(repo_spec, name, collection), | ||
insert_lockfile(repo_spec, name, collection), | ||
sep = ", " | ||
) | ||
), | ||
sep = "\n" | ||
) | ||
knitr::asis_output(appendices) | ||
} |
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
102 changes: 102 additions & 0 deletions
102
posts/2023-08-30_pharmaverse_story/pharmaverse_story.qmd
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,102 @@ | ||
--- | ||
title: "The pharmaverse (hi)story" | ||
author: | ||
- name: Nicholas Eugenio | ||
description: "" | ||
date: "2023-08-30" | ||
# please do not use any non-default categories. | ||
# You can find the default categories in the repository README.md | ||
categories: [community] | ||
# feel free to change the image | ||
image: "pharmaverse.png" | ||
--- | ||
|
||
<!--------------- typical setup -----------------> | ||
|
||
```{r setup, include=FALSE} | ||
long_slug <- "2023-08-30_pharmaverse_story" | ||
# renv::use(lockfile = "renv.lock") | ||
``` | ||
|
||
<!--------------- post begins here -----------------> | ||
|
||
Pharmaverse: from motivation to present | ||
|
||
## Human history and pharmaverse context | ||
|
||
Since the Australian Aboriginal, the earliest peoples recorded to have inhabited the Earth and who have been in Australia for at least 65,000 to 80,000 years ([Encyclopædia Britannica](https://www.britannica.com/topic/Australian-Aboriginal)), human beings live in group. | ||
Whether to protect yourself, increase your life expectancy or simply share tasks. | ||
|
||
For most aspects of life, it doesn't make sense to think, act or work alone for two main reasons: | ||
|
||
1. You will spend more energy and time; | ||
|
||
2. Someone else may be facing (or have faced) the same situation. | ||
|
||
The English poet John Donne used to say *"No man is an island entire of itself; every man is a piece of the continent, a part of the main;"*. | ||
I can't disagree with him. | ||
And I dare say that Ari Siggaard Knoph (Novo Nordisk), Michael Rimler (GSK), Michael Stackhouse (Atorus), Ross Farrugia (Roche), and Sumesh Kalappurakal (Janssen) can't disagree with him either. | ||
They are the founders of [pharmaverse](https://pharmaverse.org/), members of its Council and kindly shared their memories of how independent companies, in mid-2020, worked together in the creation of a set of packages developed to support the clinical reporting pipeline. | ||
|
||
If you are not familiar with this pipeline, the important thing to know is that, in a nutshell, pharmaceutical companies must follow a bunch of standardized procedures and formats (from Clinical Data Interchange Standards Consortium, [CDISC](https://www.cdisc.org/)) when submitting clinical results to Health Authorities. | ||
The focus is on this: **different** companies seeking the **same** standards for outputs. | ||
|
||
Paraphrasing Ross Farrugia (Roche) *Breaking boundaries through open-source collaboration* presentation in [R/Pharma 2022](https://www.youtube.com/watch?v=APMDOS4v9Hk) and thinking of the development of a new drug, we are talking about a "post-competitive" scenario: the drug has already been discovered and the companies should "just" produce and deliver standardized results. | ||
|
||
## Clinical reporting outputs | ||
|
||
Rationally, we can say that companies face the same challenges in these steps of the process. | ||
Not so intuitively, we can also say they were working in silos on that before 2018. | ||
Just as Isaac Newton and Gottfried W. Leibniz [independently developed the theory of infinitesimal calculus](https://en.wikipedia.org/wiki/History_of_calculus), pharmaceutical companies were independently working on R solutions for this pipeline. | ||
|
||
But on August 16 and 17 of the mentioned year above, they gathered at the first edition of [R/Pharma conference](https://rinpharma.com/) to discuss R and open-source tooling for drug development (the reasons why open-source is an advantageous approach can be found in this [post](https://pharmaverse.github.io/blog/posts/2023-07-20_cross_company_dev/cross_industry_dev.html) written by Stefan Thoma). | ||
And according to Isabela Velásquez's article, [Pharmaverse: Packages for clinical reporting workflows](https://posit.co/blog/pharmaverse-packages-for-clinical-reporting-workflows/), one of the most popular questions in this conference was "Is the package code available or on [CRAN](https://cran.r-project.org/)?". | ||
|
||
Well, many of them were. | ||
And not necessarily at that date, but just to mention a few: [*pharmaRTF*](https://atorus-research.github.io/pharmaRTF/index.html) and [*Tplyr*](https://atorus-research.github.io/Tplyr/index.html) from Atorus, [*r2rtf*](https://merck.github.io/r2rtf/) from Merck, [*rtables*](https://insightsengineering.github.io/rtables/main/) from Roche, etc. | ||
The thing is that, overall, there were almost 10000 other packages as well (today, almost 20000). | ||
And that took to another two questions: | ||
|
||
1. With this overwhelming number of packages on CRAN, how to find the ones related to solving "clinical reporting problems"? | ||
|
||
2. Once the packages were found, how to choose which one to use among those that have the same functional purpose? | ||
|
||
So, again, companies re-started to working in silos to find those answers. | ||
But now, in collaborative silos and with common goals: create extremely useful packages to solve pharmaceutical-specific gaps once and solve them well! | ||
|
||
## First partnerships | ||
|
||
In 2020, Michael Stackhouse (Atorus) and Michael Rimler (GSK) talked and formed a partnership between their companies to develop a few more packages, including [*metacore*](https://github.com/atorus-research/metacore), to read, store and manipulate metadata for ADaMs/SDTMs in a standardized object; [*xportr*](https://github.com/atorus-research/xportr), to create submission compliant SAS transport files and perform pharma specific dataset level validation checks; and [*logrx*](https://github.com/pharmaverse/logrx) (ex-*timber*), to build log to support reproducibility and traceability of an R script. | ||
|
||
Around the same time, Thomas Neitmann (currently at Denali Therapeutics, then at Roche) and Michael Rimler (GSK) discovered that both were working with ADaM in R, so Thomas Neitmann (currently at Denali Therapeutics, then at Roche), Ross Farrugia (Roche) and Michael Rimler (GSK) saw an opportunity there and GSK started their partnership with Roche to build and release [*admiral*](https://github.com/pharmaverse/admiral) package. | ||
|
||
The idea of working together, the sense of community, and the appetite from organizations built more and more, with incentive and priority established up into the programming heads council. | ||
|
||
Janssen had a huge effort in building R capabilities going on as well, by releasing [*tidytlg*](https://github.com/pharmaverse/tidytlg) and [*envsetup*](https://github.com/pharmaverse/envsetup)), so eventually Michael Rimler (GSK), Michael Stackhouse (Atorus) and Ross Farrugia (Roche) formalized [pharmaverse](https://pharmaverse.org/) and formed the council, adding in Sumesh Kalappurakal (Janssen) and Ari Siggaard Knoph (Novo Nordisk) later joined as the fifth council member. | ||
|
||
## Release, growth and developments | ||
|
||
At the end of their presentation ["Closing the Gap: Creating an End to End R Package Toolkit for the Clinical Reporting Pipeline."](https://www.youtube.com/watch?v=NW9qp5QOlIU), in [R/Pharma 2021](https://rinpharma.com/event/rinpharma2021/), Ben Straub (GSK) and Eli Miller (Atorus) welcomed the community to the [pharmaverse](https://pharmaverse.org/), a curated collection of packages developed by various pharmaceutical companies to support open-source clinical workflows. | ||
|
||
From the outset, the name [pharmaverse](https://pharmaverse.org/) was chosen so that it could be a neutral home, unrelated to any company. | ||
Also, it was established as not being a consortium, which means that founders don't own, fund, or maintain the packages. | ||
Some individuals and companies maintain them but often allowing for community contributions and being licensed permissively so that there is always a feeling of community ownership. | ||
The focus of [pharmaverse](https://pharmaverse.org/) early on, and today, is on inter organization cooperation, to build an environment where, if organizations identify that they have a joint problem that they want to solve, this is the right space to work on and release it. | ||
|
||
[Pharmaverse](https://pharmaverse.org/) has grown a lot, at the time of writing this post we have \>25 packages recommended in [pharmaverse](https://pharmaverse.org/e2eclinical/), and this has led to a partnership with [PHUSE](https://phuse.global/About_PHUSE) to get support from their organization and platform, and because they are eager to advance and support [pharmaverse mission](https://pharmaverse.org/charter/). | ||
|
||
Despite all its structure, it is impossible to say that we have a single solution for each clinical reporting analysis when it comes to [pharmaverse](https://pharmaverse.org/), a single pathway is impractical. | ||
Instead, it is necessary to accept viable tools fitting different pathways into [pharmaverse](https://pharmaverse.org/) to direct and give people options as to what might work for them. | ||
After all, even though we live together as a community, we still have our own unique internal problems. | ||
|
||
![Sample of pharmaverse packages](logos.png) | ||
|
||
<!--------------- appendices go here -----------------> | ||
|
||
```{r, echo=FALSE} | ||
source("appendix.R") | ||
insert_appendix( | ||
repo_spec = "pharmaverse/blog", | ||
name = long_slug | ||
) | ||
``` |