用于大量观测的Python中多变量t分布的密度

时间:2016-12-07 10:19:52

标签: python r python-2.7 statistics

我试图评估13-d载体的多变量t分布的密度。使用R中mvtnorm包中的dmvt函数,我得到的结果是

[1] 1.009831e-13

当我尝试用Python自己编写函数时(感谢这篇文章中的建议: multivariate student t-distribution with python),我意识到伽马函数的值非常高(假设我有n = 7512个观测值),使我的函数超出范围。

我尝试修改算法,使用math.lgamma()和np.linalg.slogdet()函数将其转换为对数刻度,但我得到的结果是

 8.97669876e-15

这是我在python中使用的函数如下:

def dmvt(x,mu,Sigma,df,d):
    '''
    Multivariate t-student density:
    output:
        the density of the given element
    input:
        x = parameter (d dimensional numpy array or scalar)
        mu = mean (d dimensional numpy array or scalar)
        Sigma = scale matrix (dxd numpy array)
        df = degrees of freedom
        d: dimension
    '''
    Num = math.lgamma( 1. *(d+df)/2 ) - math.lgamma( 1.*df/2 )
    (sign, logdet) = np.linalg.slogdet(Sigma)
    Denom =1/2*logdet + d/2*( np.log(pi)+np.log(df) ) + 1.*( (d+df)/2 )*np.log(1 + (1./df)*np.dot(np.dot((x - mu),np.linalg.inv(Sigma)), (x - mu))) 
    d = 1. * (Num - Denom) 
    return np.exp(d)

为什么这个函数不能产生与R等价物相同的结果?

使用as x = (0,0)产生类似的结果(最多一点,死于舍入)但是x = (1,1) 1我得到了显着的差异!

1 个答案:

答案 0 :(得分:0)

我终于设法从R中的mvtnorm包中“翻译”代码,以下脚本可以在没有数字下溢的情况下工作。

    <select class="form-control input-sm" formControlName="country">                                               
    <option class="small" *ngFor="let c of countries" value="{{c.countryCode}}">{{c.countryName}}</option> 
</select>