R - 具有给定函数的逆累积分布方法

时间:2017-12-04 13:36:46

标签: r inverse cdf kolmogorov-smirnov

我有一个给定的函数(让我们称之为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))")

现在我的下一个任务是使用逆变换方法/逆累积分布方法生成样本并使用Kolmogorov-Smirnov检验进行测试,但我不知道如何在R中进行。

你能帮我个忙吗?

1 个答案:

答案 0 :(得分:1)

好吧,this thread向我们展示了如何使用逆变换方法生成样本:

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))

将为您提供每个样本的测试与正态性的输出。明智地选择样本的大小,因为大多数样本的正常性测试对于大样本而言很容易发生,即使差异很小(参考here)。