#r #sample #cdf
#r #образец #cdf
Вопрос:
У меня есть cdf:
F_X(x) = 0 for x<=10
(x-10)^3/1000 for 10<x<20
1 for x=>20
Мне нужно сгенерировать выборку из 10 000 из X. как я могу это сделать в R?
Я очень новичок в R, поэтому был бы признателен за любую помощь
Комментарии:
1. @Аллен Кэмерон. Хорошо, спасибо. Я этого не заметил. Комментарий удален.
Ответ №1:
Ваша функция cdf может быть записана в R как:
cdf <- function(x) (x - 10)^3 / 1000
Это означает, что мы можем построить ее для региона [10, 20] следующим образом:
x <- seq(10, 20, 0.1)
plot(x, cdf(x), type = "l")
По сути, то, что мы хотим сделать, это сгенерировать выборку из равномерного распределения между 0 и 1, затем представьте, что эти числа находятся на оси y. Затем мы хотим «считывать» эквивалентные точки на оси x для генерации выборки X
. Для этого мы просто переставляем уравнение, чтобы найти его обратное:
inverse_cdf <- function(x) 10 (1000 * x)^(1/3)
Это означает, что наша выборка может быть сгенерирована следующим образом:
X <- inverse_cdf(runif(10000))
Теперь мы можем построить эмпирический cdf этой выборки с теоретическим cdf и убедиться, что они совпадают:
plot(ecdf(X))
lines(x, cdf(x), col = "red")
Это показывает нам, что эмпирический cdf X
соответствует теоретическому cdf, что указывает на то, что X
он действительно выбран из правильного распределения.
В качестве дополнительной демонстрации обратите внимание, что pdf of X
будет первой производной от cdf. Поэтому оно будет равно 0 везде, кроме промежутка между 10 и 20, где оно будет:
pdf <- function(x) 3*(x - 10)^2 / 1000
Итак, если мы построим это поверх гистограммы плотности X
, мы должны получить близкое совпадение:
hist(X, freq = FALSE)
x <- seq(10, 20, 0.1)
lines(x, pdf(x), col = "red")