Создание образцов с разным диапазоном и весом - PullRequest
1 голос
/ 05 июля 2019

Я хочу создать общую выборку из 3000 записей с некоторыми правилами:

Category-1(low)  0.1 - 0.3
Category-2(Medium)  0.4 - 0.7
Category-3(High)  0.7 - 0.9 

Я хочу создать образец таким образом, чтобы у каждой категории были веса, например:

Category-1(low)  20% of the dataset
Category-2(Medium)  30% of the dataset 
Category-3(High)  50% of the dataset

Я не могу найти указатели для этого. Может ли кто-нибудь помочь мне с тем же. Заранее большое спасибо.

Ответы [ 3 ]

2 голосов
/ 05 июля 2019

Мы можем использовать Map для создания seq значений значений между диапазонами, показанными в сообщении ОП, при генерации sample для диапазонов с пропорцией, также передаваемой в качестве аргумента Map

lst1 <- Map(function(x, y, z) sample(seq(x, y, by = 0.1), z, 
  replace = TRUE), c(0.1, 0.4, 0.7), c(0.3, 0.7, 0.9), c(0.2, 0.3, 0.5) * 3000)
names(lst1) <- c("low", "medium", "high")
lengths(lst1)
#   low medium   high 
#   600    900   1500 

out <- unlist(lst1)
length(out)
#[1] 3000

Если нам нужно в виде двух столбцов data.frame

dat <- stack(lst1)[2:1]
1 голос
/ 05 июля 2019

Довольно простой подход:

1. Это не случайно, но в зависимости от приложения этого может быть достаточно

out <- c(runif(600, 0.1, 0.3), runif(900, 0.4, 0.7), runif(1500, 0.7, 0.9))

2. Здесь вы бы нарисовали числа, приходящие также из каждой категории: так что более случайные ...

sam <- sample(1:3, size = 3000, prob = c(0.2, 0.3, 0.5), replace = TRUE)
x1 <- sum(sam == 1)
x2 <- sum(sam == 2)
x3 <- sum(sam == 3)

out <- c(runif(x1, 0.1, 0.3), runif(x2, 0.4, 0.7), runif(x3, 0.7, 0.9))
1 голос
/ 05 июля 2019

Мне нравится использовать пакет simstudy для генерации данных. В этом случае я повторно заполнил ваши значения, которые соответствуют правилам категории. Симстуди дает объект data.table, но я более знаком с синтаксисом Tidyverse:

library(simstudy)
library(dplyr)

set.seed(1724)

# define data
def <- defData(varname = "category", formula = "0.2;0.3;0.5", dist = "categorical", id = "id")
def <- defData(def, varname = "value", dist = "nonrandom", formula = NA)

# generate data
df <- genData(3000, def) %>% as_tibble()

# add in values that conform to category rules
df[df$category == 1,]$value <- runif(nrow(df[df$category == 1,]), min = 0.1, max = 0.3)
df[df$category == 2,]$value <- runif(nrow(df[df$category == 2,]), min = 0.4, max = 0.7)
df[df$category == 3,]$value <- runif(nrow(df[df$category == 3,]), min = 0.7, max = 0.9)

# A tibble: 3,000 x 3
      id category value
   <int>    <int> <dbl>
 1     1        3 0.769
 2     2        2 0.691
 3     3        3 0.827
 4     4        3 0.729
 5     5        2 0.474
 6     6        3 0.818
 7     7        2 0.635
 8     8        2 0.552
 9     9        3 0.794
10    10        3 0.792
# ... with 2,990 more rows
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...