【问题标题】:How to create a simulation of a small data set in R如何在 R 中创建小型数据集的模拟
【发布时间】:2019-08-07 12:23:08
【问题描述】:

我对编程很陌生,因此,如果我的问题看起来很基础,我深表歉意。

基本上我现在有一个 apprx 的数据集。 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 包上发现它看起来非常好,但是,我对编程还是很陌生,我很难理解代码。

这里是描述的链接 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)

还有什么其他的建议可以解决这个问题吗?

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

【问题讨论】:

    标签: r statistics simulation analysis


    【解决方案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)
    

    【讨论】:

    • 样本很好,因为它非常简单,但正如@Luke W. Johnston 所提到的,我们只是重用数据,而 simstudy 使用整个分布并给出所有可能出现的潜在值。仍然非常感谢您的快速回复!
    【解决方案2】:

    我实际上做过类似的事情。我正在计算每个变量的实际最小值和最大值,所以我可以模拟来模仿我自己的原始数据集。与仅使用 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 有错误。不知道是不是因为更新。让我知道这是否适合您。 更新:似乎是分类规范导致了错误,但我找不到问题。

    更新基于问题的澄清和 cmets

    您的代码在生成模拟数据集时运行良好。如果您想强制偏斜分布,您可以使用基本 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 年 3 月 24 日创建

    【讨论】:

    • 您好卢克,非常感谢您的快速回复!我将在下周试用此代码,如果它对我有用,我会更新您!
    • 嗨卢克,我已经尝试了你的方法,但正如你所说 - 有一个错误。所以我试着玩弄它,但它并没有真正起作用。您是否也尝试过其他方法?
    • 如果有效,请接受它作为答案以表示感谢:)
    猜你喜欢
    • 1970-01-01
    • 2021-12-19
    • 1970-01-01
    • 1970-01-01
    • 2017-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多