Генерация новых случайных распределений на основе распределения моих данных в R - PullRequest
0 голосов
/ 24 апреля 2020

У меня есть набор данных с 27 наблюдениями и соответствующей вероятностью наблюдения (в диапазоне от 0 до 1), как показано ниже

Data Prob_1 Prob_2 
1      .1     1        
2       0     1          
3       0     1       
4       0    .8    
5      .3    .5         
6      .6    .2
7      .9    .1
8       1     0
9       1     0
10     .6     0
11     .2     0
12     .2    .1 
13     .6    .3
14     .4    .4
15     .1    .5
16     .1    .3
17     .4     0
18     .7     0
19      1     0
20      1    .1
21      1    .4
22     .8    .8
23     .4     1
24     .2     1
25     .1     1
26      0     1
27      0     1

Я хочу сгенерировать 100-250 случайных выборок для prob_1 и prob_2 из этих распределений. Я также хочу построить их вместе с диапазоном дисперсии, чтобы увидеть, как меняется случайная выборка. Я пробовал это до сих пор


test_dist = sample(1:27,150,
                   replace=TRUE,
                   prob=c(1,1,1,.8,.5,.2,.1,0,0,0,0,.1,.3,.4,.5,.3,0,0,0,.1,.4,.8,1,1,1,1,1)
                  )


После того, как у меня есть test_dist, я не уверен, как построить его для просмотра вероятностей и диапазона дисперсии для новых данных, сгенерированных для точек с 1 по 27.

Я даже не уверен, что это лучший способ для генерации случайных распределений выборок, следующих за распределением, которое у меня есть.

Спасибо!

Ответы [ 2 ]

1 голос
/ 25 апреля 2020

Надеюсь, это то, что вы ищете.

d_out <- tibble(
  Id = 1:500,
  prob_1_sample = sample(d$Prob_1, 500, replace = T),
  prob_2_sample = sample(d$Prob_2, 500, replace = T)
)

Выходные данные

# A tibble: 500 x 3
      Id prob_1_sample prob_2_sample
   <int>         <dbl>         <dbl>
 1     1           0.8           0  
 2     2           1             1  
 3     3           0.8           0.3
 4     4           0.1           0  
 5     5           0.8           0  
 6     6           0.1           0.8
 7     7           0             0  
 8     8           0.6           1  
 9     9           1             1  
10    10           0.6           0.4
# ... with 490 more rows

Входные данные

structure(list(Prob_1 = c(0.1, 0, 0, 0, 0.3, 0.6, 0.9, 1, 1, 
0.6, 0.2, 0.2, 0.6, 0.4, 0.1, 0.1, 0.4, 0.7, 1, 1, 1, 0.8, 0.4, 
0.2, 0.1, 0, 0), Prob_2 = c(1, 1, 1, 0.8, 0.5, 0.2, 0.1, 0, 0, 
0, 0, 0.1, 0.3, 0.4, 0.5, 0.3, 0, 0, 0, 0.1, 0.4, 0.8, 1, 1, 
1, 1, 1)), row.names = c(NA, -27L), class = c("tbl_df", "tbl", 
"data.frame")) ->d

Примечание : всегда используйте dput(your_data_frame) для публикации ваших входных данных.

аккуратный формат облегчает построение графика с использованием ggplot

d_tidy <- d_out %>% pivot_longer(cols = -Id, names_to = "hist_name",values_to = "sample_values") 

график плотности

d_tidy %>% 
  ggplot(aes(x = sample_values, group = hist_name, color = hist_name))+
  geom_density()

выход

enter image description here

График диапазона точек для mean и sd сравнения.

d_tidy %>% 
  group_by(hist_name) %>% 
  summarise(Mean = mean(sample_values), SD = sd(sample_values)) %>% 
  ggplot(aes(x = factor(hist_name), y = Mean)) + 
  geom_pointrange(aes(ymax = Mean + SD, 
                      ymin = Mean - SD))

выход

enter image description here

0 голосов
/ 24 апреля 2020

Основная идея

Чтобы сгенерировать распределение на основе существующих данных, вам необходимо рассчитать mean и sd их, что можно сделать следующим образом.

(d_summary <- d %>% select(-Data,) %>% summarise_all(.funs = lst(mean,sd)))
    # A tibble: 1 x 4
  Prob_1_mean Prob_2_mean Prob_1_sd Prob_2_sd
        <dbl>       <dbl>     <dbl>     <dbl>
1       0.433       0.463     0.376     0.419

, а затем используйте их для создания новых 150 сэмплов, используя rnorm, как показано ниже.

with(d_summary, tibble(Id = 1:150,
                       prob_1_generated = rnorm(n = 150, mean = Prob_1_mean, sd = Prob_1_sd),
                       prob_2_generated = rnorm(n = 150, mean = Prob_2_mean, sd = Prob_2_sd)
                      )
     )

Выход

# A tibble: 6 x 3
     Id prob_1_generated prob_2_generated
  <int>            <dbl>            <dbl>
1     1           0.0283           0.999 
2     2           0.525            0.447 
3     3           0.247            0.617 
4     4           0.519           -0.0744
5     5           0.817            0.520 
6     6           0.375            0.678 
...