【问题标题】:Generate new random distributions based on distribution of my data in R根据我在 R 中的数据分布生成新的随机分布
【发布时间】:2020-04-24 07:48:25
【问题描述】:

我有一个包含 27 个观测值的数据集和相关的观测概率(范围在 0 到 1 之间),如下所示

数据 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

我想从这些分布中为 prob_1 和 prob_2 生成 100-250 个随机样本。 我还想将它们与方差带一起绘制,以查看随机样本如何变化。 到目前为止我已经尝试过了


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 生成的新数据的概率和方差带。

我什至不确定这是否是按照我的分布生成随机样本分布的最佳方法。

谢谢!

【问题讨论】:

    标签: r random distribution


    【解决方案1】:

    希望这就是您正在寻找的。​​p>

    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()
    

    输出

    点范围图用于meansd 比较。

    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))
    

    输出

    【讨论】:

    • 非常感谢您的回答和有用的注释/提示。很有帮助!
    【解决方案2】:

    主要思想

    要从现有数据生成分布,您需要计算其中的meansd, 您可以按照以下方式进行操作。

    (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
    

    然后使用rnorm 生成新的 150 个样本,如下所示。

    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 
    

    【讨论】:

    • 感谢您的回复。我正在寻找实际生成手头样本的 150 个分布。然后绘制 150 个分布的平均值以及方差带。如果我的问题不清楚,我深表歉意。
    • @sck 我不得不写新的答案。让我知道你的想法。
    猜你喜欢
    • 2011-03-31
    • 2017-04-17
    • 2017-12-20
    • 2021-08-18
    • 1970-01-01
    • 1970-01-01
    • 2019-12-17
    • 2014-08-04
    • 1970-01-01
    相关资源
    最近更新 更多