我对编程非常陌生,因此,如果我的问题似乎很根本,我深表歉意。
基本上,我现在有了一个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)
还有其他解决方法吗?
您通常如何模拟只有有限数量条目的不同数据集?
答案 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创建