R - Метод обратного кумулятивного распределения с заданной функцией

У меня есть заданная функция (назовем ее f (x)), и я использовал метод Монте-Карло, чтобы нормализовать ее. Я вычислил функцию плотности вероятности и после ее интегрирования получил кумулятивную функцию распределения.

f = function(x) ...

plot(f,xlim = c(0, 5), ylim = c(0, 1),main="f(x)")

mc.integral = function(f, n.iter = 1000, interval){
  x = runif(n.iter, interval[1], interval[2])
  y = f(x)
  mean(y)*(interval[2] - interval[1])
}

MC = mc.integral(f, interval = c(0, 8))
print(MC)

densityFunction <- function(x){
  return ((f(x)/MC)) 
}

distributionFunction <- function(x){
  return  (integrate(densityFunction,0,x)$value)
}

vd <- Vectorize(distributionFunction)
plot(vd,xlim = c(0, 8), ylim = c(0, 1),ylab = "y",main="E(f(x))")

Теперь моя следующая задача - использовать метод обратного преобразования / метод обратного кумулятивного распределения для генерации выборок и тестирования их с помощью теста Колмогорова-Смирнова, но я не знаю, как мне это сделать в R.

Не могли бы вы мне помочь?


person tomas    schedule 04.12.2017    source источник


Ответы (1)


Итак, этот поток показывает нам, как сгенерировать образец, используя метод обратного преобразования:

sample <- vd(runif(1000))

> head(sample)
[1] 0.28737403 0.59295499 0.30814305 0.27998306 0.07601228 0.52753327

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

sample <- list()
for(i in 1:10){
  set.seed(i)
  sample[[i]] <- vd(runif(1000))
}

После этого проведите ks.test по списку в цикле:

lapply(sample, function(x) ks.test(x, pnorm))

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

person LAP    schedule 04.12.2017
comment
Спасибо, я думаю, что смогу с этим решить. Однако я думаю, что мне следует использовать метод обратного кумулятивного распределения, потому что обычный не требует CDF или PDF. В этом случае, каковы изменения в ваших шагах? - person tomas; 04.12.2017
comment
См. здесь для объяснения того, как инвертировать функция в R. Надеюсь, вы сможете решить эту проблему. - person LAP; 04.12.2017
comment
Большое тебе спасибо - person tomas; 04.12.2017