이런 종류의 문제에 대한 일반적인 접근 방식은 데이터 의 (정규화 된) 가능성 을 최대화하는 것 입니다.
귀하의 경우 로그 우도는
여기서
L L ( y0, a , b , σ0, c , d) = ∑나는 = 1엔로그ϕ ( y나는, y0+ a x나는+ B의 t나는, σ0+ c x나는+ d티나는)
ϕ ( x , μ , σ) = 12 π−−√σ이자형− ( x − μ )22 σ2
이 표현식을 선호하는 통계 패키지의 함수로 코딩 할 수 있습니다 (SPSS에서 프로그래밍을 한 적이 없기 때문에 Python, R 또는 Stata를 선호합니다). 그런 다음이를 수치 최적화 프로그램에 제공하면 매개 변수 최적 값 이 추정됩니다 .θ^θ = ( y0, a , b , σ0, c , d)
신뢰 구간이 필요한 경우이 옵티마이 저는 최적의 주변에서 (2 차 도함수) 의 헤 시안 행렬 를 추정 할 수도 있습니다 . 최대 우도 추정 이론에 따르면 큰 공분산 행렬의 경우 는 로 추정 될 수 있습니다 .Hθ엔θ^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 ]
추정값이 실제 값에 가깝다는 것을 알 수 있으며이 시뮬레이션의 정확성을 확인합니다.