Создание групп с перекосом, но чьи элементы добавляют к фиксированной сумме - PullRequest
0 голосов
/ 04 октября 2019

У меня есть определенное количество людей (например, 1000). Я хотел бы разделить эти 1000 человек на случайное количество классов Y (например, 5), но не в равной степени. Я хочу, чтобы они были распределены неравномерно, в соответствии с некоторым распределением вероятностей, которое сильно искажено (что-то вроде степенного распределения).

Моя интуиция заключается в том, что мне нужно сгенерировать распределение вероятностей, которое (1) искажено и (2) также складывается до 1.

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

Но это выглядит ужасно не элегантно, и y_size не всегда составляет 1000, что требует циклического повторения и повторной попытки. Какой подход лучше?

require(poweRlaw)
x<-1000
y<-10
y_sizes<-rpldis(10,xmin=5,alpha=2,discrete_max=x)
y_sizes<-round(y_sizes * x/sum(y_sizes)) 
newx<-y_sizes #newx only approx = x rather than = x
people<-1:x
groups<-cut(
  people,
  c(0,cumsum(y_sizes))
) %>% as.numeric
data.frame(
  people=people,
  group=groups
)
...