У меня есть определенное количество людей (например, 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
)