library(RandomWalker)
library(tidyverse)
# Continuous Walks
<- 1L
ns
set.seed(123)
<- bind_rows(
rw_tbl brownian_motion(.num_walks = ns, .dimensions = 2) |>
mutate(walk_type = "Brownian Motion"),
geometric_brownian_motion(.num_walks = ns, .dimensions = 2) |>
mutate(walk_type = "Geometric Brownian Motion"),
random_beta_walk(.num_walks = ns, .dimensions = 2) |>
mutate(walk_type = "Beta"),
random_cauchy_walk(.num_walks = ns, .dimensions = 2) |>
mutate(walk_type = "Cauchy"),
random_chisquared_walk(.num_walks = ns, .dimensions = 2) |>
mutate(walk_type = "Chisquared"),
random_exponential_walk(.num_walks = ns, .dimensions = 2) |>
mutate(walk_type = "Exponential"),
random_f_walk(.num_walks = ns, .dimensions = 2) |>
mutate(walk_type = "F Distribution"),
random_gamma_walk(.num_walks = ns, .dimensions = 2) |>
mutate(walk_type = "Gamma"),
random_logistic_walk(.num_walks = ns, .dimensions = 2) |>
mutate(walk_type = "Logisitic"),
random_lognormal_walk(.num_walks = ns, .dimensions = 2) |>
mutate(walk_type = "Log-Normal"),
random_normal_drift_walk(.num_walks = ns, .dimensions = 2) |>
mutate(walk_type = "Random Normal Drift"),
random_normal_walk(.num_walks = ns, .dimensions = 2) |>
mutate(walk_type = "Random Normal"),
random_t_walk(.num_walks = ns, .dimensions = 2) |>
mutate(walk_type = "T Distribution"),
random_uniform_walk(.num_walks = ns, .dimensions = 2) |>
mutate(walk_type = "Uniform"),
random_weibull_walk(.num_walks = ns, .dimensions = 2) |>
mutate(walk_type = "Weibull")
|>
) select(step_number, x, y, walk_type)
|>
rw_tbl ggplot(aes(x = x, y = y)) +
facet_wrap(~ walk_type, scales = "free") +
geom_path(aes(color = step_number)) +
geom_point(
data = rw_tbl |>
group_by(walk_type) |>
filter(
== max(step_number) |
step_number == min(step_number)
step_number
),aes(color = step_number),
size = 3
+
) scale_color_viridis_c(option = "plasma") +
theme_minimal() +
labs(
title = "Random Walks for Continuous Distributions",
subtitle = paste0(
"Number of Simulations: ", ns, " - ",
"Number of Steps: ", 100
),y = "Y Value",
x = "X Value"
+
) theme(legend.position = "none") +
theme(
axis.text.x = element_blank(),
axis.ticks.y = element_blank(),
axis.text.y = element_blank(),
axis.ticks.x = element_blank()
)
Key Update: RandomWalker version 0.3.0 introduces 21 new distribution-based random walk generators plus 2 enhanced utility functions, expanding from basic normal distributions to comprehensive stochastic modeling across discrete, continuous, and statistical test distributions.
The RandomWalker package has undergone a revolutionary transformation, evolving from a basic random walk generator to a comprehensive stochastic modeling toolkit. This update represents the most significant expansion in the package’s history, introducing 21 new random walk generator functions and 2 enhanced utility functions that will fundamentally change how R programmers approach random walk simulations.
Complete Function Arsenal: From Basic to Advanced
The new RandomWalker update delivers an unprecedented collection of functions covering every major category of statistical distributions.
Continuous Distribution Random Walks
The package now supports nine sophisticated continuous distribution functions, each optimized for specific modeling scenarios:
random_uniform_walk()
: Perfect for Monte Carlo simulations requiring flat probability distributionsrandom_weibull_walk()
: Essential for reliability engineering and survival analysis applicationsrandom_t_walk()
: Ideal for heavy-tailed financial processes and robust statistical modelingrandom_logistic_walk()
: Designed for growth modeling and S-curve phenomenarandom_lognormal_walk()
: Critical for asset pricing and multiplicative processesrandom_gamma_walk()
: Optimized for waiting times and shape-scale modeling scenariosrandom_exponential_walk()
: Built for Poisson process intervals and decay modelingrandom_beta_walk()
: Perfect for bounded probability processes and proportion modelingrandom_cauchy_walk()
: Specialized for extreme value theory and heavy-tailed phenomena
Discrete Distribution Random Walks
Six new discrete distribution functions enable precise modeling of count processes and success-based scenarios:
random_poisson_walk()
: Event counting and arrival processesrandom_binomial_walk()
: Fixed trials with success/failure modelingrandom_negbinomial_walk()
: Over-dispersed counts and waiting for multiple successesrandom_geometric_walk()
: First success timing with memoryless propertiesrandom_hypergeometric_walk()
: Sampling without replacement from finite populationsrandom_multinomial_walk()
: Multi-category outcomes for complex probability spaces
Statistical Test-Based Random Walks
Four specialized functions bring nonparametric testing capabilities to random walk modeling:
random_wilcox_walk()
: Wilcoxon signed-rank applications for nonparametric analysisrandom_wilcoxon_sr_walk()
: Enhanced Wilcoxon with step specification functionalityrandom_smirnov_walk()
: Distribution comparison and goodness-of-fit testingrandom_f_walk()
: Variance ratio testing and ANOVA applicationsrandom_chisquared_walk()
: Goodness-of-fit and variance testing scenarios
Specialized Functions
The update includes a powerful custom modeling function:
random_displacement_walk()
: User-defined step distributions enabling unlimited flexibility for custom modeling scenarios.
# Discrete Walks
set.seed(123)
<- bind_rows(
dw_tbl discrete_walk(.num_walks = ns, .dimensions = 2) |>
mutate(walk_type = "Discrete"),
random_binomial_walk(.num_walks = ns, .dimensions = 2) |>
mutate(walk_type = "Binomial"),
random_displacement_walk(.num_walks = ns, .dimensions = 2) |>
mutate(walk_type = "Displacement"),
random_geometric_walk(.num_walks = ns, .dimensions = 2) |>
mutate(walk_type = "Geometric"),
random_hypergeometric_walk(.num_walks = ns, .dimensions = 2) |>
mutate(walk_type = "Hypergeometric"),
random_multinomial_walk(.num_walks = ns, .dimensions = 2, .size = 10) |>
mutate(walk_type = "Multinomial"),
random_negbinomial_walk(.num_walks = ns, .dimensions = 2,
.size = c(1, 1), .prob = c(.1, .1)) |>
mutate(walk_type = "Negative Binomial"),
random_poisson_walk(.num_walks = ns, .dimensions = 2) |>
mutate(walk_type = "Poisson"),
random_smirnov_walk(.num_walks = ns, .dimensions = 2, .z = seq(1, 2, by = .2),
.sizes = c(2, 1)) |>
mutate(walk_type = "Smirnov"),
random_wilcoxon_sr_walk(.num_walks = ns, .dimensions = 2) |>
mutate(walk_type = "Wilcoxon Signed Rank"),
random_wilcox_walk(.num_walks = ns, .dimensions = 2) |>
mutate(walk_type = "Wilcox")
)
|>
dw_tbl ggplot(aes(x = x, y = y)) +
facet_wrap(~ walk_type, scales = "free") +
geom_path(aes(color = step_number)) +
geom_point(
data = dw_tbl |>
group_by(walk_type) |>
filter(
== max(step_number) |
step_number == min(step_number)
step_number
),aes(color = step_number),
size = 3
+
) scale_color_viridis_c(option = "plasma") +
theme_minimal() +
labs(
title = "Random Walks for Discrete Distributions",
subtitle = paste0(
"Number of Simulations: ", ns, " - ",
"Number of Steps: ", 100
),y = "Y Value",
x = "X Value"
+
) theme(legend.position = "none") +
theme(
axis.text.x = element_blank(),
axis.ticks.y = element_blank(),
axis.text.y = element_blank(),
axis.ticks.x = element_blank()
)
Enhanced Utility Functions: Powerful New Capabilities
Two critical utility functions received major enhancements that dramatically expand their functionality:
Advanced Subsetting with subset_walks()
The updated subset_walks()
function introduces the .value
parameter, allowing users to subset random walks based on any column, not just the default “y” position :
set.seed(123)
<- rw30()
walks
subset_walks(walks, .type = "max", .value = "y") |>
visualize_walks(.interactive = TRUE)
subset_walks(walks, .type = "min") |>
visualize_walks(.interactive = TRUE)
# Subset by custom criteria
subset_walks(walks, .type = "both") |>
visualize_walks(.interactive = TRUE)
Multi-Column Visualization with visualize_walks()
The enhanced visualize_walks()
function now accepts vector inputs for the .pluck
parameter, enabling simultaneous visualization of multiple walk types or simulations :
set.seed(123)
<- random_normal_walk()
rw
# Visualize specific simulations
visualize_walks(rw, .pluck = c(1, 3))
# Compare multiple distribution types
visualize_walks(rw, .pluck = c("cum_min","cum_max"))
Multi-Dimensional Modeling Revolution
All 21 generator functions support multi-dimensional random walks through the .dimensions
parameter, breaking the traditional 1D limitation. This capability transforms spatial modeling applications:
# 2D random walks for spatial modeling
<- random_normal_walk(.dimensions = 2)
walk_2d head(walk_2d, 1) |> t()
[,1]
walk_number "1"
step_number "1"
x "0.03563341"
y "-0.01747179"
cum_sum_x "0.03563341"
cum_sum_y "-0.01747179"
cum_prod_x "0"
cum_prod_y "0"
cum_min_x "0.03563341"
cum_min_y "-0.01747179"
cum_max_x "0.03563341"
cum_max_y "-0.01747179"
cum_mean_x "0.03563341"
cum_mean_y "-0.01747179"
# 3D random walks for complex spatial analysis
<- random_uniform_walk(.dimensions = 3)
walk_3d head(walk_3d, 1) |> t()
[,1]
walk_number "1"
step_number "1"
x "0.3000542"
y "0.8856108"
z "0.6017601"
cum_sum_x "0.3000542"
cum_sum_y "0.8856108"
cum_sum_z "0.6017601"
cum_prod_x "0"
cum_prod_y "0"
cum_prod_z "0"
cum_min_x "0.3000542"
cum_min_y "0.8856108"
cum_min_z "0.6017601"
cum_max_x "0.3000542"
cum_max_y "0.8856108"
cum_max_z "0.6017601"
cum_mean_x "0.3000542"
cum_mean_y "0.8856108"
cum_mean_z "0.6017601"
# Multi-dimensional discrete processes
<- random_poisson_walk(.dimensions = 2)
poisson_2d head(poisson_2d, 1) |> t()
[,1]
walk_number "1"
step_number "1"
x "3"
y "1"
cum_sum_x "3"
cum_sum_y "1"
cum_prod_x "0"
cum_prod_y "0"
cum_min_x "3"
cum_min_y "1"
cum_max_x "3"
cum_max_y "1"
cum_mean_x "3"
cum_mean_y "1"
Real-World Applications Across Industries
Financial Modeling Excellence
The expanded distribution set revolutionizes financial applications:
- Asset Pricing: Use
random_lognormal_walk()
for realistic stock price simulations - Risk Management: Apply
random_weibull_walk()
for failure time analysis in portfolios - Heavy-Tail Modeling: Leverage
random_cauchy_walk()
for extreme market events
Engineering and Reliability Analysis
Engineering applications benefit from specialized distributions:
- Failure Analysis:
random_weibull_walk()
andrandom_exponential_walk()
for system reliability - Quality Control:
random_binomial_walk()
andrandom_hypergeometric_walk()
for sampling processes - System Testing:
random_chisquared_walk()
andrandom_f_walk()
for statistical validation
Biological and Ecological Modeling
Life sciences gain powerful new modeling tools:
- Population Dynamics:
random_negbinomial_walk()
for over-dispersed population counts - Disease Modeling:
random_poisson_walk()
andrandom_multinomial_walk()
for epidemic spread - Genetic Analysis:
random_hypergeometric_walk()
for sampling genetic variants
Your Turn!
Challenge: Create a portfolio simulation comparing three different risk models using normal, t-distribution, and Weibull random walks.
Task:
- Generate 1000-step walks for each distribution
- Calculate risk metrics (max drawdown, volatility)
- Compare performance characteristics
Click here for Solution!
# Portfolio simulation with different risk models
<- random_normal_walk(
normal_portfolio .n = 1000,
.num_walks = 100,
.mu = 0.05,
.sd = 0.2) |>
select(walk_number, y)
<- random_t_walk(
t_portfolio .n = 1000,
.num_walks = 100,
.df = 3) |>
select(walk_number, y)
<- random_weibull_walk(
weibull_portfolio .n = 1000,
.num_walks = 100,
.shape = 1.5,
.scale = 1) |>
select(walk_number, y)
# Calculate risk metrics grouped on walk_number with y as the value
<- function(walks) {
calculate_risk_metrics <- walks |>
max_drawdowns group_by(walk_number) |>
summarize(max_drawdowns = max(cummax(y) - y)) |>
ungroup() |>
pull(max_drawdowns)
<- walks |>
volatility group_by(walk_number) |>
summarize(volatility = sd(y)) |>
ungroup() |>
pull(volatility)
return(list(
max_drawdown = mean(max_drawdowns),
volatility = mean(volatility))
)
}
calculate_risk_metrics(normal_portfolio)
$max_drawdown
[1] 1.200971
$volatility
[1] 0.2005195
calculate_risk_metrics(t_portfolio)
$max_drawdown
[1] 21.07394
$volatility
[1] 1.698124
calculate_risk_metrics(weibull_portfolio)
$max_drawdown
[1] 3.641576
$volatility
[1] 0.611113
Quick Takeaways: Key Points for R Programmers
• Complete Coverage: 21 new distribution-based generators plus 2 enhanced utilities cover every major statistical distribution family
• Multi-Dimensional: All functions support 2D and 3D random walks through the .dimensions
parameter
• Enhanced Utilities: subset_walks()
gains .value
parameter flexibility; visualize_walks()
supports vector .pluck
inputs
• Custom Flexibility: random_displacement_walk()
enables unlimited user-defined step distributions
• Tidyverse Integration: Full compatibility with dplyr, ggplot2, and pipe-friendly workflows
• Industry Applications: Purpose-built functions for finance, engineering, biology, and statistical testing
Migration and Best Practices
Existing RandomWalker users can seamlessly integrate the new functions while maintaining backward compatibility. The package maintains its tidyverse-friendly design philosophy, ensuring smooth integration with existing R workflows .
Documentation: Each function includes comprehensive documentation with parameter specifications, use cases, and practical examples.
Conclusion: The Future of Stochastic Modeling in R
The RandomWalker v0.3.0 update represents a paradigm shift in R-based stochastic modeling. With 23 new and enhanced functions covering the complete spectrum of statistical distributions, R programmers now have unprecedented power to model complex random processes across any domain.
Whether you’re simulating financial markets with heavy tailed distributions, modeling biological populations with discrete processes, or conducting advanced statistical testing with nonparametric approaches, RandomWalker delivers the tools needed for sophisticated analysis.
Ready to explore the new capabilities? Install the latest version and discover how these powerful new functions can transform your stochastic modeling projects. The future of random walk simulation in R has arrived.
Have you tried the new RandomWalker functions? Share your experiences and applications in the comments below, and don’t forget to spread the word about these exciting updates on social media!
Happy Coding! 🚀
You can connect with me at any one of the below:
Telegram Channel here: https://t.me/steveondata
LinkedIn Network here: https://www.linkedin.com/in/spsanderson/
Mastadon Social here: https://mstdn.social/@stevensanderson
RStats Network here: https://rstats.me/@spsanderson
GitHub Network here: https://github.com/spsanderson
Bluesky Network here: https://bsky.app/profile/spsanderson.com
My Book: Extending Excel with Python and R here: https://packt.link/oTyZJ
You.com Referral Link: https://you.com/join/EHSLDTL6