【问题标题】:Need to generate randomly distributed data in R according to results from summary function需要根据汇总函数的结果在R中生成随机分布的数据
【发布时间】:2021-08-18 22:51:48
【问题描述】:

我正在为一个需要很长时间的研究项目模拟数据。我想用我的数据进行一些实验,但是,我没有足够的模拟数据来实现这一点。我想用正态分布的随机数据来补充我模拟的数据。

到目前为止,我有一个如下所示的数据框:

Training_Data

然后我对该数据框进行了汇总统计,如下所示:

Training_Data_Sum

我有每列数据的最小值、最大值、平均值、STD、中位数等。

现在,我想做的是编写一个函数,该函数将使用 Training_Data 数据框中的 5 行数据,并使用 min、max、mean 和从 Training_Data 帧的汇总统计中获得的 STD 值。

我假设我需要使用 rtruncnorm 函数,如下所示:

Training_Data_50A Training_Data_50B Training_Data_50C Training_Data_50D

其中最小值、最大值、平均值和标准值是从相应的列中获取的。

有人能指出我如何将这个任务转换为适当的 R 函数的正确方向吗?

【问题讨论】:

  • 我认为您正在寻找 Box–Muller 变换。如果你想要一个基于最小值/最大值的截断分布,这将是一个蒙特卡洛实验。您只需拒绝任何超出数据范围的值。所以你一直画,直到你接受 50 个值。
  • 正态分布的数据只有两个参数:mean和SD。您指定的太多了。
  • 在这里检查这个问题:stackoverflow.com/questions/19343133/…

标签: r


【解决方案1】:

我不是读心术,但我想这就是你要找的:

rtruncnorm <- function(n, min, max, mean, std){
  accepted_moves <- c()
  i <- 1
  while(length(accepted_moves)<n){
    draw <- rnorm(1, mean, std)
    if(between(draw, min, max)){
      accepted_moves[i] <- draw
      i <- i+1
    }
  }
return(accepted_moves)
}

模拟:

input_data <- runif(5)
sum_data <- input_data %>% 
  summary()

rtruncnorm(50, sum_data[1], sum_data[6], sum_data[5], sd(input_data))


[1] 0.5259511 0.5575217 0.6253954 0.8497881 0.8902441 0.8462771 0.4441249 0.6323441 0.9069752 0.4665141 0.4922236 0.9103832
[13] 0.6352267 0.5996836 0.5647709 0.6622921 0.4687262 0.4164213 0.1878030 0.5707349 0.8617818 0.4060878 0.7911329 0.5712865
[25] 0.8958417 0.3603563 0.5451828 0.8638422 0.7079184 0.5580455 0.9099664 0.1308865 0.8396717 0.7088652 0.7627120 0.5839610
[37] 0.7446260 0.6821685 0.4831258 0.6643238 0.4619952 0.3614351 0.5678148 0.5655968 0.5316892 0.4885681 0.6507399 0.5020127
[49] 0.5227599 0.5890428

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-14
    • 2011-03-31
    • 2017-12-20
    • 1970-01-01
    • 2017-04-17
    • 1970-01-01
    • 2022-06-12
    • 2012-02-04
    相关资源
    最近更新 更多