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 dvariable dmultinom(const dmatrix o, const dvar_matrix& p,dvar_matrix& nu,double& tau2,const double minp)
00036 {
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048 RETURN_ARRAYS_INCREMENT();
00049 int i,j,k,n;
00050 int a = o.colmin();
00051 int A=o.colmax();
00052 int t=o.rowmin();
00053 int T=o.rowmax();
00054 dvector tmptau(1,A*T);
00055 int Ncount=1;
00056 dvariable Nsamp;
00057
00058
00059 dvariable proc_err=0.009;
00060 nu.initialize();
00061 dvariable nloglike=0.;
00062
00063
00064 for(i=t; i<=T; i++)
00065 {
00066
00067 Nsamp=sum(o(i))/(1.+proc_err*sum(o(i)));
00068 n=0;
00069 dvector oo = o(i)/sum(o(i));
00070 dvar_vector pp = p(i)/sum(p(i));
00071
00072
00073 for(j=a;j<=A;j++)
00074 if(oo(j) > minp)n++;
00075
00076 ivector iiage(1,n);
00077 dvector o1(1,n); o1.initialize();
00078 dvar_vector p1(1,n); p1.initialize();
00079 k=1;
00080 for(j=a;j<=A;j++)
00081 {
00082 if(oo(j)<=minp)
00083 {
00084 o1(k)+=oo(j);
00085 p1(k)+=pp(j);
00086 }
00087 else
00088 {
00089 o1(k)+=oo(j);
00090 p1(k)+=pp(j);
00091 if(k<=n)iiage(k)=j;
00092 if(k<n) k++;
00093 }
00094 }
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108 {
00109 dvar_vector t1 = elem_div(o1-p1,sqrt(elem_prod(p1,1.-p1)/Nsamp));
00110 for(j=1;j<=n;j++)
00111 {
00112 nu(i)(iiage(j))=t1(j);
00113 tmptau(Ncount++)=sqrt(square(value(t1(j))));
00114 }
00115 }
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125 nloglike+=sum(-1.*elem_prod(Nsamp*o1,log(p1))+
00126 elem_prod(Nsamp*o1,log(o1)));
00127
00128 }
00129
00130 dvector w=sort(tmptau(1,Ncount-1));
00131
00132 tau2=w(int(Ncount/2.));
00133
00134 RETURN_ARRAYS_DECREMENT();
00135 return(nloglike);
00136 }
00137
00138