def test_trunc_log_density(self): mu = 0 sigma = 1 a = -1 b = 1 data = np.array([-0.5, 0, 0.5]) expected_dist = s.truncnorm(loc=mu, scale=sigma, a=a, b=b) actual_dist = TruncatedNormalDistribution(mu=mu, sigma=sigma, lower=a, upper=b) expected = expected_dist.logpdf(data) actual = actual_dist.log_density(data) assert (actual == expected).all()
def test_estimate_parameters_trunc_norm_neg_mean(self): mu = -2 sigma = 1 a = -3 b = -1 data = np.random.normal(loc=mu, scale=sigma, size=1000) data = np.array(list(filter(lambda x: x > a and x < b, data))) dist = TruncatedNormalDistribution(mu=mu, sigma=sigma, lower=a, upper=b) actual = dist.estimate_parameters(data, np.ones((data.shape))) new_mu = dist.mu new_sigma = dist.sigma assert isclose(mu, new_mu, abs_tol=0.5) assert new_sigma > 0
def test_trunc_log_density_shifted(self): mu = 3 sigma = 2 a = 0 b = 4 data = np.array([0.5, 1, 2, 3, 3.9]) expected_dist = s.truncnorm(loc=mu, scale=sigma, a=(a - mu) / sigma, b=(b - mu) / sigma) actual_dist = TruncatedNormalDistribution(mu=mu, sigma=sigma, lower=a, upper=b) expected = expected_dist.logpdf(data) actual = actual_dist.log_density(data) for i in range(len(expected)): assert isclose(actual[i], expected[i], abs_tol=1e-10)
def test_trunc_log_density_shifted_small_sig_outside_range(self): mu = 3 sigma = 0.5 a = 1 b = 4 data = np.array([-1, 0, 0.5, 5]) expected_dist = s.truncnorm(loc=mu, scale=sigma, a=(a - mu) / sigma, b=(b - mu) / sigma) actual_dist = TruncatedNormalDistribution(mu=mu, sigma=sigma, lower=a, upper=b) expected = expected_dist.logpdf(data) expected = np.where(expected == np.inf, -9999, expected) expected = np.where(expected == -np.inf, -9999, expected) actual = actual_dist.log_density(data) for i in range(len(expected)): assert isclose(actual[i], expected[i], abs_tol=1e-10)
def test_truncated_p_values_same_range(self): data1 = np.random.normal(loc=0, scale=1, size=1000) data2 = np.random.normal(loc=3, scale=1, size=1000) data1 = np.array(list(filter(lambda x: x > 0 and x < 4, data1))) data2 = np.array(list(filter(lambda x: x > 0 and x < 4, data2))) dist1 = TruncatedNormalDistribution(mu=0.5, sigma=1, lower=0, upper=4) dist2 = TruncatedNormalDistribution(mu=1.5, sigma=1, lower=0, upper=4) data = np.concatenate((data1, data2)) dist_list = [dist1, dist2] mixture = Data_Rep(data, dist_list) dist_weight = len(data2) / len(data) expected = [1.0, dist_weight, 0.0] observed = [] for i in [-1, 1.5, 5]: observed.append(mixture.get_p_value(i)) for i in range(len(expected)): assert isclose(expected[i], observed[i], abs_tol=0.05)
def generate_data(x): # Censored 1 # predata1 = np.random.normal(loc=-1, scale=1, size=100000) # censored_data_1 = np.where(predata1 <= -2, -2, predata1) # censored_data_1 = np.where(censored_data_1 >= 3, 3, censored_data_1) # censored_dist_1 = CensoredNormalDistribution(mu=1.0, sigma=1, lower=-2, upper=3) # censored_dist_1_rand = CensoredNormalDistribution(mu=-1, sigma=1, lower=-2, upper=3) # Censored 2 # predata2 = np.random.normal(loc=3, scale=1, size=1000) # censored_data_2 = np.where(predata2 <= -3, -3, predata2) # censored_data_2 = np.where(censored_data_2 >= 4, 4, censored_data_2) # censored_dist_2 = CensoredNormalDistribution(mu=1.5, sigma=1, lower=-3, upper=4) # Censored 2 over same range as Censored 1 # predata2 = np.random.normal(loc=2, scale=1, size=100000) # censored_data_2 = np.where(predata2 <= -2, -2, predata2) # censored_data_2 = np.where(censored_data_2 >= 3, 3, censored_data_2) # censored_dist_2_rand = CensoredNormalDistribution(mu=2, sigma=1, lower=-2, upper=3) # Truncated 1 predata3 = np.random.normal(loc=1, scale=1, size=100000) truncated_data_1 = np.array( list(filter(lambda x: x > 0 and x < 6, predata3))) truncated_dist_1_rand = TruncatedNormalDistribution(mu=0.5, sigma=1, lower=0, upper=6) # Truncated 2 # predata4 = np.random.normal(loc=5, scale=1, size=146500) # truncated_data_2 = np.array(list(filter(lambda x: x > 4 and x < 6, predata4))) # truncated_dist_2_rand = TruncatedNormalDistribution(mu=3, sigma=1.004, lower=4, upper=6) # Truncated 2 over same range as Truncated 1 predata4 = np.random.normal(loc=5, scale=1, size=146500) truncated_data_2 = np.array( list(filter(lambda x: x > 0 and x < 6, predata4))) truncated_dist_2_rand = TruncatedNormalDistribution(mu=1.8, sigma=1, lower=0, upper=6) # Normal 1 # normal_data_1 = np.random.normal(loc=-1, scale=1, size=100000) # normal_dist_1 = mixem.distribution.NormalDistribution(mu=0.5, sigma=1) # normal_dist_1_rand = mixem.distribution.NormalDistribution(mu=-3, sigma=3) # Normal 2 # normal_data_2 = np.random.normal(loc=3, scale=2, size=100000) # normal_dist_2 = mixem.distribution.NormalDistribution(mu=3.434, sigma=1.964) # normal_dist_2_rand = mixem.distribution.NormalDistribution(mu=1, sigma=0.5) # trunced_normal = np.array(list(filter(lambda x: x > 0 and x < 2, normal_data_2))) # trunced_normal_dist = TruncatedNormalDistribution(mu=3, sigma=2, lower=0, upper=2) mixture, joint_pdf, data = organize_data(x, truncated_data_1, truncated_data_2, truncated_dist_1_rand, truncated_dist_2_rand) return mixture, joint_pdf, data