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

时间:2019-03-16 16:55:21

标签: r statistics simulation analysis

我对编程非常陌生,因此,如果我的问题似乎很根本,我深表歉意。

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

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软件包上发现了一个很好的发现,但是,我对编程还是很陌生,我很难理解代码。

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

我仍然不太了解如何在其中定义分类值。 (他们在那里设置了单个类别的百分比分布,但实际上并未设置适用于哪个类别的内容。

也许,有人可以帮我解释一下如何将其应用到我的数据集上?还是有另一个更好的软件包呢?

非常感谢您!

编辑

所以我当前使用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)

还有其他解决方法吗?

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

2 个答案:

答案 0 :(得分:1)

如果您仅在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)

答案 1 :(得分:0)

我实际上已经做了完全一样的事情。我正在计算每个变量的实际最小值和最大值,因此我可以模拟自己的原始数据集。与仅使用sample相比,使用simstudy有几个优点,主要是sample仅从可用的现有数据中获取数据,而simstudy会在最小值和最大值之间(对于数字类型)生成任何可能的值,或者为分类变量。如果您的原始数据是敏感/个人数据,则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创建