日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Horseshoe prior的R package介绍:HS.normal.mean函数

發布時間:2025/4/14 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Horseshoe prior的R package介绍:HS.normal.mean函数 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Horseshoe prior的R package介紹:HS.normal.mean函數

最近做的一些事情需要和Horseshoe prior對比,所以一直在看Horseshoe的一些資料。上周做了一點simulation發現Horseshoe在normal mean model上的表現還挺不錯的,所以打算扒一下horseshoe這個包里面的HS.normal.means這個函數看看那幾位搞Horseshoe的大牛是怎么寫的。這里貼一個那個包的說明文本:https://cran.r-project.org/web/packages/horseshoe/horseshoe.pdf

本文末尾附了HS.normal.means的源代碼,懶得自己去找的可以拉到最后看看。


首先Normal mean model非常簡單,假設樣本yyy由信號β\betaβ與噪聲?\epsilon?組成:
y=β+?y = \beta + \epsilony=β+?

其中噪聲服從正態分布N(0,σ2In)N(0,\sigma^2I_n)N(0,σ2In?)β\betaβ的先驗是Horseshoe prior,
βi~N(0,λi2τ2)λi2~C+(0,1),τ2~C+(0,1)\beta_i \sim N(0,\lambda_i^2\tau^2) \\ \lambda_i^2 \sim C^+(0,1),\tau^2 \sim C^+(0,1)βi?N(0,λi2?τ2)λi2?C+(0,1),τ2C+(0,1)

C+(0,1)C^+(0,1)C+(0,1)是標準half-Cauchy分布,大家可以把它理解成是標準Cauchy分布的第二象限部分沿yyy軸對折到第一象限得到的分布。假設β\betaβ非常稀疏,即{i:βi≠0}\{i:\beta_i \ne 0\}{i:βi??=0}包含的元素個數遠小于nnn,這個模型可以實現比較簡單的稀疏信號復原。


函數定義

function (y, method.tau = c("fixed", "truncatedCauchy", "halfCauchy"), tau = 1, method.sigma = c("fixed", "Jeffreys"), Sigma2 = 1, burn = 1000, nmc = 5000, alpha = 0.05)

這是HS.normal.means函數定義的部分:
第一個輸入yyy需要是一列向量,表示observation;
第二個輸入method.tau表示τ\tauτ的先驗,這里可以選擇τ\tauτ作為固定常數、truncated cauchy或者halfcauchy;因為τ\tauτ在模型中是global variance component,它的作用是在對每一個signal做belief update的時候可以從其他signal那里borrow information,所以如果是選擇fixed,一般也是先用MLE(在horseshoe這個包中可以用HS.MMLE這個函數)估計出了τ\tauτ的值,然后再作為固定值在這里輸入(這種操作叫empirical Bayesian);
第三個輸入τ\tauτ默認值為1,如果第二個輸入選擇的是fixed,那么第三個輸入就是輸入τ\tauτ的固定取值,如果第二個輸入選擇的是那兩種prior之一,那么這個輸入不會被采用;
第四個輸入是噪聲的標準差σ\sigmaσ的取值方法,如果選擇fixed,那么就需要第五個輸入確認σ\sigmaσ的取值,在理論研究的模擬實驗中通常假設σ=1\sigma=1σ=1,所以第五個輸入的默認值為1;如果選擇Jeffrey先驗,也就是π(σ)∝1/σ\pi(\sigma) \propto 1/\sigmaπ(σ)1/σ,那么模型中的每一個參數都有先驗,并且先驗不依賴于超參,這樣的模型叫做full Bayesian;
第六個輸入設置burn-in sample的數量,第七個輸入設置chain的長度,因為這個函數大框架是Metropolis-Hastings,所以也是需要這兩個參數的;
因為這個函數輸出包含β\betaβ的置信區間,所以第八個輸入alpha的作用是控制置信水平(1-alpha是置信水平)。


輸出值定義

