Как я лучше всего моделирую произвольную одномерную случайную варьируемую величину с помощью ее функции вероятности?

Linq 2 SQL не имеет прямым, вставляют/обновляют/удаляют эквиваленты SQL. В V1 единственные обновления можно сделать, использование linq является мыслью SubmmitChanges на контексте или если Вы нейтрализация к sql.

Однако некоторые люди попытались преодолеть это ограничение linq, использующего пользовательские реализации.

пакетное обновление Linq.

16
задан Peter O. 27 July 2017 в 07:14
поделиться

3 ответа

Вот (медленная) реализация метода обратного cdf, когда вам задана только плотность.

den<-dnorm #replace with your own density

#calculates the cdf by numerical integration
cdf<-function(x) integrate(den,-Inf,x)[[1]]

#inverts the cdf
inverse.cdf<-function(x,cdf,starting.value=0){
 lower.found<-FALSE
 lower<-starting.value
 while(!lower.found){
  if(cdf(lower)>=(x-.000001))
   lower<-lower-(lower-starting.value)^2-1
  else
   lower.found<-TRUE
 }
 upper.found<-FALSE
 upper<-starting.value
 while(!upper.found){
  if(cdf(upper)<=(x+.000001))
   upper<-upper+(upper-starting.value)^2+1
  else
   upper.found<-TRUE
 }
 uniroot(function(y) cdf(y)-x,c(lower,upper))$root
}

#generates 1000 random variables of distribution 'den'
vars<-apply(matrix(runif(1000)),1,function(x) inverse.cdf(x,cdf))
hist(vars)
12
ответ дан 30 November 2019 в 22:24
поделиться

Используйте кумулятивную функцию распределения http://en.wikipedia.org/wiki/Cumulative_distribution_function

Тогда просто используйте обратное. Проверьте здесь, чтобы увидеть лучшее изображение http://en.wikipedia.org/wiki/Normal_distribution

Это означает: выберите случайное число из [0,1] и установите его как CDF, затем проверьте значение

Это также называется функцией квантиля.

1
ответ дан 30 November 2019 в 22:24
поделиться

Чтобы уточнить ответ «используйте Метрополис-Гастингс» выше:

предположим, что ddist () - это ваша функция плотности вероятности

, примерно такая:

n <- 10000
cand.sd <- 0.1
init <- 0
vals <- numeric(n)
vals[1] <- init 
oldprob <- 0
for (i in 2:n) {
    newval <- rnorm(1,mean=vals[i-1],sd=cand.sd)
    newprob <- ddist(newval)
    if (runif(1)<newprob/oldprob) {
        vals[i] <- newval
    } else vals[i] <- vals[i-1]
   oldprob <- newprob
}

Примечания :

  1. полностью непроверено
  2. эффективность зависит от распределения кандидатов (т.е. от значения cand.sd ). Для максимальной эффективности настройте cand.sd на уровень приема 25-40%
  3. результаты будут автокоррелированы ... (хотя я думаю, вы всегда можете sample () результаты, чтобы скремблировать их или урезать)
  4. может потребоваться отбросить «выгорание», если ваше начальное значение странное

Классический подход к этой проблеме - это отбраковка выборки (см., например, Press et al Числовые рецепты )

6
ответ дан 30 November 2019 в 22:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: