Install
$ agentstack add skill-choxos-biostatagent-clinical-trials ✓ scanned · ✓ verified — works with Claude Code, Cursor, and more.
Security review
✓ PassedNo issues found. Passed automated security review. · v0.1.0 How review works →
- ✓ Prompt-injection patterns
- ✓ Secret / credential exfiltration
- ✓ Dangerous shell & filesystem operations
- ✓ Untrusted network calls
- ✓ Known-malicious package signatures
What it can access
- ✓ Network access No
- ✓ Filesystem access No
- ✓ Shell / process execution No
- ✓ Environment & secrets No
- ✓ Dynamic code execution No
From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.
About
Clinical Trials Statistical Methods
Overview
Comprehensive clinical trial design and analysis methods in R covering sample size calculation, randomization, interim analyses, multiplicity adjustment, and regulatory-compliant statistical methods.
Sample Size Calculation
Two-Group Comparisons
library(pwr)
# Two-sample t-test
pwr.t.test(
d = 0.5, # Cohen's d effect size
sig.level = 0.05,
power = 0.80,
type = "two.sample",
alternative = "two.sided"
)
# Proportions (chi-square)
pwr.2p.test(
h = ES.h(p1 = 0.6, p2 = 0.4), # Cohen's h
sig.level = 0.05,
power = 0.80
)
# Two proportions (unequal groups)
pwr.2p2n.test(
h = ES.h(p1 = 0.6, p2 = 0.4),
n1 = 100,
sig.level = 0.05
)
Survival Endpoints
library(gsDesign)
# Log-rank test sample size
nSurv(
lambda1 = log(2)/12, # Control median = 12 months
lambda2 = log(2)/18, # Treatment median = 18 months (HR = 0.67)
Ts = 24, # Study duration
Tr = 12, # Accrual duration
alpha = 0.025, # One-sided
beta = 0.20, # 80% power
ratio = 1 # 1:1 randomization
)
# Using rpact
library(rpact)
getSampleSizeSurvival(
hazardRatio = 0.67,
lambda1 = log(2)/12,
accrualTime = 12,
followUpTime = 12,
alpha = 0.025,
beta = 0.20,
allocationRatioPlanned = 1
)
Non-Inferiority Trials
library(TrialSize)
# Non-inferiority for proportions
TwoSampleProportion.NIS(
p = 0.80, # Expected proportion in both groups
delta = 0.10, # Non-inferiority margin
alpha = 0.025, # One-sided
power = 0.80
)
# Non-inferiority for means
TwoSampleMean.NIS(
sigma = 10, # SD
delta = 5, # Non-inferiority margin
alpha = 0.025,
power = 0.80
)
Randomization
Simple Randomization
# Base R simple randomization
set.seed(123)
n =65")
)
rand_lists
dplyr::filter(ITTFL == "Y") |>
dplyr::select(TRT01P, AGE, SEX, BMI, BASELINE_SCORE) |>
tbl_summary(
by = TRT01P,
statistic = list(
all_continuous() ~ "{mean} ({sd})",
all_categorical() ~ "{n} ({p}%)"
)
) |>
modify_header(label = "**Characteristic**")
If the SAP requires standardized mean differences, report them as descriptive diagnostics rather than randomization tests.
Group Sequential Designs
gsDesign Package
library(gsDesign)
# O'Brien-Fleming boundaries
gs_design
group_by(subgroup) |>
summarise(
n = n(),
effect = mean(outcome[trt == 1]) - mean(outcome[trt == 0]),
se = sqrt(var(outcome[trt == 1])/sum(trt == 1) +
var(outcome[trt == 0])/sum(trt == 0)),
lower = effect - 1.96 * se,
upper = effect + 1.96 * se
)
# Create forest plot
forestplot(
labeltext = subgroup_effects$subgroup,
mean = subgroup_effects$effect,
lower = subgroup_effects$lower,
upper = subgroup_effects$upper,
zero = 0,
xlab = "Treatment Effect (95% CI)"
)
Interaction Tests
# Test for treatment-by-subgroup interaction
interaction_model <- lm(outcome ~ treatment * subgroup, data = df)
anova(interaction_model)
# Quantitative interaction test
library(QI)
qi_test(outcome ~ treatment | subgroup, data = df)
Regulatory Considerations
ICH E9 Estimands Framework
# Define estimand components:
# 1. Treatment condition
# 2. Population
# 3. Variable (endpoint)
# 4. Intercurrent events and strategies
# 5. Population-level summary measure
# Example: Treatment policy estimand with MMRM
mmrm_fit <- mmrm(
change ~ treatment * visit + baseline + us(visit | subject),
data = data_all_randomized # Include all randomized (ITT)
)
Missing-data methods should follow the estimand and the plausible missingness mechanism. Prespecify primary handling and sensitivity analyses rather than defaulting to complete-case analysis.
CONSORT Diagram
library(consort)
# Create CONSORT diagram
consort_plot(
data = trial_data,
orders = c(
Assessed = "Assessed for eligibility",
Randomized = "Randomized",
Arm_A = "Allocated to Arm A",
Arm_B = "Allocated to Arm B",
Lost_A = "Lost to follow-up (Arm A)",
Lost_B = "Lost to follow-up (Arm B)",
Analyzed_A = "Analyzed (Arm A)",
Analyzed_B = "Analyzed (Arm B)"
),
side_box = c("Excluded", "Discontinued_A", "Discontinued_B"),
cex = 0.8
)
Key Packages Summary
| Package | Purpose | |---------|---------| | pwr | Power analysis | | gsDesign | Group sequential designs | | rpact | Adaptive designs | | blockrand | Randomization | | gMCP | Graphical multiplicity | | mmrm | MMRM analysis | | mice | Multiple imputation | | rbmi | Reference-based imputation | | emmeans | Least squares means | | consort | CONSORT diagrams |
Source & license
This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.
- Author: choxos
- Source: choxos/BiostatAgent
- License: MIT
Install and usage instructions live in the source repository linked above.
Reviews
No reviews yet — be the first.
Write a review
Versions
- v0.1.0 Imported from the upstream source.