2017-12-04 3 views
2

私は与えられた関数(f(x)と呼ぶ)を持っています。私はモンテカルロ法を使ってそれを正規化しました。私は確率密度関数を計算し、それを積分することから累積分布関数を得ました。R - 与えられた関数を使った逆累積分布法

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.で行うべきか分からない

私に助けてもらえますか?

答えて

1

まあ、this threadは私たちがどのように逆の方法で変換を使用してサンプルを生成することを示しています。

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

その後、ループks.test:10個の異なるランダムサンプルを生成、したがって

sample <- vd(runif(1000)) 

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

で行うことができますリストの上に:

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

wil私は各サンプルのテストの出力対正規性を与えます。標準偏差のほとんどの検定は、大きな差があっても大きな検体では有意である傾向があり(参考文献here)、サンプルのサイズを賢明に選択してください。

+0

ありがとう、私はそれで解決できると思う。しかし、通常のCDFやPDFは必要ないため、逆累積分布方式を使うべきだと思います。この場合、あなたのステップの修正は何ですか? – kr0tchy

+1

Rの関数を逆にする方法については、[here](https://stackoverflow.com/questions/10081479/solving-for-the-inverse-of-a-function-in-r)を参照してください。あなたはそれを解決することができます。 – LAP

+0

ありがとう – kr0tchy

関連する問題