/****************************************************************************** General linear least squares fit routine from section 15.4 of Numerical Recipes. yfit(x) = function which fills f[i],i=0..o-1 with the o fitting functions evaluated at x. fom = if nonzero figure-of-merit is returned here. a = fitting parameters av = if (av) error variances for the fitting parameters returned here. x = n abscissas y = n ordinates ys = if (ys) = n error standard deviations for y values tol = smallest fraction of maximum singular value (eigenvalues, roughly) which a small singular value can equal -- smaller values are set to zero, assumed to indicate redundancy. NR suggests of order 10^-6 n = number of abscissas. o = number of fitting parameters. */ static fit_rc fit_lsq(void (*yfit)(), double *fom, double *a, double *av, const double *x, const double *y, const double *ys, double tol, int n, int o) { double wmax,wmin,xsq,sum ; int i,j ; const char *me = "fit_lsq" ; if (check_memory(o,n) != OK) return(memfail(__LINE__,me)) ; for(i=0;i<n;i++) { yfit(x[i]) ; for(j=0;j<o;j++) u[i][j] = f[j] * (ys ? 1.0/ys[i] : 1.0) ; } ; memcpy(b,y,n*sizeof(double)) ; if (ys) for(i=0;i<n;i++) b[i] /= ys[i] ; if (svdcmp(u,n,o) != OK) return(punt(__LINE__,me,"singular value decomposition failed.")) ; wmax = 0.0 ; for(wmax=0.0,j=0;j<o;j++) if (w[j] > wmax) wmax = w[j] ; wmin = tol * wmax ; for(j=0;j<o;j++) if (w[j] < wmin) w[j] = 0.0 ; if (svbksb(a,n,o) != OK) return(punt(__LINE__,me,"back substitution failed.")) ; if (av) { if (svdvar(o) != OK) return(punt(__LINE__,me,"variance calculation failed.")) ; for(i=0;i<o;i++) av[i] = cvm[i][i] ; } ; if (fom) { xsq = 0.0 ; for(i=0;i<o;i++) { yfit(x[i]) ; sum = 0.0 ; for(j=0;j<o;j++) sum += a[j] * f[j] ; sum = (y[i] - sum)/(ys ? ys[i]*ys[i] : 1.0) ; xsq += sum*sum ; } ; *fom = xsq ; } ; return(OK) ; }
Type objective_function<Type>::operator() () { DATA_VECTOR(x); DATA_VECTOR(y); int n = y.size(); PARAMETER(b0); PARAMETER(b1); PARAMETER(logSigma); vector<Type> yfit(n); Type neglogL = 0.0; yfit = b0 + b1*x; neglogL = -sum(dnorm(y, yfit, exp(logSigma), true)); return neglogL; }
Type objective_function<Type>::operator() () { DATA_VECTOR(x); DATA_VECTOR(y); int n = y.size(); PARAMETER(b0); PARAMETER(b1); PARAMETER(logSigma); vector<Type> yfit(n); Type neglogL = 0.0; //Call triple function yfit = b0 + b1*x; neglogL = -sum(dnorm(y, yfit, exp(logSigma), true)); // JIM THORSON JUST ROCK'N TMB std::cout << b0<<" "<<b1<<"\n "; return neglogL; }