拟合两个高斯的混合

机器算法验证 r 正态分布 分位数 混合分布 高斯混合分布
2022-03-25 13:50:48

我想将两种高斯密度的混合物拟合到我的财务数据中。数据可以在这里找到:http: //uploadeasy.net/upload/2a7mw.rar这个变量叫做dat。

混合的概率密度由下式给出:

f(l)=πϕ(l;μ1,σ12)+(1π)ϕ(l;μ2,σ22)

分位数可以通过使用数值算法解决以下问题来计算: 我在 R 中使用 mixtools:

α=P(LVaRα)=πF1(Quantileα;μ1,σ12)+(1π)F2(Quantileα;μ2,σ22)

install.packages("mixtools")
library(mixtools)
mixture<-normalmixEM(dat,k=2,fast=TRUE)

这使用了 EM 算法。

我现在想计算混合分布的 0,95 分位数。我做了一个循环,一种网格搜索,我假设分位数(由于我的数据的特性)将低于 0.3。所以循环在 0.3 结束

pi<-mixture$lambda[1]
mu1<-mixture$mu[1]
mu2<-mixture$mu[2]
sigma1<-mixture$sigma[1]
sigma2<-mixture$sigma[2]

quantile<-0
probabilitylevel<-0.95
dummy1<-0

# the loop lasts for about 20-40 seconds
for (i in 1:100000){
quantile[i]<-i/(1000000/3)
}
dummy1<- probabilitylevel - ( pi * pnorm(quantile,mean=mu1,sd=sigma1) + (1-pi) * pnorm(quantile,mean=mu2,sd=sigma2))

min(abs(dummy1))
which.min(abs(dummy1))
quantileresult<-which.min(abs(dummy1))/(1000000/3)

结果

quantileresult

0.025371

这似乎是正确的,如果控制它:

pi * pnorm(quantileresult,mean=mu1,sd=sigma1) + (1-pi) * pnorm(quantileresult,mean=mu2,sd=sigma2)

我看剧情:

plot(density(dat),col="red")
curve(expr=pi*dnorm(x,mu1,sigma1)+(1-pi)*dnorm(x,mu2,sigma2),lwd=2,col="black",add=TRUE)
curve(dnorm(x,mean(dat),sd(dat)),add=TRUE,lty=3,col="orange",lwd=2)

这使

分位数正确

看起来,混合法线(黑色)更适合数据。橙色虚线是拟合数据集的单变量正态分布。它拟合数据不如混合密度好,这是正确的解释吗?

最后,我们查看单一密度并将其与混合物进行比较:

plot(density(dat),col="red")
curve(dnorm(x,mu1,sigma1),add=TRUE,lty=2,col="darkgreen")
curve(dnorm(x,mu2,sigma2),add=TRUE,lty=2,col="blue")
curve(expr=pi*dnorm(x,mu1,sigma1)+(1-pi)*dnorm(x,mu2,sigma2),lwd=2,col="black",add=TRUE)

这给出了以下情节:

密度比较

第一个密度具有较高的峰值,第二个密度向左移动并具有较低的峰值,较高的方差。

我的计算和解释正确吗?

1个回答

就这样这个线程得到了答案(因为我们无法再访问您的数据,我认为不会有更多的答案发生):您正在做的事情似乎非常好。

KScorrect::qmixnorm()您可以根据Compute quantile function from a mix of Normal distribution更改对要使用的混合分位数的搜索