Matlab 如何使贝塔分布适合具有给定平均值的数据?

Matlab 如何使贝塔分布适合具有给定平均值的数据?,matlab,beta-distribution,Matlab,Beta Distribution,我正在使用MATLAB将beta分布拟合到我的数据中 为此,有几个选项,如fitdist,它们提供一组a和b,可以使用betastat或简单的mean和std命令访问统计数据(平均值和标准值) 但是如果我希望我的分布有一个给定的平均值,并且只有性病是未知的,我该怎么办呢 有一个例子。我有一个可变的仓位大小半直方图,定义了中心比率,其概率如下: central_ratios = [.005 .1 .4 .8 1]; probabilities = [.5 .3 .1 .08 .02];

我正在使用MATLAB将beta分布拟合到我的数据中

为此,有几个选项,如
fitdist
,它们提供一组
a
b
,可以使用
betastat
或简单的
mean
std
命令访问统计数据(平均值和标准值)

但是如果我希望我的分布有一个给定的平均值,并且只有性病是未知的,我该怎么办呢

有一个例子。我有一个可变的仓位大小半直方图,定义了中心比率,其概率如下:

central_ratios = [.005 .1 .4 .8   1]; 
probabilities  = [.5   .3 .1 .08 .02];
vul = sum(central_ratios.*probabilities);

现在我想对数据拟合一个“beta分布”,在[0,1]之间,平均值等于
vul
。我现在只需要最好的
std
a
b
对。

fitdist
对于beta分布,从
betafit
获取分布参数,它为给定数据的分布设置适当的似然函数,对
a
b
进行一些启发式初始猜测,然后使用
fminsearch
优化
log(a)
log(b)
以最大化可能性

定义分布平均值的约束在
a
b
之间建立了强制关系。平均值
mu
a
b
相关,因此:

mu = 1 / (1 + b/a)
可以对其进行重新排列,以给出一个分布参数,另一个分布参数:

b = a * (1/mu - 1)
要检查MATLAB中可用的beta分布拟合的无约束实现,以及您正在寻求的约束,您可以使用以下方法查看
betafit
源代码:

edit betafit
至少在MATLAB R2018b中,您会发现,
log(a)
log(b)
的优化发生在以下位置:

phat = fminsearch(negloglike,pstart,opts);
phat = exp(phat);
您的约束分布拟合问题可以用此处使用的优化目标函数来描述,它可以让您重用
betafit
行为的其他方面:

negloglike1 = @(loga) negloglike([loga log(exp(loga) * (1/mu - 1))]);
您可以创建自己的
betafit
副本,在调用
fminsearch
之前进行此声明,也可以在调用该行后在断点上停止内置的
betafit
,并从命令行声明新的似然函数。无论哪种方式,您都可以使用约束参数替换参数,以最大限度地提高该约束内的可能性:

loga = fminsearch(negloglike1,pstart(1),opts);
phat = exp(loga) * [1 (1/mu - 1)];

由此产生的贝塔分布参数
phat
将保证产生均值
mu
的分布,并在给定此约束的情况下局部最大化数据的似然函数。

fitdist
贝塔分布从
betafit
获取分布参数,它为给定数据的分布设置适当的似然函数,对
a
b
进行一些启发式初始猜测,然后使用
fminsearch
优化
log(a)
log(b)
以最大化似然

定义分布平均值的约束在
a
b
之间建立了强制关系。平均值
mu
a
b
相关,因此:

mu = 1 / (1 + b/a)
可以对其进行重新排列,以给出一个分布参数,另一个分布参数:

b = a * (1/mu - 1)
要检查MATLAB中可用的beta分布拟合的无约束实现,以及您正在寻求的约束,您可以使用以下方法查看
betafit
源代码:

edit betafit
至少在MATLAB R2018b中,您会发现,
log(a)
log(b)
的优化发生在以下位置:

phat = fminsearch(negloglike,pstart,opts);
phat = exp(phat);
您的约束分布拟合问题可以用此处使用的优化目标函数来描述,它可以让您重用
betafit
行为的其他方面:

negloglike1 = @(loga) negloglike([loga log(exp(loga) * (1/mu - 1))]);
您可以创建自己的
betafit
副本,在调用
fminsearch
之前进行此声明,也可以在调用该行后在断点上停止内置的
betafit
,并从命令行声明新的似然函数。无论哪种方式,您都可以使用约束参数替换参数,以最大限度地提高该约束内的可能性:

loga = fminsearch(negloglike1,pstart(1),opts);
phat = exp(loga) * [1 (1/mu - 1)];

由此产生的贝塔分布参数
phat
将保证产生均值
mu
的分布,并在给定此约束的情况下局部最大化数据的似然函数。

谢谢,但步骤不清楚。。我相信是“negloglik”。如果你能用一个完整的执行样本编辑答案,我将不胜感激。我已经试着澄清一下答案
negloglike
是在
betafit
中内部使用的一个函数句柄,您可以按说明检查它。这与
negloglik
不同,后者是一种分布对象的方法,不在内部用于
betafit
。或者,您可以创建一个目标函数,使用试用参数调用
makedist
,然后调用
negloglik
,但在
makedist
中每次迭代都会产生大量开销。如果您希望答案包含完整的执行示例,您的问题需要一个完整的执行示例作为参考。谢谢,但步骤不清楚。。我相信是“negloglik”。如果你能用一个完整的执行样本编辑答案,我将不胜感激。我已经试着澄清一下答案
negloglike
是在
betafit
中内部使用的一个函数句柄,您可以按说明检查它。这与
negloglik
不同,后者是一种分布对象的方法,不在内部用于
betafit
。或者,您也可以使用试验参数和t调用目标函数
makedist