Чертеж из усеченного нормального распределения дает неправильное стандартное отклонение в R - PullRequest
1 голос
/ 16 мая 2019

Я рисую случайные числа из усеченного нормального распределения. Усеченное нормальное распределение должно иметь среднее значение 100 и стандартное отклонение 60 после усечения в 0 слева. Я вычислил алгоритм для вычисления среднего и sd нормального распределения до усечения (mean_old и sd_old). Функция vtruncnorm дает мне (требуемая) дисперсия 60 ^ 2. Однако когда я рисую случайные величины из распределения, стандартное отклонение составляет около 96. Я не понимаю, почему SD случайных величин отличается от вычисления 60.

Я попытался увеличить количество розыгрышей - все равно результат sd около 96.

 require(truncnorm)
 mean_old = -5425.078
 sd_old = 745.7254
 val = rtruncnorm(10000, a=0,  mean = mean_old, sd = sd_old)
 sd(val)
 sqrt(vtruncnorm( a=0,  mean = mean_old, sd = sd_old))

1 Ответ

0 голосов
/ 17 мая 2019

Хорошо, я сделал быстрый тест

require(truncnorm)

val = rtruncnorm(1000000, a=7.2,  mean = 0.0, sd = 1.0)
sd(val)
sqrt(vtruncnorm( a=7.2,  mean = 0.0, sd = 1.0))

Канонический усеченный гауссов.При a = 6 они очень близки, 0,1554233 против 0,1548865 fe, в зависимости от семян и т. Д. При a = 7 они систематически различаются, 0,1358143 против 0,1428084 (значение выборки меньше, чем при вызове функции).Я проверил с реализацией Python

import numpy as np
from scipy.stats import truncnorm

a, b = 7.0, 100.0

mean, var, skew, kurt = truncnorm.stats(a, b, moments='mvsk')

print(np.sqrt(var))

r = truncnorm.rvs(a, b, size=100000)
print(np.sqrt(np.var(r)))

и вернул 0.1428083662823426, что согласуется с результатом R vtruncnorm.При вашем = 7,2 или около того результаты еще хуже.

Мораль истории - при высоких a значениях выборки из rtruncnorm есть ошибка.У Python такая же проблема.

...