0

我想从数据中估计一个简单线性函数的参数和一个伽马分布的噪声项。(注意:这是https://stats.stackexchange.com/questions/88676/regression-with-unidirectional-noise的后续问题,但经过简化且更具体化)。假设我的观察数据生成如下:

import numpy as np
np.random.seed(0)

size = 200
true_intercept = 1
true_slope = 2

# Generate observed data
x_ = np.linspace(0, 1, size)
true_regression_line = true_intercept + true_slope * x_  # y = a + b*x
noise_ = np.random.gamma(shape=1.0, scale=1.0, size=size)
y_ = true_regression_line + noise_

如下所示: 在此处输入图像描述

我尝试使用 pymc 估计这些参数,如下所示:

from pymc import Normal, Gamma, Uniform, Model, MAP
# Define priors
intercept = Normal('intercept', 0, tau=0.1)
slope = Normal('slope', 0, tau=0.1)
alpha = Uniform('alpha', 0, 2)
beta = Uniform('beta', 0, 2)
noise = Gamma('noise', alpha=alpha, beta=beta, size=size)

# Give likelihood > 0 to models where the regression line becomes larger than
# any of the datapoint
y = Normal('y', mu=intercept + slope * x_ + noise, tau=100,
           observed=True, value=y_)

# Perform MAP fit of model
model = Model([alpha, beta, intercept, slope, noise])
map_ = MAP(model)
map_.fit()

但是,这给了我与真实值相去甚远的估计:

  • 拦截:真:1.000,估计:3.281
  • 斜率:真实:2.000,估计:-3.400

我做错了什么吗?

4

1 回答 1

0

您似乎指定了正态似然以及 Gamma 噪声,因此您在模型中添加了额外的高斯噪声,这似乎没有必要。尝试将可能性表示为 Gamma,而不是 Normal,因为这是残差的分布。

于 2014-03-05T21:49:03.520 回答