У меня есть 16068 точек данных со значениями в диапазоне от 150 до 54850 (mean = 3034.22). Каким должен быть код R для генерации набора случайных чисел, частота которых экспоненциально растет между 54850 и 150?
Я пытался использовать функцию rexp() в R, но не могу понять, как установить диапазон от 150 до 54850. В моем фактическом наборе данных значение лямбда равно 25.
set.seed(123)
myrange <- c(54850, 150)
rexp(16068, 1/25, myrange)
Звонок выдает ошибку.
Error in rexp(16068, 1/25, myrange) : unused argument (myrange)
Гипотетическая популяция должна экспоненциально увеличиваться по мере приближения значений данных к 150. У меня есть 25 точек данных со значением 150 и только одна со значением 54850. Смоделированная популяция должна попадать в этот диапазон.





Это действительно больше вопрос для math.stackexchange, но из любопытства я предоставляю это решение. Возможно, этого достаточно для ваших нужд.
Во-первых, ?rexp говорит нам, что у него всего два аргумента, поэтому мы генерируем случайное экспоненциальное распределение нужной длины.
set.seed(42) # for sake of reproducibility
n <- 16068
mr <- c(54850, 150) # your 'myrange' with less typing
y0 <- rexp(n, 1/25) # simulate exp. dist.
y <- y0[order(-y0)] # sort
Теперь нам нужен математический подход для масштабирования распределения.
# f(x) = (b-a)(x - min(x))/(max(x)-min(x)) + a
y.scaled <- (mr[1] - mr[2]) * (y - min(y)) / (max(y) - min(y)) + mr[2]
Доказательство:
> range(y.scaled)
[1] 150.312 54850.312
Это не так уж плохо.
Сюжет:
plot(y.scaled, type = "l")
Примечание: Возможны некоторые математические проблемы, поэтому см., например, этот ответ.
Добро пожаловать. Просто опечатка, спасибо, поправил. Пожалуйста, отметить вопрос как отвеченный, это не позволит людям тратить время на ответы на вопрос, на который уже был дан ответ, спасибо.
Большое спасибо, @jay.sf. Есть небольшая проблема с масштабированным кодом:
y.scaled <- (mr[1] - mr[2]) * (y - min(y)) / (max(y) - min(y)) + mr[2]Как только я поместил его таким образом, он работал отлично.