Go to the documentation of this file.00001 #include "statsLib.h"
00002
00015 dvariable dmultinom(const dvector& x, const dvar_vector& p)
00016 {
00017 if(x.indexmin() != p.indexmin() || x.indexmax() != p.indexmax())
00018 {
00019 cerr << "Index bounds do not macth in"
00020 " dmultinom(const dvector& x, const dvar_vector& p)\n";
00021 ad_exit(1);
00022 }
00023
00024 double n=sum(x);
00025 return -gammln(n+1.)+sum(gammln(x+1.))-x*log(p/sum(p));
00026 }
00027
00028 double neff(const dvector& obs, const dvar_vector& pred)
00029 {
00030 dvector resid=value(obs-pred);
00031 dvector var=value(elem_prod(1.-pred,pred));
00032 return sum(var)/norm2(resid);
00033 }
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050 dvariable dmultinom(const dmatrix o, const dvar_matrix& p,dvar_matrix& nu,double& tau2,const double minp)
00051 {
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063 RETURN_ARRAYS_INCREMENT();
00064 int i,j,k,n;
00065 int a = o.colmin();
00066 int A=o.colmax();
00067 int t=o.rowmin();
00068 int T=o.rowmax();
00069 dvector tmptau(1,A*T);
00070 int Ncount=1;
00071 dvariable Nsamp;
00072
00073
00074 dvariable proc_err=0.009;
00075 nu.initialize();
00076 dvariable nloglike=0.;
00077
00078
00079 for(i=t; i<=T; i++)
00080 {
00081
00082 Nsamp=sum(o(i))/(1.+proc_err*sum(o(i)));
00083 n=0;
00084 dvector oo = o(i)/sum(o(i));
00085 dvar_vector pp = p(i)/sum(p(i));
00086
00087
00088 for(j=a;j<=A;j++)
00089 if(oo(j) > minp)n++;
00090
00091 ivector iiage(1,n);
00092 dvector o1(1,n); o1.initialize();
00093 dvar_vector p1(1,n); p1.initialize();
00094 k=1;
00095 for(j=a;j<=A;j++)
00096 {
00097 if(oo(j)<=minp)
00098 {
00099 o1(k)+=oo(j);
00100 p1(k)+=pp(j);
00101 }
00102 else
00103 {
00104 o1(k)+=oo(j);
00105 p1(k)+=pp(j);
00106 if(k<=n)iiage(k)=j;
00107 if(k<n) k++;
00108 }
00109 }
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123 {
00124 dvar_vector t1 = elem_div(o1-p1,sqrt(elem_prod(p1,1.-p1)/Nsamp));
00125 for(j=1;j<=n;j++)
00126 {
00127 nu(i)(iiage(j))=t1(j);
00128 tmptau(Ncount++)=sqrt(square(value(t1(j))));
00129 }
00130 }
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140 nloglike+=sum(-1.*elem_prod(Nsamp*o1,log(p1))+
00141 elem_prod(Nsamp*o1,log(o1)));
00142
00143 }
00144
00145 dvector w=sort(tmptau(1,Ncount-1));
00146
00147 tau2=w(int(Ncount/2.));
00148
00149 RETURN_ARRAYS_DECREMENT();
00150 return(nloglike);
00151 }
00152
00153