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.
RandomWalker requires R version 4.1.0 or higher.
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).
Add .dimensions = 2:
random_normal_walk(.num_walks = 10, .n = 100, .dimensions = 2)
#> # A tibble: 800 × 14
#> walk_number step_number x y cum_sum_x cum_prod_x cum_min_x
#> <fct> <int> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1 1 1 -0.220 -0.119 -0.220 0 -0.220
#> 2 1 2 -0.0624 0.0535 -0.283 0 -0.220
#> 3 1 3 -0.220 0.179 -0.503 0 -0.220
#> 4 1 4 0.146 0.0317 -0.357 0 -0.220
#> 5 1 5 -0.0783 -0.0700 -0.435 0 -0.220
#> 6 1 6 -0.147 -0.00606 -0.582 0 -0.220
#> 7 1 7 -0.00374 -0.0842 -0.586 0 -0.220
#> 8 1 8 0.170 -0.115 -0.416 0 -0.220
#> 9 1 9 -0.0349 0.0425 -0.451 0 -0.220
#> 10 1 10 -0.0472 -0.119 -0.498 0 -0.220
#> # ℹ 790 more rows
#> # ℹ 7 more variables: cum_max_x <dbl>, cum_mean_x <dbl>, cum_sum_y <dbl>,
#> # cum_prod_y <dbl>, cum_min_y <dbl>, cum_max_y <dbl>, cum_mean_y <dbl>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:
Use .pluck:
Use .alpha:
walks <- rw30()
# Overall summary
walks |> summarize_walks(.value = y)
#> Warning: There was 1 warning in `dplyr::summarize()`.
#> ℹ In argument: `geometric_mean = exp(mean(log(y)))`.
#> Caused by warning in `log()`:
#> ! NaNs produced
#> # A tibble: 1 × 16
#> fns fns_name dimensions mean_val median range quantile_lo quantile_hi
#> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1 rw30 Rw30 1 -1.09 -1.02 46.9 -12.6 11.5
#> # ℹ 8 more variables: variance <dbl>, sd <dbl>, min_val <dbl>, max_val <dbl>,
#> # harmonic_mean <dbl>, geometric_mean <dbl>, skewness <dbl>, kurtosis <dbl># By walk
walks |> summarize_walks(.value = y, .group_var = walk_number) |> head()
#> Warning: There were 29 warnings in `dplyr::summarize()`.
#> The first warning was:
#> ℹ In argument: `geometric_mean = exp(mean(log(y)))`.
#> ℹ In group 1: `walk_number = 1`.
#> Caused by warning in `log()`:
#> ! NaNs produced
#> ℹ Run `dplyr::last_dplyr_warnings()` to see the 28 remaining warnings.
#> # A tibble: 6 × 17
#> walk_number fns fns_name dimensions mean_val median range quantile_lo
#> <fct> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1 1 rw30 Rw30 1 5.98 7.45 20.1 -3.74
#> 2 2 rw30 Rw30 1 -4.14 -4.44 9.07 -7.77
#> 3 3 rw30 Rw30 1 -6.56 -6.94 11.7 -10.9
#> 4 4 rw30 Rw30 1 -1.04 -1.05 6.63 -3.40
#> 5 5 rw30 Rw30 1 2.89 2.22 17.4 -3.46
#> 6 6 rw30 Rw30 1 -4.08 -4.59 14.0 -9.72
#> # ℹ 9 more variables: quantile_hi <dbl>, variance <dbl>, sd <dbl>,
#> # min_val <dbl>, max_val <dbl>, harmonic_mean <dbl>, geometric_mean <dbl>,
#> # skewness <dbl>, kurtosis <dbl>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.interactiveA 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
You forgot to specify .value in
summarize_walks():
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))
#> # A tibble: 10 × 2
#> walk_number prop_positive
#> <fct> <dbl>
#> 1 1 0.9
#> 2 2 1
#> 3 3 1
#> 4 4 1
#> 5 5 1
#> 6 6 0
#> 7 7 1
#> 8 8 0
#> 9 9 1
#> 10 10 0.1Yes:
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")
})
}
shinyApp(ui, server)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:
randomwalker tag)Yes! Join us on: - GitHub Discussions - Follow @spsanderson on Twitter
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)