mirror of
				https://github.com/KevinMidboe/linguist.git
				synced 2025-10-29 17:50:22 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			39 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			39 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
nldge::ParticleLogLikeli()
 | 
						|
{	decl it, ip,
 | 
						|
		 mss, mbas, ms, my, mx, vw, vwi, dws,
 | 
						|
		 mhi, mhdet, loglikeli, mData,
 | 
						|
		 vxm, vxs, mxm=<>, mxsu=<>, mxsl=<>,
 | 
						|
		 time, timeall, timeran=0, timelik=0, timefun=0, timeint=0, timeres=0;
 | 
						|
 | 
						|
	mData = GetData(m_asY);
 | 
						|
	mhdet = sqrt((2*M_PI)^m_cY * determinant(m_mMSbE.^2));		// covariance determinant
 | 
						|
	mhi   = invert(m_mMSbE.^2);					// invert covariance of measurement shocks
 | 
						|
 | 
						|
	ms 	  = m_vSss + zeros(m_cPar, m_cS);			// start particles
 | 
						|
	mx 	  = m_vXss + zeros(m_cPar, m_cX);			// steady state of state and policy
 | 
						|
 | 
						|
	loglikeli = 0;							// init likelihood
 | 
						|
																								//timeall=timer();
 | 
						|
	for(it = 0; it < sizer(mData); it++)
 | 
						|
	{
 | 
						|
		mss = rann(m_cPar, m_cSS) * m_mSSbE;			// state noise
 | 
						|
		fg(&ms, ms, mx, mss);					// transition prior as proposal
 | 
						|
		mx = m_oApprox.FastInterpolate(ms); 			// interpolate
 | 
						|
		fy(&my, ms, mx, zeros(m_cPar, m_cMS));			// evaluate importance weights
 | 
						|
		my -= mData[it][];					// observation error
 | 
						|
 | 
						|
		vw = exp(-0.5 * outer(my,mhi,'d')' )/mhdet;		// vw = exp(-0.5 * sumr(my*mhi .*my ) )/mhdet;
 | 
						|
 | 
						|
		vw = vw .== .NaN .? 0 .: vw;				// no policy can happen for extrem particles
 | 
						|
		dws = sumc(vw);
 | 
						|
		if(dws==0) return -.Inf;				// or extremely wrong parameters
 | 
						|
		loglikeli += log(dws/m_cPar)	;			// loglikelihood contribution
 | 
						|
																										//timelik += (timer()-time)/100;
 | 
						|
																										//time=timer();
 | 
						|
		vwi = resample(vw/dws)-1;				// selection step in c++
 | 
						|
		ms = ms[vwi][];						// on normalized weights
 | 
						|
		mx = mx[vwi][];
 | 
						|
																	}
 | 
						|
	return loglikeli;
 | 
						|
}
 |