我正在尝试使用truncnorm.rvs从截断的正态分布中提取。截断不是标准的:我正在尝试从在右边截断为零的N(x_i^T*beta, 1/lambda_i)
进行绘制。
我使用了以下代码:
b0 = np.dot(1/lambd[np.where(y ==0)],(0-meanZ[np.where(y ==0)]))
Z[np.where(y ==0)] = truncnorm.rvs(a = -np.inf, b = 0, loc = meanZ[np.where(y ==0)], scale = 1/lambd[np.where(y ==0)])
我的两个问题是:
-我仍然会得到Z的正值
-我还得到了-np.inf值,该值与我的其余代码混淆
例如,使用b0= -2445.6
loc = [ -4.262042 -11.300968 -5.482057 -5.660079 -5.586314 3.926029
-3.998386 -7.042979 -9.910377 -1.485213 -5.607546 -3.452188
-3.808936 -3.890414 -6.015614 -4.298134 -6.732967 -7.896627
-10.468604]
和
scale = [1.416786e+01 9.202257e+01 2.927436e+00 1.769420e+01 2.318473e+00
1.053422e+03 8.480848e-01 1.023893e+00 1.837827e+00 1.849986e+01
6.647380e+00 4.088136e+01 1.860682e+00 1.490134e+01 2.811685e+00
3.485057e+00 1.108821e+00 1.344376e+01 1.463855e+00]
答案 0 :(得分:1)
由参数a
和b
设置的形状是根据标准正态分布(均值0,方差1)定义的。
您想将分布N(mu, sigma**2)
限制为负值;也就是说,您希望N(mu, sigma**2)
<0。使用正态分布的属性将其写为:
N(mu, sigma**2) = mu + sigma * N(0, 1) < 0
或
N(0, 1) < -mu/sigma
因此,您必须将b
设置为-mu/sigma
。
这是一个简短的脚本来演示:
import numpy as np
from scipy.stats import truncnorm
import matplotlib.pyplot as plt
mu = -2.0
sigma = 3.5
size = 25000
x = truncnorm.rvs(a=-np.inf, b=-mu/sigma, loc=mu, scale=sigma, size=size)
plt.hist(x, bins=100, density=True, alpha=0.6)
xx = np.linspace(x.min(), 0, 400)
yy = truncnorm.pdf(xx, a=-np.inf, b=-mu/sigma, loc=mu, scale=sigma)
plt.plot(xx, yy, 'k--', linewidth=1)
plt.grid()
plt.show()
该脚本生成此图: