84 double (*objf)(
int,
double*,
void*),
92 int ret, i, j, powellItNr, lowindex, upindex;
93 double fret=0.0, *parMean, *chainptr, *chain, **matrix, *delta, *bsFitTac;
94 double help, *error, *wError, *biasEst, *unbiasPar, *estInOrder;
98 printf(
"%s(%d, ..., %d, ..., %d, ..., %d)\n", __func__, iterNr, frameNr, parNr, verbose);
101 if(status!=0) strcpy(status,
"");
102 if(iterNr<100) iterNr=200;
103 if(frameNr<1 || parNr<1 ) {
104 strcpy(bserrmsg,
"either framenumber or parameternumber is negative");
105 if(verbose>0) fprintf(stderr,
"Error: %s.\n", bserrmsg);
106 if(status!=0) strcpy(status, bserrmsg);
109 if(bsTac==NULL || parameter==NULL || objf==NULL || origTac==NULL ||
112 strcpy(bserrmsg,
"some of the given parameters are not pointing anywhere");
113 if(verbose>0) fprintf(stderr,
"Error: %s.\n", bserrmsg);
114 if(status!=0) strcpy(status, bserrmsg);
117 for(i=0; i<parNr; i++) {
118 if(lowlim[i]>uplim[i]) {
119 strcpy(bserrmsg,
"given limit values are not qualified");
120 if(verbose>0) fprintf(stderr,
"Error: %s.\n", bserrmsg);
121 if(status!=0) strcpy(status, bserrmsg);
127 if(verbose>1) printf(
" allocating memory\n");
128 bsFitTac=(
double*)malloc(frameNr*
sizeof(
double));
129 bs_parameter=(
double*)malloc(parNr*
sizeof(
double));
130 bs_weight=(
double*)malloc(frameNr*
sizeof(
double));
131 delta=(
double*)malloc(parNr*
sizeof(
double));
132 parMean=(
double*)malloc(parNr*
sizeof(
double));
133 chain=(
double*)malloc((iterNr*parNr)*
sizeof(
double));
134 matrix=(
double**)malloc(parNr*
sizeof(
double*));
135 error=(
double*)malloc(frameNr*
sizeof(
double));
136 wError=(
double*)malloc(frameNr*
sizeof(
double));
137 biasEst=(
double*)malloc(parNr*
sizeof(
double));
138 unbiasPar=(
double*)malloc(parNr*
sizeof(
double));
139 if(bsFitTac==NULL || bs_parameter==NULL || bs_weight==NULL || delta==NULL ||
140 parMean==NULL || chain==NULL || matrix==NULL || error==NULL ||
141 wError==NULL || biasEst==NULL || unbiasPar==NULL) {
142 strcpy(bserrmsg,
"out of memory");
143 if(verbose>0) fprintf(stderr,
"Error: %s.\n", bserrmsg);
144 if(status!=0) strcpy(status, bserrmsg);
147 for(i=0, chainptr=chain; i<parNr; i++) {
148 matrix[i]=(chainptr + i*iterNr);
156 for(i=0; i<bs_parNr; i++) {
157 bs_parameter[i]=parameter[i];
162 if(verbose>2) printf(
" calculating errors and weighted errors");
163 for(i=0; i<bs_frameNr; i++) {
164 bsFitTac[i]=fitTac[i];
165 if(weight[i]<=0.0) bs_weight[i]=1;
else bs_weight[i]=weight[i];
166 error[i]=origTac[i]-bsFitTac[i];
167 wError[i]=error[i]/sqrt(bs_weight[i]);
170 printf(
" weighted errors:\n ");
171 for(i=0; i<bs_frameNr; i++) printf(
"%g ", wError[i]);
178 if(verbose>1) printf(
" bootstrap iterations\n");
179 if(verbose>4) printf(
"Bootstrap matrix:\n");
182 for(i=0; i<iterNr; i++) {
185 for(j=0; j<bs_frameNr; j++) {
186 error[j]=wError[(int)((bs_frameNr)*(
double)rand()/((
double)(
RAND_MAX)+1))];
187 bsTac[j]=bsFitTac[j]+bs_weight[j]*error[j];
191 for(j=0; j<bs_parNr; j++) {
192 delta[j]=0.01*(bs_uplim[j]-bs_lowlim[j]);
193 bs_parameter[j]=parameter[j];
196 ret=
powell(bs_parameter, delta, bs_parNr, 0.00001, &powellItNr, &fret, bs_func, NULL, 0);
197 if(ret>1 && ret!=3) {
198 sprintf(bserrmsg,
"error %d in powell()", ret);
199 if(verbose>0) fprintf(stderr,
"Error: %s.\n", bserrmsg);
200 if(status!=0) strcpy(status, bserrmsg);
218 for(j=0; j<bs_parNr; j++) {
219 matrix[j][i]=bs_parameter[j];
222 for(j=0; j<bs_parNr; j++) printf(
"%g ", bs_parameter[j]);
227 if(powellfailNr>(iterNr/3)) {
228 sprintf(bserrmsg,
"error %d in powell()", ret);
229 if(verbose>0) fprintf(stderr,
"Error: too often %s.\n", bserrmsg);
230 if(status!=0) strcpy(status, bserrmsg);
246 if(verbose>1) printf(
" computing parameter bias\n");
247 for(i=0; i<bs_parNr; i++) {
248 for(j=0, help=0.0; j<iterNr; j++) help+=matrix[i][j];
249 parMean[i]=help/(double)iterNr;
250 biasEst[i]=parMean[i]-parameter[i];
253 printf(
"parMean[%d] := %g\n", i, parMean[i]);
254 printf(
"parameter[%d] := %g\n", i, parameter[i]);
255 printf(
"biasEst[%d] := %g\n", i, biasEst[i]);
261 if(verbose>1) printf(
"Standard deviations:\n");
262 for(i=0; i<bs_parNr; i++) {
263 for(j=0, help=0; j<iterNr; j++) {
264 help+=(matrix[i][j]-parMean[i])*(matrix[i][j]-parMean[i])/(iterNr-1);
266 SD[i]=sqrt(help);
if(verbose>1) printf(
" %g\n", SD[i]);
270 if(cLim1!=NULL && cLim2!=NULL) {
271 if(verbose>1) printf(
"Confidence intervals:\n");
275 for(i=0; i<bs_parNr; i++) {
278 estInOrder=matrix[i];
279 qsort(estInOrder, iterNr,
sizeof(
double), bootstrapQSort);
282 if(fabs(estInOrder[lowindex]-biasEst[i])<1e-99) cLim1[i]=0.0;
283 else cLim1[i]=estInOrder[lowindex]-biasEst[i];
284 if(fabs(estInOrder[upindex]-biasEst[i])<1e-99) cLim2[i]=0.0;
285 else cLim2[i]=estInOrder[upindex]-biasEst[i];
287 printf(
" %g - %g\n", cLim1[i], cLim2[i]);
291 printf(
"Sorted matrix\n");
292 for(j=0; j<iterNr; j++) {
293 for(i=0; i<bs_parNr; i++) printf(
" %12.3e", matrix[i][j]);
296 printf(
"lowindex := %d\nupindex := %d\n", lowindex, upindex);
312 if(verbose>0) {printf(
" end of bootstrap()\n");}
int bootstrap(int iterNr, double *cLim1, double *cLim2, double *SD, double *parameter, double *lowlim, double *uplim, int frameNr, double *origTac, double *fitTac, double *bsTac, int parNr, double *weight, double(*objf)(int, double *, void *), char *status, int verbose)