Beispiel #1
0
int main(){
  int       rep_ct  = 10000;
  gsl_rng   *r      = apop_rng_alloc(0);
    apop_db_open("data-census.db");
    gsl_vector *base_data    = apop_query_to_vector("select in_per_capita from income where sumlevel+0.0 =40");
    double      RI           = apop_query_to_float("select in_per_capita from income where sumlevel+0.0 =40 and geo_id2+0.0=44");
    gsl_vector *boot_sample  =  gsl_vector_alloc(base_data->size);
    gsl_vector *replications = gsl_vector_alloc(rep_ct);
    for (int i=0; i< rep_ct; i++){
        one_boot(base_data, r, boot_sample);
        gsl_vector_set(replications, i, apop_mean(boot_sample));
    }
    double stderror = sqrt(apop_var(replications));
    double mean     = apop_mean(replications);
    printf("mean: %g; standard error: %g; (RI-mean)/stderr: %g; p value: %g\n",
       mean, stderror, (RI-mean)/stderror, 2*gsl_cdf_gaussian_Q(fabs(RI-mean), stderror));
}
void _fortetRHS(const double * ts, const int num_steps, double * Is, const int num_intervals,
				const double * abgthphi,
				double *rhs) {
	const double alpha = abgthphi[0];
	const double beta = abgthphi[1];
	const double gamma = abgthphi[2];
	const double theta = abgthphi[3];
	const double phi = abgthphi[4];

	const double TAU_TOLERANCE = 1e-5;
	const double psi = atan(theta);
//	sort is
	gsl_sort(Is, 1, num_intervals);

	double lt, lI, ltau, vthforward, vthbackward,numerator, denominator;

	for (int tidx = 0; tidx < num_steps; ++tidx) {
		lt = ts[tidx];
		rhs[tidx] = .0;

		vthforward = 1. - (alpha*(1 - exp(-lt)) +
						gamma / sqrt(1.+theta*theta) * ( sin ( theta *  ( lt + phi) - psi)
												-exp(-lt)*sin(phi*theta - psi) ));

		for (int idx = 0; idx < num_intervals; ++idx){
			lI = Is[idx];
			if(lI >= (lt - TAU_TOLERANCE)) break;

			ltau = lt - lI;

			vthbackward = 1. - (alpha*(1 - exp(-lI)) +
					gamma / sqrt(1.+theta*theta) * ( sin ( theta *  ( lI + phi) - psi)
											-exp(-lI)*sin(phi*theta - psi) ));

			numerator = (vthforward - vthbackward*exp(-ltau))*sqrt(2.);
			denominator = beta * sqrt(1. - exp(-2*ltau));

			rhs[tidx] += gsl_cdf_gaussian_Q(numerator/denominator, 1.0);

		}//end per time loop
	}//end all times loop
}
void _fortetError(const double * ts, const int num_steps, double * Is, const int num_intervals,
				const double * abgthphi,
				double *error) {
	const double alpha = abgthphi[0];
	const double beta = abgthphi[1];
	const double gamma = abgthphi[2];
	const double theta = abgthphi[3];
	const double phi = abgthphi[4];
//	printf("Fortet: theta=%.2f,gamma=%.2f\n", theta, gamma);

	const double TAU_TOLERANCE = 1e-5;
	const double psi = atan(theta);
	//Sort is:
	gsl_sort(Is, 1, num_intervals);

	double lt, lI, ltau, vthforward, vthbackward;
	double numerator, denominator, lhs;
	double max_lhs = .0;
	double normalizing_const = 1.0*num_intervals;

	double exp_factor;
	for (int tidx = 0; tidx < num_steps; ++tidx) {
		lt = ts[tidx];
		vthforward = 1. - (alpha*(1 - exp(-lt)) +
						gamma / sqrt(1.+theta*theta) * ( sin ( theta *  ( lt + phi) - psi)
												-exp(-lt)*sin(phi*theta - psi) ));

		//Calculate LHS:
		numerator = vthforward * sqrt(2.);
		denominator = beta * sqrt(1. - exp(-2.*lt));

		lhs = gsl_cdf_gaussian_Q(numerator/denominator, 1.0);

		max_lhs = GSL_MAX(lhs, max_lhs);

		error[tidx] = lhs;

		//Calculate RHS:
		for (int idx = 0; idx < num_intervals; ++idx){
			lI = Is[idx];
			if(lI >= (lt - TAU_TOLERANCE)) break;

			ltau = lt - lI;

			exp_factor = exp(-lI);
			vthbackward = 1. - (alpha*(1. - exp_factor) +
					gamma / sqrt(1.+theta*theta) * ( sin ( theta *  ( lI + phi) - psi)
											-exp_factor*sin(phi*theta - psi) ));
			exp_factor = exp(-ltau);
			numerator = (vthforward - vthbackward*exp_factor)*sqrt(2.);
			denominator = beta * sqrt(1. - exp_factor*exp_factor);

			error[tidx] -= gsl_cdf_gaussian_Q(numerator/denominator, 1.0) / normalizing_const;

		}//end rhs (intervals) loop
	}//end error (time steps) loop

	//scale by max_lhs:
	for (int tidx = 0; tidx < num_steps; ++tidx) {
		error[tidx] = fabs(error[tidx]) / max_lhs;
	}
}
Beispiel #4
0
int main(int argc, char **argv){
    distlist distribution = Normal;
    char	 msg[10000], c;
    int      pval = 0, qval = 0;
    double   param1 = GSL_NAN, param2 =GSL_NAN, findme = GSL_NAN;
    char     number[1000];
	sprintf(msg, "%s [opts] number_to_lookup\n\n"
    "Look up a probability or p-value for a given standard distribution.\n"
    "[This is still loosely written and counts as beta. Notably, negative numbers are hard to parse.]\n"
    "E.g.:\n"
    "%s -dbin 100 .5 34\n"
    "sets the distribution to a Binomial(100, .5), and find the odds of 34 appearing.\n"
    "%s -p 2     \n"
    "find the area of the Normal(0,1) between -infty and 2.  \n"
    "\n"
    "-pval Find the p-value: integral from -infinity to your value\n"
    "-qval Find the q-value: integral from your value to infinity\n"
    "\n"
    "After giving an optional -p or -q, specify the distribution. \n"
    "Default is Normal(0, 1). Other options:\n"
    "\t\t-binom Binomial(n, p)\n"
    "\t\t-beta Beta(a, b)\n"
    "\t\t-f F distribution(df1, df2)\n"
    "\t\t-norm Normal(mu, sigma)\n"
    "\t\t-negative bin Negative binomial(n, p)\n"
    "\t\t-poisson Poisson(L)\n"
    "\t\t-t t distribution(df)\n"
    "I just need enough letters to distinctly identify a distribution.\n"
, argv[0], argv[0], argv[0]); 

    opterr=0;
	if(argc==1){
		printf("%s", msg);
		return 0;
	}
	while ((c = getopt (argc, argv, "B:b:F:f:N:n:pqT:t:")) != -1){
		switch (c){
		  case 'B':
		  case 'b':
              if (optarg[0]=='i')
                  distribution = Binomial;
              else if (optarg[0]=='e')
                  distribution = Beta;
            else {
                printf("I can't parse the option -b%s\n", optarg);
                exit(0);
            }
              param1 = atof(argv[optind]);
              param2 = atof(argv[optind+1]);
              findme =  atof(argv[optind+2]);
			  break;
          case 'F':
          case 'f':
            distribution = F;
            param1 = atof(argv[optind]);
            findme =  atof(argv[optind+1]);
            break;
          case 'H':
		  case 'h':
			printf("%s", msg);
			return 0;
          case 'n':
          case 'N':
            if (optarg[0]=='o'){ //normal
                  param1 = atof(argv[optind]);
                  param2 = atof(argv[optind+1]);
                  findme =  atof(argv[optind+2]);
            } else if (optarg[0]=='e'){
                  distribution = Negbinom;
                  param1 = atof(argv[optind]);
                  param2 = atof(argv[optind+1]);
                  findme =  atof(argv[optind+2]);
            } else {
                printf("I can't parse the option -n%s\n", optarg);
                exit(0);
            }
			  break;
          case 'p':
            if (!optarg || optarg[0] == 'v')
                pval++;
            else if (optarg[0] == 'o'){
                distribution = Poisson;
                param1 = atof(argv[optind]);
                findme =  atof(argv[optind+1]);
            } else {
                printf("I can't parse the option -p%s\n", optarg);
                exit(0);
            }
            break;
          case 'q':
            qval++;
            break;
          case 'T':
          case 't':
            distribution = T;
            param1 = atof(argv[optind]);
            findme =  atof(argv[optind+1]);
            break;
          case '?'://probably a negative number
            if (optarg)
                 snprintf(number, 1000, "%c%s", optopt, optarg);
            else snprintf(number, 1000, "%c", optopt);
            if (gsl_isnan(param1)) param1 = -atof(number);
            else if (gsl_isnan(param2)) param2 = -atof(number);
            else if (gsl_isnan(findme)) findme = -atof(number);
		}
	}
    if (gsl_isnan(findme)) findme =  atof(argv[optind]);
    //defaults, as promised
    if (gsl_isnan(param1)) param1 = 0;
    if (gsl_isnan(param2)) param2 = 1;
    if (!pval && !qval){
        double val =
        distribution == Beta ? gsl_ran_beta_pdf(findme, param1, param2)
        : distribution == Binomial ? gsl_ran_binomial_pdf(findme, param2, param1)
        : distribution == F ? gsl_ran_fdist_pdf(findme, param1, param2) 
        : distribution == Negbinom ? gsl_ran_negative_binomial_pdf(findme, param2, param1)
        : distribution == Normal ? gsl_ran_gaussian_pdf(findme, param2)+param1
        : distribution == Poisson ? gsl_ran_poisson_pdf(findme, param1) 
        : distribution == T ? gsl_ran_tdist_pdf(findme, param1) : GSL_NAN;
        printf("%g\n", val); 
        return 0;
    }
    if (distribution == Binomial){
        printf("Sorry, the GSL doesn't have a Binomial CDF.\n");
        return 0; }
    if (distribution == Negbinom){
        printf("Sorry, the GSL doesn't have a Negative Binomial CDF.\n");
        return 0; }
    if (distribution == Poisson){
        printf("Sorry, the GSL doesn't have a Poisson CDF.\n");
        return 0; }
    if (pval){
        double val =
        distribution == Beta ? gsl_cdf_beta_P(findme, param1, param2)
        : distribution == F ? gsl_cdf_fdist_P(findme, param1, param2) 
        : distribution == Normal ? gsl_cdf_gaussian_P(findme-param1, param2)
        : distribution == T ? gsl_cdf_tdist_P(findme, param1) : GSL_NAN;
        printf("%g\n", val); 
        return 0;
    }
    if (qval){
        double val =
        distribution == Beta ? gsl_cdf_beta_Q(findme, param1, param2)
        : distribution == F ? gsl_cdf_fdist_Q(findme, param1, param2) 
        : distribution == Normal ? gsl_cdf_gaussian_Q(findme-param1, param2)
        : distribution == T ? gsl_cdf_tdist_Q(findme, param1) : GSL_NAN;
        printf("%g\n", val); 
    }
}