[英]Rejection Sampling to generate Normal samples from Cauchy samples
我嘗試通過編碼拒絕采樣方法來生成遵循正態分布的樣本的方法很幸運。 乍一看,樣本看起來像正態分布,但Shapiro-Wilk檢驗的p值始終<0.05。 我真的不知道我哪里出了問題,我只從老師那兒得到了偽代碼(不是作業)。 任何幫助表示贊賞。 在我的代碼下面:
f <- function(x,m,v) { #target distribution, m=mean,v=variance
dnorm(x,m,sqrt(v))
}
g <- function(x,x0,lambda) { #cauchy distribution for sampling
dcauchy(x,x0,lambda)
}
genSamp <- function(n,m,v) { #I want the user to be able to choose mean and sd
#and size of the sample
stProbe <- rep(0,n) #the sample vector
interval = c(m-10*sqrt(v),m+10*sqrt(v)) #wanted to go sure that everything
#is covered, so I took a range
#that depends on the mean
M = max(f(interval,m,v)/g(interval,m,v)) #rescaling coefficient, so the cauchy distribution
#is never under the normal distribution
#I chose x0 = m and lambda = v, so the cauchy distribution is close to a
#the target normal distribution
for (i in 1:n) {
repeat{
x <- rcauchy(1,m,v)
u <- runif(1,0,max(f(interval,m,v)))
if(u < (f(x,m,v)/(M*g(x,m,v)))) {
break
}
}
stProbe[i] <- x
}
return(stProbe)
}
然后我嘗試了:
test <- genSamp(100,2,0.5)
hist(test,prob=T,breaks=30)#looked not bad
shapiro.test(test) #p-value way below 0.05
預先感謝您的幫助。
實際上,我檢查的第一件事是樣本均值和樣本方差。 當我用genSamp
繪制1000個樣本時,樣本均值是2,但樣本方差是2.64,離目標0.5遠。
第一個問題是您對M
的計算。 注意:
interval = c(m - 10 * sqrt(v), m + 10 * sqrt(v))
只給您2個值,而不是間隔上等距點的網格。 與平均值相差10個標准偏差時,“正常”密度幾乎為0,因此M
幾乎為0。您需要執行以下操作
interval <- seq(m - 10 * sqrt(v), m + 10 * sqrt(v), by = 0.01)
第二個問題是在repeat
生成統一隨機變量。 你為什么要做
u <- runif(1,0,max(f(interval,m,v)))
你要
u <- runif(1, 0, 1)
通過這些修復,我測試了genSamp
可以獲取正確的樣本均值和樣本方差。 樣品均通過了Shapiro-Wilk測試和Kolmogorov-Smirnov測試( ?ks.test
)。
完整的工作代碼
f <- function(x,m,v) dnorm(x,m,sqrt(v))
g <- function(x,x0,lambda) dcauchy(x,x0,lambda)
genSamp <- function(n,m,v) {
stProbe <- rep(0,n)
interval <- seq(m - 10 * sqrt(v), m + 10 * sqrt(v), by = 0.01)
M = max(f(interval,m,v)/g(interval,m,v))
for (i in 1:n) {
repeat{
x <- rcauchy(1,m,v)
u <- runif(1,0,1)
if(u < (f(x,m,v)/(M*g(x,m,v)))) break
}
stProbe[i] <- x
}
return(stProbe)
}
set.seed(0)
test <- genSamp(1000, 2, 0.5)
shapiro.test(test)$p.value
#[1] 0.1563038
ks.test(test, rnorm(1000, 2, sqrt(0.5)))$p.value
#[1] 0.7590978
你有
f <- function(x,m,v) { #target distribution, m=mean,v=variance
dnorm(x,e,sqrt(v))
}
哪個樣本的平均值為e
,但從未定義。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.