【问题标题】:Creating a simulated dataset which keeps the original shape of the data in R [closed]创建一个模拟数据集,在 R [关闭] 中保持数据的原始形状
【发布时间】:2018-10-01 04:42:49
【问题描述】:

我有一个包含 11 个变量的数据集。其中,其中六个是数字,另外五个是基于数字变量值的有序因子(即,有人得到 62,然后他们得到 D,75 等于,C 等)。

现在我知道我可以使用rnorm 创建一个数据集,并为其提供每个变量的均值和标准差;但是,我的问题是 rnorm 是正态分布的(因此得名),而我的数据是负偏态的。

因此,有人能告诉我如何创建一个模拟数据集来保持原始数据的分布吗?换句话说,如何创建具有预定义均值、最大值、最小值和标准差的偏态正态分布?

【问题讨论】:

  • R 具有像rnorm()runif() 这样的函数,它们将在正态或均匀分布上生成随机数。这有帮助吗?
  • sample() 表示向量的随机样本
  • 感谢您闪电般的快速响应!由于数据是私有的,我不想从中抽取样本。至于rnorm()runif(),我的专栏不是正态分布的。是否可以模拟给定特定最小值、最大值、平均值和偏斜的数据?
  • 您能否提供更多信息,说明您要使用这些生成的数据完成什么工作?有很多方法可以在 R 中操作随机生成的数字,但根据您的用例,您可能需要也可能不需要复制数据集的每个元素。一个简单的例子是您可以生成年龄为age <- sample(1:99, 1000, replace = TRUE) 以生成 1000 个数据点。如果要匹配数据集的概率,可以从数据集中的1:99 计算年龄概率,并使用age <- sample(1:99,1000, prob = prob_vector, replace = TRUE)
  • 非常感谢您的回复和回答。我将编辑问题以尝试提高问题的质量。

标签: r simulation


【解决方案1】:

mtcars的小例子:

假设我们要生成cyl 的随机样本,其值为468,但我们想匹配mtcars 中的分布

首先,我们需要计算数据中每个值的概率:

set.seed(2)
library(tidyverse)

cyl_pct <- mtcars %>% group_by(cyl) %>% 
  summarize(count = n()) %>% 
  mutate(pct = count/sum(count)) %>% 
  select(pct) %>%
  unlist()

然后我们使用实际数据中的概率进行抽样:

mtcars2 &lt;- data.frame(cyl = sample(c(4,6,8), 10000, replace = TRUE, prob = cyl_pct))

现在让我们检查一下:

mtcars2 %>% group_by(cyl) %>% 
      summarize(count = n()) %>% 
      mutate(pct = count/sum(count)) %>% 
      select(pct) %>%
      unlist()

  pct1   pct2   pct3 
0.3495 0.2193 0.4312

mtcars中的概率相比

   pct1    pct2    pct3 
0.34375 0.21875 0.43750

对于sample 中较大的n,这些百分比将收敛到提供的值。

【讨论】:

  • 一旦我意识到我需要对传递给我的新数据框的向量进行排序,你的回答就像一个魅力:df_2$var &lt;- data.frame(var = sample(sort(unique(orignial_var)), 10000, replace = TRUE, prob = var_pct)) 再次感谢你,因为现在我可以创建我的模拟数据集并开始我的博客 :) 干杯!
猜你喜欢
  • 2016-03-16
  • 1970-01-01
  • 1970-01-01
  • 2021-11-05
  • 1970-01-01
  • 2019-08-07
  • 2021-11-16
  • 1970-01-01
相关资源
最近更新 更多