簡體   English   中英

如何在 R 中創建與向量成比例的隨機樣本?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM