Ничья из усеченного нормального - PullRequest
0 голосов
/ 24 декабря 2018

Я пытаюсь извлечь из усеченного нормального дистрибутива, используя 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]

1 Ответ

0 голосов
/ 24 декабря 2018

Форма, установленная параметрами a и b, определяется относительно нормального распределения (среднее значение 0, дисперсия 1).

Требуетсяограничить распределение N(mu, sigma**2) отрицательными значениями;то есть вы хотите N(mu, sigma**2) <0. Используйте свойства нормального распределения, чтобы записать это как: </p>

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()

Сценарий генерирует этот график:

plot

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...