模拟均值= 1和方差= 0.4

时间:2019-04-26 16:59:55

标签: matlab random gamma-distribution

假设X〜Γ(α,β),我想截断X的所有值

MATLAB代码:

t = 0.5;  theta = 0.4; 
syms alpha beta 
EX = beta*( igamma(alpha+1,t/beta) /  igamma(alpha,t/beta) ); %Mean  
EX2 = beta^2*( igamma(alpha+2,t/beta) /  igamma(alpha,t/beta) );%Second moment         
VarX = EX2 -EX^2; %Variance       
cond1 = alpha > 0; cond2 = beta > 0; cond3 = EX==1; cond4 = VarX ==theta;
conds =[cond1 cond2 cond3 cond4]; vars = [alpha, beta];
sol = solve(conds, [alpha beta], 'ReturnConditions',true);
soln_alpha = vpa(sol.alpha)
soln_beta = vpa(sol.beta)

仅当放宽α> 0的约束时,以上代码才返回数字答案。数字答案的负值为α,这是错误的,因为α(形状参数)和β(比例参数)必须严格为正。

1 个答案:

答案 0 :(得分:1)

根据您的标题,我认为您希望根据平均值为1且方差为0.4的 Gamma分布生成样本,但希望该分布被截断为 [0,inf] < / strong>。

如果 X 〜Gamma( alpha beta ),则根据定义,它必须为非负数(请参阅Gamma分布wikiMATLAB page)。实际上,形状和比例参数也是非负的。注意:MATLAB使用wiki page上的( k theta )参数化。

MATLAB实现了probability distribution objects,从从业者(或使用数值方法的任何人)的角度来看,它们使很多事情变得非常方便。

alpha = 0.4;
beta = 0.5;
pd = makedist('Gamma',alpha,beta)   % Define the distribution object    

生成样本现在非常简单。

n = 1000;                           % Number of samples
X = random(pd,n,1);                 % Random samples of X ~ Gamma(alpha,beta) 

剩下的就是确定形状和比例参数,以使E [ X ] = 1且Var( X )= 0.4。

您需要解决

  

alpha * beta = E [ X ],
   alpha *( beta ^ 2)= Var( X ),

用于 alpha beta 。它是由两个带有两个未知数的非线性方程组组成的系统。

但是,截断使这些方法过时了,但数值方法会很好用。

LB = 0.5;                           % lower bound    (X > LB)
UB = inf;                           % upper bound    (X < UB)
pdt = truncate(pd,LB,UB)            % Define truncated distribution object
Xt = random(pd,n,1); 
  

pdt =
   GammaDistribution

     

伽玛分布
     a = 0.4
     b = 0.5
   截断到[0.5,Inf]

幸运的是,无论对象是否被截断,均可以访问其均值和方差。

mean(pdt)     % compare to mean(pd)
var(pdt)      % compare to var(pd)

您可以通过数值方式解决此问题,以使用诸如fmincon之类的参数来获取参数。

tgtmean = 1;
tgtvar = 0.4;
fh_mean =@(p) mean(truncate(makedist('Gamma',p(1),p(2)),LB,UB));
fh_var =@(p) var(truncate(makedist('Gamma',p(1),p(2)),LB,UB));
fh =@(p) (fh_mean(p)-tgtmean).^2 + (fh_var(p)-tgtvar).^2;
[p, fval] = fmincon(fh,[alpha;beta],[],[],[],[],0,inf)

您可以测试验证的答案:

pd_test = truncate(makedist('Gamma',p(1),p(2)),LB,UB);
mean(pd_test)
var(pd_test)
  

ans = 1.0377
  ans = 0.3758

请注意,由于所需的截断和目标均值,这似乎是病态。这可能已经足够好了,具体取决于您的应用程序。

histogram(random(pd_test,n,1))   % Visually inspect distribution

Histogram of Gamma dist truncated to [0.5, inf]

在基本分布(此处为Gamma分布)下,均值和方差组合必须是可行的,但是如果被截断,则进一步限制了可行参数的集合。例如,不可能将 X 〜Gamma()截断为区间[5,500]并试图获得2或600的平均值。


MATLAB代码已通过R2017a版本验证。

还要注意,诸如fmincon之类的非线性求解器的求解可能对某些问题的初始起点很敏感。如果该数字方法引起问题,则可能是可行性问题(如上所述),或者可能需要使用多个起点和多个fmincon调用才能获得多个答案,然后使用最佳答案。