result <- list(BetaHat = BetaHat, LeftCI = left.points, RightCI = right.points, BetaMedian = BetaMedian, Sigma2Hat = Sigma2Hat, TauHat = TauHat, BetaSamples = BetaSave, TauSamples = TauSave, Sigma2Samples = Sigma2Save)return(result)

這些輸出分別是β\betaβ的后驗均值、1-alpha置信區間下界、1-alpha置信區間上界、β\betaβ的MAP估計、σ\sigmaσ的后驗均值、τ\tauτ的后驗均值、β\betaβ的chain、τ\tauτ的chain、σ\sigmaσ的chain


核心算法

我主要是想看σ\sigmaσ固定、τ\tauτ用halfcauchy的情況,所以就以此為例看看這個函數的源代碼。首先,核心算法的大框架是blocked Sampling,第一步采樣β∣λ,τ\beta|\lambda,\tauβλ,τ;第二步采樣τ∣λ,β\tau|\lambda,\betaτλ,β;第三步采樣λ∣τ,β\lambda|\tau,\betaλτ,β

λi\lambda_iλi?的初值為1/yi21/y_i^21/yi2?,這是常規的初值設置方式;τ\tauτ的初值就是函數的第三步輸入,實際上感覺這個code關于τ\tauτ的初值有一些設計,

if (method.tau != "fixed") {Tau = max(sum(abs(y) >= sqrt(2 * Sigma2 * log(n)))/n, 1/n)}Lambda = 1/abs(y)^2Tau = tau

但感覺執行之后Tau還是等于函數第三個輸入。

第一步:給定λ,τ\lambda,\tauλ,τ,因為β\betaβ作為一個normal mean,先驗又是正態分布,這正好就是共軛的情況,所以后驗也是正態分布:
βi∣y,λi,τ~N(λi2τ21+λi2τ2y,λi2τ21+λi2τ2σ2)\beta_i|y,\lambda_i,\tau \sim N(\frac{\lambda_i^2\tau^2}{1+\lambda_i^2\tau^2}y,\frac{\lambda_i^2\tau^2}{1+\lambda_i^2\tau^2}\sigma^2)βi?y,λi?,τN(1+λi2?τ2λi2?τ2?y,1+λi2?τ2λi2?τ2?σ2)

這四行代碼就是在從這個分布中采樣

a = (Tau^2) * (Lambda^2)s = sqrt(Sigma2 * a/(1 + a))m = (a/(1 + a)) * yBeta = stats::rnorm(n, m, s)

第二步:給定β,λ\beta,\lambdaβ,λ,從π(τ∣β,λ,y)\pi(\tau|\beta,\lambda,y)π(τβ,λ,y)中采樣,
τ=∣N(∑i=1nβiyi1+∑i=1nβi2,11+∑i=1nβi2)∣Gamma(n+12,1+∑i=1nβi22λi2)\tau = \frac{|N(\frac{\sum_{i=1}^n \beta_i y_i}{1+\sum_{i=1}^n \beta_i^2},\frac{1}{1+\sum_{i=1}^n \beta_i^2})|}{\sqrt{Gamma(\frac{n+1}{2},1+\sum_{i=1}^n \frac{\beta_i^2}{2\lambda_i^2})}}τ=Gamma(2n+1?,1+i=1n?2λi2?βi2??)?N(1+i=1n?βi2?i=1n?βi?yi??,1+i=1n?βi2?1?)?

第三步:給定β,τ\beta,\tauβ,τ,從π(λ∣β,τ)\pi(\lambda|\beta,\tau)π(λβ,τ)中采樣,
λi=N(βiλiyiGamma(1,1+λi22)+βi2λi2,1Gamma(1,1+λi22)+βi2λi2)\lambda_i = N(\frac{\frac{\beta_i}{\lambda_i}y_i}{Gamma(1,\frac{1+\lambda_i^2}{2})+\frac{\beta_i^2}{\lambda_i^2}},\frac{1}{Gamma(1,\frac{1+\lambda_i^2}{2})+\frac{\beta_i^2}{\lambda_i^2}})λi?=N(Gamma(1,21+λi2??)+λi2?βi2??λi?βi??yi??,Gamma(1,21+λi2??)+λi2?βi2??1?)


