A comprehensive R package for one-sample t-tests with custom implementations, bootstrap inference, power analysis, and rich visualizations.
Developed for STAT 181 (Statistical Computing) at the Institute of Statistics, University of the Philippines Los Baños.
✨ Features
Core Functionality
- ✅ One-sample t-test with complete statistical inference
- ✅ Custom implementations of statistical functions (no reliance on built-in t-test)
- ✅ Bootstrap inference for robust non-parametric alternatives
- ✅ Power analysis for sample size and effect size calculations
- ✅ Assumption checking with Shapiro-Wilk test and outlier detection
- ✅ Rich visualizations (base graphics + ggplot2)
- ✅ Multiple output formats (console, markdown, LaTeX reports)
- ✅ Effect sizes with Cohen’s d, Hedges’ g, and Glass’s delta
- ✅ Non-parametric tests including Wilcoxon signed-rank and sign test
- ✅ Multiple testing corrections (Bonferroni, Holm, FDR)
📦 Installation
Development Version (Recommended)
# Install from GitHub
if (!requireNamespace("devtools", quietly = TRUE)) {
install.packages("devtools")
}
devtools::install_github("KingSSIBAL/oneMeanTest")🚀 Quick Start
Basic One-Sample T-Test
# Generate sample data
set.seed(123)
x <- rnorm(30, mean = 100, sd = 15)
# Perform t-test
result <- one_mean_test(
x = x,
mu0 = 100, # Null hypothesis value
alternative = "two.sided",
alpha = 0.05,
conf.level = 0.95,
check_assumptions = TRUE
)
# View results
print(result)Output:
========================================
ONE-SAMPLE T-TEST RESULTS
========================================
Sample: x
n = 30, mean = 101.5847, sd = 14.5782
H₀: μ = 100
Hₐ: μ ≠ 100
α = 0.05
TEST STATISTICS
t = 0.5954, df = 29
p-value = 0.5565
Critical values: -2.0452, 2.0452
95% CONFIDENCE INTERVAL
[96.1402, 107.0292]
DECISION: fail to reject H₀
INTERPRETATION:
At the 0.05 significance level, there is insufficient
evidence to conclude that the population mean is
different from 100.
📊 Advanced Features
Bootstrap Inference
For non-parametric inference or when normality assumptions are violated:
# Bootstrap t-test (1000 resamples)
bootstrap_result <- bootstrap_ttest(
x = x,
mu0 = 100,
nboot = 1000,
conf.level = 0.95,
seed = 123
)
print(bootstrap_result)
plot(bootstrap_result)Power Analysis
Calculate required sample size, power, or detectable effect size:
# Calculate power for given sample size and effect
power_t_test(n = 30, delta = 5, sd = 15, alpha = 0.05)
# [1] 0.3520
# Calculate required sample size for 80% power
sample_size_t_test(power = 0.80, delta = 5, sd = 15, alpha = 0.05)
# [1] 143
# Calculate detectable effect size
effect_size_t_test(n = 30, power = 0.80, sd = 15, alpha = 0.05)
# [1] 8.19
# Visualize power curve
plot_power_curve(delta = 5, sd = 15, alpha = 0.05)Effect Sizes (✨ IMPLEMENTED!)
# Cohen's d with confidence interval
cohens_d_ci(x, mu0 = 100, conf.level = 0.95, method = "bootstrap")
# Hedges' g (bias-corrected for small samples)
hedges_g(x, mu0 = 100)
# Glass's delta (with population SD)
glass_delta(x, mu0 = 100, sigma = 15)
# Comprehensive effect size summary
effect_size_summary(x, mu0 = 100)Output:
Effect Size Summary
======================================================================
Sample size: n = 30
Null value: mu0 = 100.0000
Confidence level: 95%
Measure Estimate CI_Lower CI_Upper Interpretation
Cohen's d 0.1089 -0.2516 0.4694 negligible
Hedges' g 0.1070 -0.2473 0.4613 negligible
Non-Parametric Tests (✨ IMPLEMENTED!)
# Wilcoxon signed-rank test
wilcoxon_test(x, mu0 = 100, alternative = "two.sided")
# Sign test (simpler alternative)
sign_test(x, mu0 = 100)
# Compare all three tests side-by-side
compare_tests(x, mu0 = 100)Output:
Test Statistic P_value Decision
One-sample t-test t = 0.5954 0.5565 fail to reject H0
Wilcoxon signed-rank V = 255 0.5712 fail to reject H0
Sign test S = 16 0.8555 fail to reject H0
Multiple Testing Corrections (✨ IMPLEMENTED!)
# Run multiple tests
results <- list(
test1 = one_mean_test(sample1, mu0 = 0),
test2 = one_mean_test(sample2, mu0 = 0),
test3 = one_mean_test(sample3, mu0 = 0)
)
# Apply corrections
p_values <- sapply(results, function(x) x$p.value)
# Bonferroni correction
bonferroni_adjust(p_values, alpha = 0.05)
# Holm's sequential procedure
holm_adjust(p_values, alpha = 0.05)
# Benjamini-Hochberg FDR control
fdr_adjust(p_values, alpha = 0.05)Assumption Checking
# Check assumptions
assumptions <- check_assumptions(x, alpha = 0.05, verbose = TRUE)
# Interpret assumptions
interpret_assumptions(assumptions)Output:
✓ Normality: Shapiro-Wilk test p-value = 0.3245 (data appear normal)
✓ Outliers: 0 potential outliers detected
✓ Sample size: n = 30 (adequate for t-test)
Visualizations
Base Graphics
# Distribution plot
plot(result, type = "distribution")
# Confidence interval plot
plot(result, type = "ci")
# Diagnostic plots (Q-Q plot + boxplot)
plot(result, type = "diagnostic")
# All plots at once
plot(result, type = "all")
# Individual diagnostic plots
plot_qq(x) # Q-Q plot for normality
plot_histogram(x) # Histogram with normal curve
plot_boxplot(x) # Boxplot with outliers highlightedggplot2 Visualizations (✨ IMPLEMENTED!)
# Modern ggplot2 versions
ggplot_distribution(result)
ggplot_qq(x)
ggplot_ci(result)
ggplot_comparison(list(result1, result2, result3))📝 Report Generation
Console Report
# Generate formatted report
report <- format_ttest_report(result)
cat(report)🎓 Educational Features
Interpretation Helpers
# Interpret p-value strength
interpret_p_value(0.03)
# "moderate evidence against the null hypothesis"
# Interpret effect size (Cohen's d)
d <- cohens_d(x, mu0 = 100)
interpret_effect_size(d)
# "small effect size"
# Interpret confidence interval
interpret_ci(result$conf.int, conf_level = 0.95, mu0 = 100)Custom Implementations
All core statistical functions are custom-implemented for educational purposes:
-
.custom_quantile()- Quantile calculation (Type 7) -
.custom_pt()/.custom_qt()- t-distribution functions -
.custom_pnorm()/.custom_qnorm()- Normal distribution functions -
.incomplete_beta()- Beta function for t-distribution
These match R’s built-in functions to 4 decimal places (validated by 530+ tests).
🔬 When to Use This Package
Use oneMeanTest when:
✅ You have one numeric sample (independent observations)
✅ You want to test a hypothesis about a single population mean
✅ You need assumption checking and diagnostic plots
✅ You want bootstrap alternatives for robustness
✅ You need power analysis for study design
✅ You want effect sizes with interpretations
✅ You need non-parametric alternatives
✅ You want comprehensive, publication-ready reports
✅ You’re learning statistical computing concepts
Alternative approaches:
- Large samples (n > 30): Central Limit Theorem applies, normality less critical
-
Non-normal data: Use
bootstrap_ttest()orwilcoxon_test()for non-parametric inference - Paired data: Use paired t-test (not in this package)
- Two independent samples: Use two-sample t-test (not in this package)
📚 Documentation
Vignettes
# View available vignettes
browseVignettes("oneMeanTest")
# Read specific vignette
vignette("introduction", package = "oneMeanTest")
vignette("bootstrap-methods", package = "oneMeanTest")
vignette("power-analysis", package = "oneMeanTest")Function Help
# Main function help
?one_mean_test
# Other key functions
?descriptive_stats
?bootstrap_ttest
?check_assumptions
?power_t_test
?cohens_d_ci
?wilcoxon_test
?compare_testsPackage Website
Visit the pkgdown site for:
- Full function reference
- Detailed vignettes
- Example workflows
- FAQ
🧪 Testing & Quality
This package maintains high quality standards:
| Metric | Status |
|---|---|
| R CMD Check | |
| Test Coverage | |
| Tests | 530+ tests passing |
| Coverage | 94.83% code coverage |
| Accuracy | 4-decimal validation vs base R |
| Documentation | 100% functions documented |
Coverage by File
| File | Coverage |
|---|---|
R/one_mean_test.R |
100.00% |
R/bootstrap.R |
100.00% |
R/assumptions.R |
100.00% |
R/descriptive_stats.R |
100.00% |
R/critical_value.R |
100.00% |
R/report_methods.R |
100.00% |
R/multiple_testing.R |
98.04% |
R/ggplot_visualizations.R |
97.39% |
R/nonparametric.R |
96.53% |
R/print_tidy_methods.R |
96.15% |
R/interpretation_helper.R |
96.12% |
R/effect_sizes.R |
94.44% |
R/plotting.R |
93.75% |
R/power.R |
93.33% |
Run Tests Locally
# Run all tests
devtools::test()
# Run R CMD check
devtools::check()
# Generate coverage report
library(covr)
cov <- package_coverage()
percent_coverage(cov)
report(cov)🤝 Contributing
Contributions are welcome! Please feel free to submit a Pull Request.
Contribution Guidelines
- Fork the repository
- Create a feature branch (
git checkout -b feature/AmazingFeature) - Write tests for new functionality
- Ensure all tests pass and coverage remains high
- Update documentation
- Commit changes (
git commit -m 'Add AmazingFeature') - Push to branch (
git push origin feature/AmazingFeature) - Open a Pull Request
📖 Citation
If you use this package in your research, please cite:
@Manual{oneMeanTest2024,
title = {oneMeanTest: One-Sample T-Test for Population Mean with Unknown Variance},
author = {Reijel Agub},
year = {2024},
note = {R package version 0.1.0, STAT 181 Project},
url = {https://github.com/KingSSIBAL/oneMeanTest},
}🎓 Acknowledgments
Developed as a project for STAT 181: Statistical Computing
Institute of Statistics, University of the Philippines Los Baños
1st Semester, 2025-2026
📞 Contact & Support
- Author: Reijel Agub
- Email: rcagub@up.edu.ph
- GitHub: @KingSSIBAL
- Issues: Report bugs or request features
📈 Project Status
Current Version: 0.1.0 (Experimental)
Status: Active Development
Last Updated: November 30, 2025
Implementation Summary
This package exceeds project requirements with:
✅ Core one-sample t-test (100% coverage)
✅ Custom statistical implementations validated to 4 decimals
✅ Bootstrap methods (100% coverage)
✅ Power analysis (93.33% coverage)
✅ Assumption checking (100% coverage)
✅ Effect sizes - Cohen’s d, Hedges’ g, Glass’s delta (94.44% coverage)
✅ Non-parametric tests - Wilcoxon, Sign test (96.53% coverage)
✅ Multiple testing corrections (98.04% coverage)
✅ Dual visualization systems - base + ggplot2 (97.39% coverage)
✅ Multiple report formats (100% coverage)
✅ 530+ tests with 94.83% overall coverage
The package is presentation-ready and production-quality! 🎉
⭐ If you find this package useful, please star the repository!
Built with ❤️ and R