如何在 R 中创建小型数据集的模拟

How to create a simulation of a small data set in R

我是编程的新手,因此,如果我的问题看起来很基础,我深表歉意。

基本上我现在有一个大约的数据集。 300 行。现在的想法是创建一个全新的数据集,例如大小为 10k,但是,它仍然具有与 300 的 smlla 数据集相同的特征。

ID Category1 Category2 Amount1 Probability1 1 Class1 A 100 0.3 2 Class2 B 800 0.2 3 Class3 C 300 0.7 4 Class2 A 250 0.4 5 Class3 C 900 0.6

我已经做了探索性分析。我知道我的数字数据有一个 beta 分布,我知道均值和 sd(以及相关的偏度水平) 对于我的分类数据,我知道百分比分布,因此例如类别 A 占数据集的 25%。 B类占35%,C类占40%。

我现在的问题是:模拟此数据并创建更大数据集的最佳软件包是什么?

我在 simstudy 包上发现它看起来非常好,但是,我对编程还是很陌生,我很难理解代码。

这里是link的描述 https://cran.r-project.org/web/packages/simstudy/vignettes/simstudy.html (我也查看了 R 文档,但对于像我这样的新手来说,很难完全理解它)

我仍然不明白如何在那里定义我的分类值。 (他们在那里设置了单个 classes 的百分比分布,但他们实际上并没有设置适用于哪个 class。

也许,这里有人可以帮我解释一下如何将它应用到我的数据集上,或者是否有其他更好的软件包?

非常感谢您!

编辑

所以我当前使用 simstudy 包的代码如下:

def <- defData(varname = "Product_Class", formula = "0.25;0.35;0.4", dist = "categorical")
def <- defData(varname = "Category", formula = "0.25;0.35;0.4", dist = "categorical")
def <- defData(def, varname = "Amount", dist = "beta", formula = 0.6, variance = 0.12)
def <- defData(def, varname = "Amount2", dist = "beta", formula = 0.45, variance = 0.1)
def <- defData(def, varname = "Probability", dist = "beta", formula = 0.4, variance = 0.23)

但是,我的问题是我无法创建偏斜的 beta 分布(而且我知道我的数据偏向右侧)。

或者,我可以使用这个公式,但在这里我必须单独创建每一列,我无法在某些列之间创建关系(f.i。相关性,我稍后必须创建它作为嗯)

rsbeta(n, shape1, shape) 
# shape1 <0 & shape2 >0 creates a right skewede beta distribution
rsbeta(1000, 0.2,3)

关于如何解决这个问题还有其他建议吗?

你通常如何模拟只有有限条目的不同数据集?

如果你只是使用 R 中的 sample() 函数和替换,它会工作吗? 下面是一个使用 mtcars 数据集的例子。

data(mtcars)
mydata=mtcars[,1:4] # only using the first 4 columns for this example
head(mydata)
dim(mydata) # data has 32 rows 4 columns


bigdata=data.frame(mpg=sample(mydata$mpg,1000,replace = T),
                   cyl=sample(mydata$cyl,1000,replace = T),
                   disp=sample(mydata$disp,1000,replace = T),
                   hp=sample(mydata$hp,1000,replace = T))


head(bigdata)
dim(bigdata)

我确实做过这样的事情。我正在计算每个变量的实际最小值和最大值,因此我可以模拟以模仿我自己的原始数据集。与仅使用 sample 相比,使用 simstudy 有几个优点,主要是 sample 仅从可用的现有数据中获取,而 simstudy 生成最小值和最大值之间的任何潜在值(对于数字类型),或一个比例分类变量。如果你的原始数据是 sensitive/personal 数据,Simstudy 也很有用,因此与使用 sample 相比,你可以绕过隐私问题。这就是我所做的:

library(skimr)
library(simstudy)
library(dplyr)
library(glue)

sim_definitions <-
    skim_to_wide(iris) %>%
    mutate(min = as.numeric(p0), max = as.numeric(p100)) %>%
    transmute(
            varname = variable,
            dist = case_when(
                # For binary data if it is only 0 and 1
                n_unique == 2 ~ "binary",
                n_unique > 2 ~ "categorical",
                TRUE ~ "uniform"
            ),
            formula = case_when(
                dist == "uniform" ~ as.character(glue("{min};{max}")),
                # For only factors with 3 levels. number is proportion. 0.3 = 30%
                dist == "categorical" ~ "0.5;0.2;0.3",
                dist == "binary" ~ "0.2",
                # other wise 10 is min, 20 is max
                TRUE ~ "10;20"
            ),
            link = case_when(
                dist == "binary" ~ "logit",
                TRUE ~ "identity"
            )
        )

# 1000 is the final size of the dataset. Change to what ever you want.
simulated_data <- genData(1000, sim_definitions)
dim(simulated_data)
head(simulated_data)

注意:我发现 simstudy 有错误。不知道是不是更新的原因。如果这对你有用,请告诉我。 更新:似乎分类规范导致了错误,但我找不到问题所在。

根据问题和评论的澄清进行更新

您的代码可以很好地生成模拟数据集。如果你想强制偏斜分布,你可以使用基本 R 的分布函数,如 qlnorm。所以:

library(simstudy)
#> Loading required package: data.table
def <- defData(varname = "Product_Class", formula = "0.25;0.35;0.4", dist = "categorical")
def <- defData(def, varname = "Category", formula = "0.25;0.35;0.4", dist = "categorical")
def <- defData(def, varname = "Amount", dist = "beta", formula = 0.6, variance = 0.12)
def <- defData(def, varname = "Amount2", dist = "beta", formula = 0.45, variance = 0.1)
def <- defData(def, varname = "Probability", dist = "beta", formula = 0.4, variance = 0.23)
simulated_data <- genData(1000, def)
hist(simulated_data$Amount2)

simulated_data$Amount2 <- qlnorm(simulated_data$Amount2)
hist(simulated_data$Amount2)

reprex package (v0.2.1)

于 2019-03-24 创建