Dear Stan users:
I am currently fitting a single component and a 2-component Gaussian model to a real data set and using WAIC to select the preferred model.
I simulated a 2-component Gaussian model (having the data structure exactly like my real data to be modelled) and fit both correct 2-component and incorrect 1-component model using a customised-constructed loglikelihood function and my model is able to pick 2-component as having a low WAIC value and also both models converged (no divergent warnings, Rhat=1).
However, when I fit my model to the real data set ( which is suspected to have 2 components), I cannot get my model converged not matter how long I ran.
Actually, my customised likelihood function model is only to fit on group-level summary statistics of the data set (using 5-order summary stats) rather than all of the underlying data points and to verify I also just fit the same model using all of my classical observations and I can get a nice result and WAIC (for fitting all of the classical data points rather than just use 5-order statistics) also picked the 2-component model to be superior than the 1-component model.
I do not understand why is this the case. Can anyone please provide some suggestions as how I can figure out where it goes wrong? ( in the sense that why it works for the simulated data but it does not work for the real data and I cannot get the model fitted on the real data to converge)
Please share your Stan program and accompanying data if possible.
Below is my model code for the customised-constructed likelihood function where it uses only 5-order summary statics for a 3-hour block rather than using all observations within this 3-hour block
//For QUT data with 3-hour block interacting with day of the week and day of the year effects
//Fitting with the whole 17+24 days of data
functions{
int r_in(int pos,int[] pos_var) {
int pos_match;
int all_matches[size(pos_var)];
for (p in 1:(size(pos_var))) {
all_matches[p] = (pos_var[p]==pos);
}
if(sum(all_matches)>0) {
pos_match = 1;
return pos_match;
} else {
pos_match = 0;
return pos_match;
}
}
real varying_lpdf(real [] y, int N, int[] kk, int[] index1, int[] index2, int[] index_11, int[] index_12, int[] index_18, int[] index_25, int[] index_26, int[] hour_index, int Ncol, int Ncol_complete,
int index_length, matrix ordered_effects_gen, real sigma, vector lambda_gen){
vector[N] cdf;
vector[N] sum_pdf;
vector[index_length] diff;
vector[Ncol] log_prob;
vector[Ncol] col_sum_pdf;
log_prob=rep_vector( 0, Ncol);
col_sum_pdf = rep_vector(0, Ncol);
for(n in 1:N){
cdf[n] = (1-lambda_gen[kk[n]]) * normal_cdf(y[n], ordered_effects_gen[kk[n],1], sigma) +lambda_gen[kk[n]] *normal_cdf(y[n],ordered_effects_gen[kk[n],2], sigma) ;
sum_pdf[n] = log_mix((1-lambda_gen[kk[n]]), normal_lpdf(y[n]| ordered_effects_gen[kk[n],1], sigma), normal_lpdf(y[n]| ordered_effects_gen[kk[n],2], sigma));
}
for(n in 1:index_length){
diff[n] = (cdf[index2[n]] - cdf[index1[n]]);
}
for(n in 1:Ncol_complete){
col_sum_pdf[hour_index[n]] = sum_pdf[5*n-4] + sum_pdf[5*n-3] +sum_pdf[5*n-1] +sum_pdf[5*n-1]+sum_pdf[5*n];
//for 3-hour blocks where there are 18 obs
if(r_in(hour_index[n], index_18)){
log_prob[hour_index[n]] = 5 * log( diff[4*n-3] ) + 2*log(diff[4*n-2]) + log(diff[4*n-1]) + 5* log(diff[4*n]);
}
if(r_in(hour_index[n], index_25)){
log_prob[hour_index[n]] = 5 * log( diff[4*n-3] ) + 5*log(diff[4*n-2]) + 5* log(diff[4*n-1]) + 5* log(diff[4*n]);
}
if(r_in(hour_index[n], index_26)){
log_prob[hour_index[n]] = 5 * log( diff[4*n-3] ) + 2*log(diff[4*n-2]) + log(diff[4*n-1]) + 6* log(diff[4*n]);
}
if(r_in(hour_index[n], index_11)){
log_prob[hour_index[n]] = 2* log( diff[4*n-3] ) + 2*log(diff[4*n-2]) + log(diff[4*n-1]) + log(diff[4*n]);
}
if(r_in(hour_index[n], index_12)){
log_prob[hour_index[n]] = 2 * log( diff[4*n-3] ) + 2*log(diff[4*n-2]) + log(diff[4*n-1]) + 2* log(diff[4*n]);
}
}
return(sum(log_prob)+sum(col_sum_pdf));
}
vector log_lik_vec_gen( int Ncol, int Ncol_complete, int[] index_11, int[] index_12, int[] index_18, int[] index_25, int[] index_26, int[] hour_index, vector diff_gen, vector sum_pdf_gen ){
vector[Ncol] logg_prob1;
vector[Ncol] col_sum_pdf_gen;
logg_prob1=rep_vector( 0, Ncol);
col_sum_pdf_gen = rep_vector( 0, Ncol);
for(n in 1:Ncol_complete){
col_sum_pdf_gen[hour_index[n]] = sum_pdf_gen[5*n-4] + sum_pdf_gen[5*n-3] +sum_pdf_gen[5*n-1] +sum_pdf_gen[5*n-1]+sum_pdf_gen[5*n];
if(r_in(hour_index[n], index_18)){
logg_prob1[hour_index[n]] = 5 * log( diff_gen[4*n-3] ) + 2*log(diff_gen[4*n-2]) + log(diff_gen[4*n-1]) + 5* log(diff_gen[4*n]);
}
if(r_in(hour_index[n], index_25)){
logg_prob1[hour_index[n]] = 5 * log( diff_gen[4*n-3] ) + 5*log(diff_gen[4*n-2]) + 5* log(diff_gen[4*n-1]) + 5* log(diff_gen[4*n]);
}
if(r_in(hour_index[n], index_26)){
logg_prob1[hour_index[n]] = 5 * log( diff_gen[4*n-3] ) + 2*log(diff_gen[4*n-2]) + log(diff_gen[4*n-1]) + 6* log(diff_gen[4*n]);
}
if(r_in(hour_index[n], index_11)){
logg_prob1[hour_index[n]] = 2* log( diff_gen[4*n-3] ) + 2*log(diff_gen[4*n-2]) + log(diff_gen[4*n-1]) + log(diff_gen[4*n]);
}
if(r_in(hour_index[n], index_12)){
logg_prob1[hour_index[n]] = 2 * log( diff_gen[4*n-3] ) + 2*log(diff_gen[4*n-2]) + log(diff_gen[4*n-1]) + 2* log(diff_gen[4*n]);
}
}
return(logg_prob1+col_sum_pdf_gen);
}
}
data {
int<lower=1> N; //==1660 fully observed observations
int<lower=1> Ncol; //==352 total 3-hour blocks to be estimated
int<lower=1> Ncol_complete; //332 completely observed 3-hour blocks
int<lower=1> index_length; //1328
int<lower=1, upper=352> kk[N];//row index for fully observed observations
real<lower=0> y[N];
int<lower=0> index1[index_length];
int<lower=0> index2[index_length];
int<lower=0> index_11[1];
int<lower=0> index_12[1];
int<lower=0> index_18[143];
int<lower=0> index_25[56];
int<lower=0> index_26[131];
int<lower=0> hour_index[Ncol_complete];
int<lower=1> D;// indicating number of days fitted
int<lower=1> K;// indicating hour of weeks 56
matrix[K, K] K_TD; //penalty prior precision matrix for hour of the week coefficients
int num_basis;
matrix[D, num_basis] B_annual;
matrix[K, (num_basis-1)] eta_bspline;
}
parameters {
vector[num_basis] beta_annual_raw;//bspline coefficients for annual effects
real<lower=0> sigma;
vector[(num_basis-1)] beta_eta_raw;
real mu_beta_eta;
real<lower=0> sigma_beta_eta;
//real<lower=0> tau;//RW penalty scale for beta_eta
ordered[2] beta[K];// ordered hour of week effects: a matrix of 56 * 2 where 2nd col
//is greater than 1st col for all rows.
}
transformed parameters {
vector[(num_basis-1)] beta_eta;
vector[2] alpha;//intercept of hour of week
matrix[K,2] beta_adj;//sum to zero hour of week component mean
vector[num_basis] beta_annual;//coefficients for annual effects
beta_annual = beta_annual_raw*sigma;
beta_eta = mu_beta_eta + sigma_beta_eta * beta_eta_raw;
//beta_eta[1] =beta_eta_raw[1];
//for(i in 2:(num_basis-1)){
//beta_eta[i] = beta_eta[i-1] + beta_eta_raw[i] * tau;
//}
alpha[1] = mean(beta[,1]);
alpha[2] = mean(beta[,2]);
for(t in 1:K){
beta_adj[t,1] = beta[t,1] - alpha[1];
beta_adj[t,2] = beta[t,2] - alpha[2];
}
beta_annual = beta_annual_raw* sigma;
}
model{
vector[Ncol] annual_effects_gen;
matrix[Ncol,2] ordered_effects_gen;
vector[K] lambda;
vector[Ncol] lambda_gen;
beta_annual_raw~ normal(0, 1);//prior for the slopes following Gelman 2008
sigma ~cauchy(0,2.5);
beta_eta_raw~std_normal();
sigma_beta_eta~std_normal();
mu_beta_eta~std_normal();
lambda = inv_logit(eta_bspline* beta_eta);
for( t in 1:6){
lambda_gen[(1+(t-1)*56): (56*t) ] = lambda;
}
for(t in 337: Ncol){
lambda_gen[t] = lambda[t-(K*6)];
}
for(t in 1:D){
annual_effects_gen[(1+(t-1)*8) : (8*t)] = rep_vector( (B_annual * beta_annual)[t], 8);
}
//44-day there are whole 6 weeks plus 2 days (16 3-hour blocks)
//week 1-6
for (t in 1:Ncol){
if(t <=K){
ordered_effects_gen[t,1] = alpha[1] + beta_adj[t,1] + annual_effects_gen[t];
ordered_effects_gen[t,2] = alpha[2] + beta_adj[t,2] + annual_effects_gen[t];
}
if(t >=(K+1) && t<= (K*2))
{
ordered_effects_gen[t,1] = alpha[1] + beta_adj[t-K,1] + annual_effects_gen[t];
ordered_effects_gen[t,2] = alpha[2] + beta_adj[t-K,2] + annual_effects_gen[t];
}
if(t >=(2*K+1) && t<= (K*3))
{
ordered_effects_gen[t,1] = alpha[1] + beta_adj[t-(2*K),1] + annual_effects_gen[t];
ordered_effects_gen[t,2] = alpha[2] + beta_adj[t-(2*K),2] + annual_effects_gen[t];
}
if(t >=(3*K+1) && t<= (K*4))
{
ordered_effects_gen[t,1] = alpha[1] + beta_adj[t-(3*K),1] + annual_effects_gen[t];
ordered_effects_gen[t,2] = alpha[2] + beta_adj[t-(3*K),2] + annual_effects_gen[t];
}
if(t >=(4*K+1) && t<= (K*5))
{
ordered_effects_gen[t,1] = alpha[1] + beta_adj[t-(4*K),1] + annual_effects_gen[t];
ordered_effects_gen[t,2] = alpha[2] + beta_adj[t-(4*K),2] + annual_effects_gen[t];
}
if(t >=(5*K+1) && t<= (K*6))
{
ordered_effects_gen[t,1] = alpha[1] + beta_adj[t-(5*K),1] + annual_effects_gen[t];
ordered_effects_gen[t,2] = alpha[2] + beta_adj[t-(5*K),2] + annual_effects_gen[t];
}
}
//remaining 16 of 3-hour blocks
for(t in 337:Ncol){
ordered_effects_gen[t,1] = alpha[1] + beta_adj[t-(K*6),1] + annual_effects_gen[t];
ordered_effects_gen[t,2] = alpha[2] + beta_adj[t-(K*6),2] + annual_effects_gen[t];
}
target += multi_normal_prec_lpdf (beta_adj[,1]| rep_vector(0, K),( 1/square(sigma) * K_TD));
target += multi_normal_prec_lpdf (beta_adj[,2]| rep_vector(0, K),( 1/square(sigma) * K_TD));
//likelihood
target += varying_lpdf( y| N, kk, index1, index2, index_11, index_12, index_18, index_25, index_26, hour_index, Ncol, Ncol_complete, index_length, ordered_effects_gen, sigma, lambda_gen);
}
generated quantities{
vector[Ncol] annual_effects_gen;
matrix[Ncol,2] ordered_effects_gen;
vector[K] lambda;
vector[Ncol] lambda_gen;
vector[Ncol] log_lik_vec;//loglikelihood per time period
vector[N] cdf1;
vector[N] sum_pdf_gen;
vector[index_length] diff_gen;
lambda = inv_logit(eta_bspline* beta_eta);
for( t in 1:6){
lambda_gen[(1+(t-1)*56): (56*t) ] = lambda;
}
for(t in 337: Ncol){
lambda_gen[t] = lambda[t-(K*6)];
}
for(t in 1:D){
annual_effects_gen[(1+(t-1)*8) : (8*t)] = rep_vector( (B_annual * beta_annual)[t], 8);
}
//44-day there are whole 6 weeks plus 2 days (16 3-hour blocks)
//week 1-6
for (t in 1:Ncol){
if(t <=K){
ordered_effects_gen[t,1] = alpha[1] + beta_adj[t,1] + annual_effects_gen[t];
ordered_effects_gen[t,2] = alpha[2] + beta_adj[t,2] + annual_effects_gen[t];
}
if(t >=(K+1) && t<= (K*2))
{
ordered_effects_gen[t,1] = alpha[1] + beta_adj[t-K,1] + annual_effects_gen[t];
ordered_effects_gen[t,2] = alpha[2] + beta_adj[t-K,2] + annual_effects_gen[t];
}
if(t >=(2*K+1) && t<= (K*3))
{
ordered_effects_gen[t,1] = alpha[1] + beta_adj[t-(2*K),1] + annual_effects_gen[t];
ordered_effects_gen[t,2] = alpha[2] + beta_adj[t-(2*K),2] + annual_effects_gen[t];
}
if(t >=(3*K+1) && t<= (K*4))
{
ordered_effects_gen[t,1] = alpha[1] + beta_adj[t-(3*K),1] + annual_effects_gen[t];
ordered_effects_gen[t,2] = alpha[2] + beta_adj[t-(3*K),2] + annual_effects_gen[t];
}
if(t >=(4*K+1) && t<= (K*5))
{
ordered_effects_gen[t,1] = alpha[1] + beta_adj[t-(4*K),1] + annual_effects_gen[t];
ordered_effects_gen[t,2] = alpha[2] + beta_adj[t-(4*K),2] + annual_effects_gen[t];
}
if(t >=(5*K+1) && t<= (K*6))
{
ordered_effects_gen[t,1] = alpha[1] + beta_adj[t-(5*K),1] + annual_effects_gen[t];
ordered_effects_gen[t,2] = alpha[2] + beta_adj[t-(5*K),2] + annual_effects_gen[t];
}
}
//remaining 16 of 3-hour blocks
for(t in 337:Ncol){
ordered_effects_gen[t,1] = alpha[1] + beta_adj[t-(K*6),1] + annual_effects_gen[t];
ordered_effects_gen[t,2] = alpha[2] + beta_adj[t-(K*6),2] + annual_effects_gen[t];
}
for(n in 1:N){
cdf1[n] = (1-lambda_gen[kk[n]]) *normal_cdf(y[n], ordered_effects_gen[kk[n],1], sigma) + lambda_gen[kk[n]]*normal_cdf(y[n], ordered_effects_gen[kk[n],2], sigma);
sum_pdf_gen[n] = log_mix((1-lambda_gen[kk[n]]),normal_lpdf(y[n] | ordered_effects_gen[kk[n],1], sigma),normal_lpdf(y[n] | ordered_effects_gen[kk[n],2], sigma));
}
for(n in 1:index_length){
diff_gen[n] = (cdf1[index2[n]] - cdf1[index1[n]]);
}
log_lik_vec = log_lik_vec_gen( Ncol, Ncol_complete, index_11, index_12, index_18, index_25, index_26, hour_index, diff_gen, sum_pdf_gen);
}
Here is the 2-component model for using all the of underlying classical data points
```stan
//For QUT data with 3-hour block interacting with day of the week and day of the year effects
//Fitting with the whole 20+24 days of data
data {
int<lower=1> N; // Total number of observations = 7373
int<lower=1> K; // Index for 3-hour (8*7) day interaction ==56 per week
int<lower=1> D;// indicating number of days fitted D=20+24 days for overall dataset
int<lower=1> Ncol;//==352, 160 for first 20-day while 192 for 24-day
int<lower=1,upper=Ncol> kk[N];//Hour of the day indicator for individual obs
vector[N] dat_complete;//defined LOG-TRANSFORMED observations
int num_basis;
matrix[D, num_basis] B_annual; //sum to zero cyclic bspline
matrix[K, K] K_TD; //penalty prior precision matrix for hour of the week coefficients
matrix[K, (num_basis-1)] eta_bspline;
}
parameters {
vector[(num_basis-1)] beta_eta_raw;
real<lower=0> tau;//RW penalty scale for beta_eta
ordered[2] beta[K];// ordered hour of week effects: a matrix of 56 * 2 where 2nd col
//is greater than 1st col for all rows.
vector[num_basis] beta_annual_raw;//bspline coefficients for annual effects
real<lower=0> sigma;
}
transformed parameters {
vector[(num_basis-1)] beta_eta;
vector[K] eta;
vector[2] alpha;//intercept of hour of week
matrix[K,2] beta_adj;//sum to zero hour of week component mean
vector[num_basis] beta_annual;//coefficients for annual effects
beta_annual = beta_annual_raw*sigma;
beta_eta[1] =beta_eta_raw[1];
for(i in 2:(num_basis-1)){
beta_eta[i] = beta_eta[i-1] + beta_eta_raw[i] * tau;
}
eta = eta_bspline* beta_eta;
alpha[1] = mean(beta[,1]);
alpha[2] = mean(beta[,2]);
for(t in 1:K){
beta_adj[t,1] = beta[t,1] - alpha[1];
beta_adj[t,2] = beta[t,2] - alpha[2];
}
}
model{
vector[Ncol] annual_effects_gen;
matrix[Ncol,2] ordered_overall_mean;
vector[K] lambda;
vector[Ncol] lambda_gen;
beta_annual_raw~ normal(0, 1);//prior for the slopes following Gelman 2008
sigma ~cauchy(0,2.5);
beta_eta_raw~normal(0,1);
tau~normal(0,1);
target += multi_normal_prec_lpdf (beta_adj[,1]| rep_vector(0, K),( 1/square(sigma) * K_TD));
target += multi_normal_prec_lpdf (beta_adj[,2]| rep_vector(0, K),( 1/square(sigma) * K_TD));
lambda = inv_logit(eta);
for( t in 1:6){
lambda_gen[(1+(t-1)*56): (56*t) ] = lambda;
}
for(t in 337: Ncol){
lambda_gen[t] = lambda[t-(K*6)];
}
for(t in 1:D){
annual_effects_gen[(1+(t-1)*8) : (8*t)] = rep_vector( (B_annual * beta_annual)[t], 8);
}
//44-day there are whole 6 weeks plus 2 days (16 3-hour blocks)
//week 1-6
for (t in 1:Ncol){
if(t <=K){
ordered_overall_mean[t,1] = alpha[1] + beta_adj[t,1] + annual_effects_gen[t];
ordered_overall_mean[t,2] = alpha[2] + beta_adj[t,2] + annual_effects_gen[t];
}
if(t >=(K+1) && t<= (K*2))
{
ordered_overall_mean[t,1] = alpha[1] + beta_adj[t-K,1] + annual_effects_gen[t];
ordered_overall_mean[t,2] = alpha[2] + beta_adj[t-K,2] + annual_effects_gen[t];
}
if(t >=(2*K+1) && t<= (K*3))
{
ordered_overall_mean[t,1] = alpha[1] + beta_adj[t-(2*K),1] + annual_effects_gen[t];
ordered_overall_mean[t,2] = alpha[2] + beta_adj[t-(2*K),2] + annual_effects_gen[t];
}
if(t >=(3*K+1) && t<= (K*4))
{
ordered_overall_mean[t,1] = alpha[1] + beta_adj[t-(3*K),1] + annual_effects_gen[t];
ordered_overall_mean[t,2] = alpha[2] + beta_adj[t-(3*K),2] + annual_effects_gen[t];
}
if(t >=(4*K+1) && t<= (K*5))
{
ordered_overall_mean[t,1] = alpha[1] + beta_adj[t-(4*K),1] + annual_effects_gen[t];
ordered_overall_mean[t,2] = alpha[2] + beta_adj[t-(4*K),2] + annual_effects_gen[t];
}
if(t >=(5*K+1) && t<= (K*6))
{
ordered_overall_mean[t,1] = alpha[1] + beta_adj[t-(5*K),1] + annual_effects_gen[t];
ordered_overall_mean[t,2] = alpha[2] + beta_adj[t-(5*K),2] + annual_effects_gen[t];
}
}
//remaining 16 of 3-hour blocks
for(t in 337:Ncol){
ordered_overall_mean[t,1] = alpha[1] + beta_adj[t-(K*6),1] + annual_effects_gen[t];
ordered_overall_mean[t,2] = alpha[2] + beta_adj[t-(K*6),2] + annual_effects_gen[t];
}
//likelihood
for(n in 1:N){
target +=log_mix((1-lambda_gen[kk[n]]), normal_lpdf(dat_complete[n]| ordered_overall_mean[kk[n],1], sigma),
normal_lpdf(dat_complete[n]| ordered_overall_mean[kk[n],2], sigma));
}
}
generated quantities{
vector[N] log_lik_vec;//loglikelihood per time period
vector[Ncol] annual_effects_gen;
matrix[Ncol,2] ordered_overall_mean;
vector[K] lambda;
vector[Ncol] lambda_gen;
lambda = inv_logit(eta);
for( t in 1:6){
lambda_gen[(1+(t-1)*56): (56*t) ] = lambda;
}
for(t in 337: Ncol){
lambda_gen[t] = lambda[t-(K*6)];
}
for(t in 1:D){
annual_effects_gen[(1+(t-1)*8) : (8*t)] = rep_vector( (B_annual * beta_annual)[t], 8);
}
//44-day there are whole 6 weeks plus 2 days (16 3-hour blocks)
//week 1-6
for (t in 1:Ncol){
if(t <=K){
ordered_overall_mean[t,1] = alpha[1] + beta_adj[t,1] + annual_effects_gen[t];
ordered_overall_mean[t,2] = alpha[2] + beta_adj[t,2] + annual_effects_gen[t];
}
if(t >=(K+1) && t<= (K*2))
{
ordered_overall_mean[t,1] = alpha[1] + beta_adj[t-K,1] + annual_effects_gen[t];
ordered_overall_mean[t,2] = alpha[2] + beta_adj[t-K,2] + annual_effects_gen[t];
}
if(t >=(2*K+1) && t<= (K*3))
{
ordered_overall_mean[t,1] = alpha[1] + beta_adj[t-(2*K),1] + annual_effects_gen[t];
ordered_overall_mean[t,2] = alpha[2] + beta_adj[t-(2*K),2] + annual_effects_gen[t];
}
if(t >=(3*K+1) && t<= (K*4))
{
ordered_overall_mean[t,1] = alpha[1] + beta_adj[t-(3*K),1] + annual_effects_gen[t];
ordered_overall_mean[t,2] = alpha[2] + beta_adj[t-(3*K),2] + annual_effects_gen[t];
}
if(t >=(4*K+1) && t<= (K*5))
{
ordered_overall_mean[t,1] = alpha[1] + beta_adj[t-(4*K),1] + annual_effects_gen[t];
ordered_overall_mean[t,2] = alpha[2] + beta_adj[t-(4*K),2] + annual_effects_gen[t];
}
if(t >=(5*K+1) && t<= (K*6))
{
ordered_overall_mean[t,1] = alpha[1] + beta_adj[t-(5*K),1] + annual_effects_gen[t];
ordered_overall_mean[t,2] = alpha[2] + beta_adj[t-(5*K),2] + annual_effects_gen[t];
}
}
//remaining 16 of 3-hour blocks
for(t in 337:Ncol){
ordered_overall_mean[t,1] = alpha[1] + beta_adj[t-(K*6),1] + annual_effects_gen[t];
ordered_overall_mean[t,2] = alpha[2] + beta_adj[t-(K*6),2] + annual_effects_gen[t];
}
for(n in 1:N){
log_lik_vec[n] =log_mix((1-lambda_gen[kk[n]]), normal_lpdf(dat_complete[n]|ordered_overall_mean[kk[n],1], sigma),
normal_lpdf(dat_complete[n]|ordered_overall_mean[kk[n],2], sigma));
}
}
Rplot.pdf (1.0 MB)
The first graph is the traceplot for mixture location 1, on the left is fitted with the customised-constructed likelihood function for real data, while the right is fitted with all classical observations for the real data.
Rplot01.pdf (1.1 MB)
The second plot is the same but fitted with simulated 2-component data. It can be seen that the customised-likelihood function model mimcs the classical likelihood function model results very well and it also converged.
Any insights will be greatly appreciated.