Как создать симуляцию небольшого набора данных в R - PullRequest
1 голос
/ 16 марта 2019

Я очень новичок в программировании, поэтому я прошу прощения за то, что мой вопрос может показаться принципиальным.

В основном у меня сейчас есть набор данных ок. 300 рядов. Идея заключалась в том, чтобы создать, например, целый новый набор данных размером 10 КБ, который по-прежнему обладает теми же характеристиками, что и набор данных 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

Я уже сделал предварительный анализ. Я знаю, что мои числовые данные имеют бета-распределение, и я знаю среднее значение и sd (и уровень асимметрии, если это уместно) Для моих категориальных данных я знаю процентное распределение, поэтому для категории A берут 25% набора данных. Категория B занимает 35%, а категория C - 40%.

Теперь у меня вопрос: какие пакеты лучше всего имитируют эти данные и создают больший набор данных?

Я нашел в пакете simstudy, который показался мне очень хорошим, но я все еще новичок в программировании, и мне трудно разобраться с кодом.

Вот ссылка на описание https://cran.r -project.org / веб / пакеты / simstudy / виньетки / simstudy.html (Я также проверил документацию R, но для такого новичка, как я, очень трудно следить и полностью его понимать)

Я до сих пор не понимаю, как я могу определить свои категориальные значения. (Они устанавливают процентное распределение отдельных классов, но на самом деле не устанавливают, что и к какому классу относится.

Может быть, кто-то здесь может помочь мне объяснить, как я могу применить его к моему набору данных или есть другой лучший пакет для этого?

Заранее большое спасибо!

EDIT

Итак, мой текущий код с пакетом 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)

Однако, здесь моя проблема в том, что я не могу создать асимметричный бета-дистрибутив (и я знаю, что мои данные перекошены вправо).

В качестве альтернативы, я мог бы использовать эту формулу, но здесь я должен создать каждый столбец отдельно, и я не могу создать связь между некоторыми столбцами (например, корреляцию, которую я должен был бы создать позже)

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

Любые другие предложения, как решить эту проблему?

Как вы обычно делаете моделирование различных наборов данных, которые имеют только ограниченное количество записей?

Ответы [ 2 ]

1 голос
/ 16 марта 2019

Будет ли работать, если вы просто используете функцию sample () в R с заменой? Вот пример использования набора данных 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)
0 голосов
/ 16 марта 2019

Я действительно сделал что-то подобное. Я рассчитываю фактические минимальные и максимальные значения для каждой переменной, поэтому я могу имитировать, чтобы имитировать свой собственный исходный набор данных. Использование simstudy имеет несколько преимуществ по сравнению с использованием sample, в первую очередь то, что 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. Не уверен, что это из-за обновления. Дайте мне знать, если это работает для вас. ОБНОВЛЕНИЕ : Кажется, что категориальная спецификация вызывает ошибку, но мне не удалось найти проблему.

ОБНОВЛЕНИЕ на основе уточняющих вопросов и комментариев :

Ваш код отлично работает при генерации имитированного набора данных. Если вы хотите форсировать распределение, вы можете использовать функции распределения Base 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)

Создано в 2019-03-24 пакетом Представить (v0.2.1)

...