knitr::opts_chunk$set( collapse = TRUE, comment = "#>", fig.width = 7, fig.height = 5, fig.alt = "Random walk visualization examples" )
library(RandomWalker) library(dplyr) library(ggplot2)
Quick answers to common questions about RandomWalker.
RandomWalker is an R package for generating, visualizing, and analyzing random walks. It supports 27+ probability distributions, multi-dimensional walks (1D, 2D, 3D), and provides tidyverse-compatible functions for data manipulation and analysis.
RandomWalker is useful for: - Researchers: Modeling stochastic processes, simulating experiments - Students: Learning probability and statistics - Data Scientists: Generating synthetic data, testing algorithms - Financial Analysts: Modeling asset prices, risk analysis - Physicists/Biologists: Simulating particle movement, organism behavior - Educators: Teaching probability concepts
Yes! RandomWalker is open-source software licensed under the MIT License. You can use it freely for academic, commercial, or personal projects.
# From CRAN (stable) install.packages("RandomWalker") # From GitHub (development) devtools::install_github("spsanderson/RandomWalker")
RandomWalker requires R version 4.1.0 or higher.
Try installing dependencies manually:
install.packages(c("dplyr", "tidyr", "purrr", "rlang", "patchwork", "NNS", "ggiraph"))
library(RandomWalker) rw30() |> head(10) # Generates 30 walks with 100 steps each
library(RandomWalker) rw30() |> visualize_walks()
Use one of the generator functions:
random_normal_walk( .num_walks = 10, .n = 100, .mu = 0, .sd = 1, .initial_value = 0 ) |> visualize_walks()
Yes:
set.seed(123) walks <- rw30() # Same seed produces same result set.seed(123) walks2 <- rw30() identical(walks, walks2) # TRUE
It depends on your use case:
random_normal_walk()geometric_brownian_motion()brownian_motion()discrete_walk()random_cauchy_walk() or random_t_walk()random_poisson_walk()random_normal_walk() and brownian_motion()?Both use normal distributions, but:
- random_normal_walk(): Discrete steps, cumulative sum
- brownian_motion(): Continuous-time stochastic process, includes drift (μ) and volatility (σ) parameters
For most purposes, they're similar. Use brownian_motion() for financial modeling.
brownian_motion() and geometric_brownian_motion()?Brownian Motion: Can go negative, additive process
X(t) = X(0) + μt + σW(t)
Geometric Brownian Motion: Always positive, multiplicative process
X(t) = X(0) exp((μ - σ²/2)t + σW(t))
Use Geometric Brownian Motion for modeling stock prices (can't go negative).
Yes! Use custom_walk():
# Custom displacement function my_displacement <- function() { # Your custom logic here return(some_value) } custom_walk( .num_walks = 10, .n = 100, .custom_fns = my_displacement )
Add .dimensions = 2:
random_normal_walk(.num_walks = 10, .n = 100, .dimensions = 2)
library(ggplot2) walk_2d <- random_normal_walk(.num_walks = 10, .n = 100, .dimensions = 2) ggplot(walk_2d, aes(x = cum_sum_x, y = cum_sum_y, color = walk_number)) + geom_path() + coord_equal() + theme_minimal()
y is the random value, x is renamed to step_numberx and y are the two spatial dimensionsx, y, and z are the three spatial dimensionsAdd .interactive = TRUE:
rw30() |> visualize_walks(.interactive = TRUE)
Use .pluck:
# Single panel random_normal_walk() |> visualize_walks(.pluck = "cum_sum_y")
# Multiple panels random_normal_walk() |> visualize_walks(.pluck = c("y", "cum_sum_y", "cum_mean_y"))
Use .alpha:
rw30() |> visualize_walks(.alpha = 0.3) # More transparent rw30() |> visualize_walks(.alpha = 0.9) # More opaque
library(ggplot2) p <- rw30() |> visualize_walks() ggsave("my_plot.png", p, width = 12, height = 8, dpi = 300)
Yes, using ggplot2:
p <- random_normal_walk(.num_walks = 5) |> visualize_walks(.pluck = "y") p + scale_color_viridis_d()
walks <- rw30() # Overall summary walks |> summarize_walks(.value = y)
# By walk walks |> summarize_walks(.value = y, .group_var = walk_number) |> head()
walks <- rw30() # Get walk with maximum final value max_walk <- walks |> subset_walks(.value = "y", .type = "max") # Get walk with minimum final value min_walk <- walks |> subset_walks(.value = "y", .type = "min") # Visualize both walks together combined <- dplyr::bind_rows( dplyr::mutate(max_walk, type = "Maximum"), dplyr::mutate(min_walk, type = "Minimum") ) visualize_walks(combined, .pluck = "y") + ggplot2::facet_wrap(~type)
This depends on your system, but RandomWalker can handle: - Light: 1,000 walks × 1,000 steps each - Moderate: 10,000 walks × 10,000 steps each - Heavy: 100,000+ walks with careful memory management
.alpha = 0.2.interactive# Sample walks walks_large |> filter(walk_number %in% sample(levels(walk_number), 50)) |> visualize_walks(.alpha = 0.2) # Downsample steps walks_large |> filter(step_number %% 10 == 0) |> visualize_walks()
The functions are vectorized, but you can use parallel processing:
library(future) library(furrr) plan(multisession, workers = 4) walks_list <- future_map(1:10, ~random_normal_walk(.num_walks = 100), .options = furrr_options(seed = 123))
A tibble (tidyverse-compatible data frame) with columns:
- walk_number (factor)
- step_number (integer)
- Value columns (y for 1D, x/y for 2D, x/y/z for 3D)
- Cumulative function columns
walks <- rw30() atb <- get_attributes(walks) names(atb)
Common attributes: fns, num_walks, n, initial_value, distribution parameters.
Yes:
# To base R data.frame as.data.frame(walks) # To matrix (values only) walks |> select(y) |> as.matrix() # To time series ts(walks$y, frequency = 1) # To wide format walks |> tidyr::pivot_wider(names_from = walk_number, values_from = y)
You forgot to specify .value in summarize_walks():
# Wrong walks |> summarize_walks() # Correct walks |> summarize_walks(.value = y)
You might be using a 2D/3D walk where y refers to a dimension. Use cum_sum_y or specify dimensions:
walk_2d <- random_normal_walk(.dimensions = 2) # Wrong walk_2d |> summarize_walks(.value = y) # Correct walk_2d |> summarize_walks(.value = cum_sum_y)
Yes! RandomWalker is designed for tidyverse:
library(dplyr) random_normal_walk(.num_walks = 10) |> filter(step_number > 50) |> mutate(positive = cum_sum_y > 0) |> group_by(walk_number) |> summarize(prop_positive = mean(positive))
Yes:
library(shiny) library(RandomWalker) ui <- fluidPage( numericInput("num_walks", "Number of Walks:", 10), plotOutput("walks_plot") ) server <- function(input, output) { output$walks_plot <- renderPlot({ random_normal_walk(.num_walks = input$num_walks) |> visualize_walks(.pluck = "cum_sum_y") }) } shinyApp(ui, server)
Yes, visualize_walks() returns ggplot2 objects:
library(ggplot2) p <- rw30() |> visualize_walks(.pluck = "y") # Customize further p + labs(title = "My Custom Title") + theme_bw()
Use Geometric Brownian Motion:
stock_prices <- geometric_brownian_motion( .num_walks = 100, .n = 252, # Trading days .mu = 0.08, # 8% expected return .sigma = 0.25, # 25% volatility .initial_value = 100 ) visualize_walks(stock_prices)
Use Brownian Motion in 2D or 3D:
particles <- brownian_motion( .num_walks = 50, .n = 1000, .dimensions = 3 )
Generate synthetic data:
# Generate test walks test_data <- discrete_walk( .num_walks = 1000, .n = 100, .upper_probability = 0.5 ) # Run your algorithm result <- my_algorithm(test_data)
randomwalker tag)citation("RandomWalker")
Yes! Join us on: - GitHub Discussions - Follow @steveondata on Telegram
Yes! We welcome contributions: - Bug reports - Feature requests - Code contributions - Documentation improvements - Examples and tutorials
Open an issue on GitHub Issues with: - Clear description of the feature - Use cases - Example code (if applicable)
RandomWalker is unique in: - Tidyverse compatibility - 27+ distributions in one package - Multi-dimensional support (1D/2D/3D) - Rich visualization capabilities - Comprehensive statistical analysis tools - Consistent API across all functions
Yes, but: - Use efficient data structures (tibbles) - Sample or downsample for visualization - Consider parallel processing for generation - Use appropriate hardware
Yes! The package is actively developed with: - Regular updates - Bug fixes - New features - Community support
Check NEWS.md for latest updates.
Didn't find your answer? Ask on GitHub Discussions!
Any scripts or data that you put into this service are public.
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.