解决此类问题的一般方法是最大化数据的(正则化)可能性。
在您的情况下,对数似然看起来像
LL(y0,a,b,σ0,c,d)=∑i=1nlogϕ(yi,y0+axi+bti,σ0+cxi+dti)
在哪里
ϕ(x,μ,σ)=12π−−√σe−(x−μ)22σ2
您可以将此表达式编码到您最喜欢的统计包中的函数中(我更喜欢 Python、R 或 Stata,因为我从未在 SPSS 中进行过编程)。然后你可以将它提供给数值优化器,它会估计最优值θ^你的参数θ=(y0,a,b,σ0,c,d).
如果你需要置信区间,这个优化器还可以估计 Hessian 矩阵H的θ(二阶导数)在最优值附近。最大似然估计理论说,对于大n的协方差矩阵θ^可以估计为H−1.
这是 Python 中的示例代码:
import scipy
import numpy as np
# generate toy data for the problem
np.random.seed(1) # fix random seed
n = 1000 # fix problem size
x = np.random.normal(size=n)
t = np.random.normal(size=n)
mean = 1 + x * 2 + t * 3
std = 4 + x * 0.5 + t * 0.6
y = np.random.normal(size=n, loc=mean, scale=std)
# create negative log likelihood
def neg_log_lik(theta):
est_mean = theta[0] + x * theta[1] + t * theta[2]
est_std = np.maximum(theta[3] + x * theta[4] + t * theta[5], 1e-10)
return -sum(scipy.stats.norm.logpdf(y, loc=est_mean, scale=est_std))
# maximize
initial = np.array([0,0,0,1,0,0])
result = scipy.optimize.minimize(neg_log_lik, initial)
# extract point estimation
param = result.x
print(param)
# extract standard error for confidence intervals
std_error = np.sqrt(np.diag(result.hess_inv))
print(std_error)
请注意,您的问题表述可能会产生负面影响σ,我不得不通过蛮力替换太小来保护自己免受它的影响σ和10−10.
代码产生的结果(参数估计及其标准误差)是:
[ 0.8724218 1.75510897 2.87661843 3.88917283 0.63696726 0.5788625 ]
[ 0.15073344 0.07351353 0.09515104 0.08086239 0.08422978 0.0853192 ]
您可以看到估计值接近其真实值,这证实了此模拟的正确性。