randomizr generates random assignments for common experimental
designs, including simple random assignment, complete random assignment,
block random assignment, and cluster random assignment. A new function,
balanced_ra(), is experimental: it draws assignment with tight targets
while keeping each unit’s probability exact.
Use the following to install the latest CRAN release of randomizr:
install.packages("randomizr")randomizr has four main random assignment functions, corresponding
to the common experimental designs listed above. You can read more about
using each of these functions in our reference
library or by
clicking on the function names: simple_ra(), complete_ra(),
block_ra(), and cluster_ra(). An additional experimental function,
balanced_ra(), is included from version 2.0.1; see the introduction
article.
complete_ra(): Under complete random assignment, we assign a fixed m
units out of a population of N units to treatment:
library(randomizr)
Z <- complete_ra(N = 100, m = 50)
table(Z)| 0 | 1 |
|---|---|
| 50 | 50 |
cluster_ra(): Under cluster random assignment, whole clusters of units
(like all the students in a classroom or everyone living in the same
household) are assigned to treatment conditions together.
# This makes a cluster variable: one unit in cluster "a", two in "b"...
clust_var <- rep(letters[1:15], times = 1:15)
Z <- cluster_ra(
clusters = clust_var,
m_each = c(4, 4, 7),
conditions = c("control", "placebo", "treatment")
)
table(Z, clust_var)| a | b | c | d | e | f | g | h | i | j | k | l | m | n | o | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| control | 1 | 0 | 0 | 0 | 5 | 0 | 0 | 8 | 9 | 0 | 0 | 0 | 0 | 0 | 0 |
| placebo | 0 | 2 | 0 | 0 | 0 | 6 | 0 | 0 | 0 | 0 | 11 | 0 | 13 | 0 | 0 |
| treatment | 0 | 0 | 3 | 4 | 0 | 0 | 7 | 0 | 0 | 10 | 0 | 12 | 0 | 14 | 15 |
block_ra(): Under block random assignment, complete random assignment
is used within blocks.
# This makes a cluster variable: one unit in cluster "a", two in "b"...
block_var <- rep(letters[1:10], times = 4)
Z <- block_ra(
blocks = block_var
)
table(Z, block_var)| a | b | c | d | e | f | g | h | i | j | |
|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 |
| 1 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 |
balanced_ra(): Under balanced assignment, units are assigned to ensure
expected totals are hit tightly.
# This assigns exactly three of six units to treatment with either 1 assigned in block 1 and 2 in block 2 or 2 in block 1 and 1 in block 2
set.seed(1)
blocks <- c("a", "a", "a", "b", "b", "b")
table(balanced_ra(blocks = blocks), blocks)| a | b | |
|---|---|---|
| 0 | 2 | 1 |
| 1 | 1 | 2 |
For more information about all of randomizr’s functionality, please see our online tutorial
Happy randomizing!
randomizr 2.0.1 has been built from the ground up with considerable support from Claude and other AI models, including in writing code and documentation. The codebase and documentation build on architecture developed by humans in earlier versions of randomizr, and humans also generated multiple tests for all major parts of the codebase. So while we have reviewed the codebase for 2.0.1, we did not write it. The guarantee offered for the package, then, is not that every line of code has been vouched for. Rather, it is that the package can be shown, through repeated testing, to do what it says it does. For specifics on randomizr guarantees, see https://declaredesign.org/r/randomizr/articles/randomizr_guarantees.html and the tests in the randomizr testthat codebase.