function (y, method.tau = c("fixed", "truncatedCauchy", "halfCauchy"), tau = 1, method.sigma = c("fixed", "Jeffreys"), Sigma2 = 1, burn = 1000, nmc = 5000, alpha = 0.05) {method.tau = match.arg(method.tau)method.sigma = match.arg(method.sigma)n <- length(y)BetaSave = matrix(0, nmc, n)TauSave = rep(0, nmc)Sigma2Save = rep(0, nmc)Lambda2 = rep(1, n)nu = rep(1, n)xi = 1Beta = yTau = tauif (method.sigma == "Jeffreys") {Sigma2 = 0.95 * stats::var(y)}if (method.tau != "fixed") {Tau = max(sum(abs(y) >= sqrt(2 * Sigma2 * log(n)))/n, 1/n)}Lambda = 1/abs(y)^2Tau = taufor (t in 1:(nmc + burn)) {if (t%%1000 == 0) {print(t)}a = (Tau^2) * (Lambda^2)s = sqrt(Sigma2 * a/(1 + a))m = (a/(1 + a)) * yBeta = stats::rnorm(n, m, s)Theta = Beta/(Lambda)if (method.tau == "halfCauchy") {G = 1/sqrt(stats::rgamma(1, (n + 1)/2, rate = (1 + sum(Theta^2))/2))Z = y/(Theta * Lambda)a = (Lambda * Theta)^2b = sum(a)s2 = 1/(1 + b)m = {s2} * sum(a * Z)Delta = stats::rnorm(1, m, sqrt(s2))Tau = abs(Delta) * G}if (method.tau == "truncatedCauchy") {tempt = sum(Beta^2/Lambda^2)/(2 * Sigma2)et = 1/Tau^2utau = stats::runif(1, 0, 1/(1 + et))ubt_1 = 1ubt_2 = min((1 - utau)/utau, n^2)Fubt_1 = stats::pgamma(ubt_1, (n + 1)/2, scale = 1/tempt)Fubt_2 = stats::pgamma(ubt_2, (n + 1)/2, scale = 1/tempt)ut = stats::runif(1, Fubt_1, Fubt_2)et = stats::qgamma(ut, (n + 1)/2, scale = 1/tempt)Tau = 1/sqrt(et)}if (method.sigma == "Jeffreys") {Sigma2 = 1/stats::rgamma(1, n, rate = sum((y - Beta)^2)/2 + sum(Beta^2/(Tau^2 * Lambda^2))/2)}Z = y/ThetaV2 = 1/stats::rgamma(n, 1, rate = (Lambda^2 + 1)/2)num1 = V2 * Theta^2den = 1 + num1s = sqrt(V2/den)m = (num1/den) * ZLambda = stats::rnorm(n, m, s)if (t > burn) {BetaSave[t - burn, ] = BetaTauSave[t - burn] = TauSigma2Save[t - burn] = Sigma2}}BetaHat = colMeans(BetaSave)BetaMedian = apply(BetaSave, 2, stats::median)TauHat = mean(TauSave)Sigma2Hat = mean(Sigma2Save)left <- floor(alpha * nmc/2)right <- ceiling((1 - alpha/2) * nmc)BetaSort <- apply(BetaSave, 2, sort, decreasing = F)left.points <- BetaSort[left, ]right.points <- BetaSort[right, ]result <- list(BetaHat = BetaHat, LeftCI = left.points, RightCI = right.points, BetaMedian = BetaMedian, Sigma2Hat = Sigma2Hat, TauHat = TauHat, BetaSamples = BetaSave, TauSamples = TauSave, Sigma2Samples = Sigma2Save)return(result) }

總結

以上是生活随笔為你收集整理的Horseshoe prior的R package介绍:HS.normal.mean函数的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。