gpt4 book ai didi

r - 高斯和 Gamma 分布的混合

转载 作者:行者123 更新时间:2023-12-04 19:10:06 25 4
gpt4 key购买 nike

我正在 R 中寻找一些脚本/包(Python 也会这样做),以从高斯和 Gamma 分布的混合中找出组件分布参数。我到目前为止使用过
R 包“mixtools”将数据建模为高斯混合,但我认为它可以通过 Gamma 加高斯更好地建模。

谢谢

最佳答案

这是一种可能性:

定义效用函数:

rnormgammamix <- function(n,shape,rate,mean,sd,prob) {
ifelse(runif(n)<prob,
rgamma(n,shape,rate),
rnorm(n,mean,sd))
}

(这可以提高一点效率......)
dnormgammamix <- function(x,shape,rate,mean,sd,prob,log=FALSE) {
r <- prob*dgamma(x,shape,rate)+(1-prob)*dnorm(x,mean,sd)
if (log) log(r) else r
}

生成假数据:
set.seed(101)
r <- rnormgammamix(1000,1.5,2,3,2,0.5)
d <- data.frame(r)

方法#1: bbmle包裹。拟合形状、速率、对数标度上的标准偏差,logit 标度上的概率。
library("bbmle")
m1 <- mle2(r~dnormgammamix(exp(logshape),exp(lograte),mean,exp(logsd),
plogis(logitprob)),
data=d,
start=list(logshape=0,lograte=0,mean=0,logsd=0,logitprob=0))
cc <- coef(m1)

png("normgam.png")
par(bty="l",las=1)
hist(r,breaks=100,col="gray",freq=FALSE)
rvec <- seq(-2,8,length=101)
pred <- with(as.list(cc),
dnormgammamix(rvec,exp(logshape),exp(lograte),mean,
exp(logsd),plogis(logitprob)))
lines(rvec,pred,col=2,lwd=2)
true <- dnormgammamix(rvec,1.5,2,3,2,0.5)
lines(rvec,true,col=4,lwd=2)
dev.off()

enter image description here
tcc <- with(as.list(cc),
c(shape=exp(logshape),
rate=exp(lograte),
mean=mean,
sd=exp(logsd),
prob=plogis(logitprob)))
cbind(tcc,c(1.5,2,3,2,0.5))

拟合是合理的,但参数相差很远——我认为这个模型在这个参数范围内不是很容易识别(即 Gamma 和 gaussian 分量可以交换)
library("MASS")
ff <- fitdistr(r,dnormgammamix,
start=list(shape=1,rate=1,mean=0,sd=1,prob=0.5))

cbind(tcc,ff$estimate,c(1.5,2,3,2,0.5))
fitdistr得到与 mle2 相同的结果,这表明我们是
在局部最小值。如果我们从真正的参数开始,我们会得到
合理且接近真实参数。
ff2 <- fitdistr(r,dnormgammamix,
start=list(shape=1.5,rate=2,mean=3,sd=2,prob=0.5))
-logLik(ff2) ## 1725.994
-logLik(ff) ## 1755.458

关于r - 高斯和 Gamma 分布的混合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15823320/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com