Симулирайте стойности под персонализирана плътност

Имам теоретичен и кодиращ въпрос, който е свързан с плътности и симулиращи стойности.

Изграждам персонализирани плътности чрез командата density(x). Въпреки това се надявам да генерирам 1000-10000 симулирани стойности от тази плътност. Общата цел е да се вземат две плътности, изградени от формата на плътност(x$y) и да се извършат симулации и да се каже, че тази плътност A е повече от плътност B x% от времето. Просто бих взел всяка симулирана стойност и ще видя коя е по-висока и ще кодирам, за да преброя колко пъти A е по-високо от B.

Има ли начин да се постигне това? Или има някакъв начин да се постигне нещо подобно с тези плътности? Благодаря!


person BaseballR    schedule 18.09.2013    source източник
comment
Да, проблемът с това е, че изграждам гладка плътност въз основа само на 86 проби, но имам причина да вярвам, че може да попадне навсякъде в плътността, така че се надявам да симулирам в рамките на тази плътност, някакви мисли?   -  person BaseballR    schedule 19.09.2013


Отговори (2)


Функцията sample може да вземе средните точки на интервалите на плътността на извадката и след това да използва плътностите като пробни аргументи.

mysamp <- sample(x= dens$x, size=1000  , prob=dens$y, repl=TRUE)

Това има недостатъка, че може да се наложи да промените резултата, за да избегнете много дубликати.

 mysamp <- jitter(mysamp)

Друг метод е да използвате approxfun и ecdf. Може да се наложи да обърнете функцията (обратна роля на x и y), за да вземете проба, като използвате входа на runif(1000) в резултата. Почти съм сигурен, че има работещи примери за това в SO и съм почти сигурен, че съм един от многото, които в миналото са публикували такъв код в R-help. (Ако вашите търсения не са успели да намерят, тогава публикувайте стратегиите за търсене и другите могат да се опитат да ги подобрят.)

person IRTFM    schedule 18.09.2013
comment
за да избегнете предупреждение, използвайте prob=dens$y/sum(dens$y) - person Ferdinand.kraft; 19.09.2013
comment
Това е страхотно, точно това, което търсих! - person BaseballR; 19.09.2013

Следвайки съвета на @DWin за обръщане на ecdf, ето как да приложите такъв подход, като използвате сплайн, за да паснете на обърнатата стъпкова функция:

дадени

z <- c(rnorm(40), runif(40))
plot(density(z))

въведете описание на изображението тук

Дефинирайте

spl <- with(environment(ecdf(z)), splinefun(y, x))

sampler <- function(n)spl(runif(n))

Сега можете да се обадите на sampler() с размера, който искате:

plot(density(sampler(1000)))

въведете описание на изображението тук

Последна бележка: Това никога няма да генерира стойности извън обхвата на оригиналните данни, но дубликатите ще бъдат изключително редки:

> anyDuplicated(sampler(1e4))
[1] 0
person Ferdinand.kraft    schedule 18.09.2013