[英]How to create random sample proportional to vector in R?
假設以下數據框:
df <- data.frame(id = 1:6, value=c(10,20,10,20,30,10))
df
id value
1 1 10
2 2 20
3 3 10
4 4 20
5 5 30
6 6 10
我想將每個人隨機分配到三個組(A、B、C)中的一個。 我想達到 30% 的給定比例在 A 組中,50% 的比例在 B 組中,20% 的比例在 C 組中。但我想根據值列進行此分配。 換句話說,我想實現如下目標:
id value group
1 1 10 A
2 2 20 A
3 3 10 C
4 4 20 B
5 5 30 B
6 6 10 C
或者...
id value group
1 1 10 A
2 2 20 B
3 3 10 A
4 4 20 C
5 5 30 B
6 6 10 A
當然,在這個例子中,這些都是完美的解決方案。 但是隨機分配應該盡可能接近給定的比例。 所以另一個例子如下:
df <- data.frame(id = 1:6, value=c(112,56,53,13,80,120))
df
id value
1 1 112
2 2 56
3 3 53
4 4 13
5 5 80
6 6 120
一項可能的任務是:
id value group
1 1 112 B
2 2 56 A
3 3 53 C
4 4 13 C
5 5 80 A
6 6 120 B
在這種情況下,分配不會是完美的,但接近所需的比例(A 組:31.3%,B 組:53.4%,C 組:15.2%)。
有什么辦法可以在R中做到這一點嗎? 謝謝!
我理解你的目標,因為在分組分配后,你希望sum(value[group == "A"]) / sum(value)
大約等於0.3
,同樣地, "B"
( 0.5
) 和"C"
( 0.2
) . 如果是這種情況,您所要做的就是為組分配這些概率權重,而無需采取任何特殊措施來考慮value
。 作為隨機化的自然結果, value
總和(平均)將按照您的意願搖晃。 看:
library(tidyverse)
set.seed(1)
# 100-row example dataframe
df <- tibble(
id = 1:100,
value = sample(1:200, 100, replace = TRUE)
)
# simulate 100 sets of group assignments
sims <- map_dfr(
1:100, # iterate 100x
~ df %>%
mutate(group = sample(
c("A", "B", "C"),
size = 100,
replace = TRUE,
prob = c(.3, .5, .2)) # probability weights
) %>%
group_by(group) %>%
summarize(prop = sum(value)) %>% # compute `value` proportion
mutate(prop = prop / sum(prop)) # within each group
)
# central tendency & dispersion across simulations
sims %>%
group_by(group) %>%
summarize(across(
prop,
list(mean, sd, median, ~ quantile(.x, .25), ~ quantile(.x, .75))
))
團體 | 平均值(標准差) | 中位數 (IQR) |
---|---|---|
一種 | .29 (.06) | .29 (.25 -.32) |
乙 | .51 (.06) | .50 (.47 -.55) |
C | .21 (.04) | .21 (.18 -.23) |
# distribution of proportions across sims by groups
samps %>%
ggplot(aes(prop)) +
geom_density(aes(fill = group), alpha = .75) +
scale_fill_brewer(palette = "Dark2")
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.