static ERL_NIF_TERM kurtosis(ErlNifEnv * env, int argc, const ERL_NIF_TERM argv[]) { double_list dl = alloc_double_list(env, argv[0]); ARG_ERROR_IF_DL_IS_NULL(dl); ERL_NIF_TERM final = enif_make_double(env, gsl_stats_kurtosis(dl.list, 1, dl.length)); free_double_list(dl); return final; }
void test_basic(const size_t n, const double data[], const double tol) { gsl_rstat_workspace *rstat_workspace_p = gsl_rstat_alloc(); const double expected_mean = gsl_stats_mean(data, 1, n); const double expected_var = gsl_stats_variance(data, 1, n); const double expected_sd = gsl_stats_sd(data, 1, n); const double expected_sd_mean = expected_sd / sqrt((double) n); const double expected_skew = gsl_stats_skew(data, 1, n); const double expected_kurtosis = gsl_stats_kurtosis(data, 1, n); double expected_rms = 0.0; double mean, var, sd, sd_mean, rms, skew, kurtosis; size_t i, num; int status; /* compute expected rms */ for (i = 0; i < n; ++i) expected_rms += data[i] * data[i]; expected_rms = sqrt(expected_rms / n); /* add data to rstat workspace */ for (i = 0; i < n; ++i) gsl_rstat_add(data[i], rstat_workspace_p); mean = gsl_rstat_mean(rstat_workspace_p); var = gsl_rstat_variance(rstat_workspace_p); sd = gsl_rstat_sd(rstat_workspace_p); sd_mean = gsl_rstat_sd_mean(rstat_workspace_p); rms = gsl_rstat_rms(rstat_workspace_p); skew = gsl_rstat_skew(rstat_workspace_p); kurtosis = gsl_rstat_kurtosis(rstat_workspace_p); num = gsl_rstat_n(rstat_workspace_p); gsl_test_int(num, n, "n n=%zu" , n); gsl_test_rel(mean, expected_mean, tol, "mean n=%zu", n); gsl_test_rel(var, expected_var, tol, "variance n=%zu", n); gsl_test_rel(sd, expected_sd, tol, "stddev n=%zu", n); gsl_test_rel(sd_mean, expected_sd_mean, tol, "stddev_mean n=%zu", n); gsl_test_rel(rms, expected_rms, tol, "rms n=%zu", n); gsl_test_rel(skew, expected_skew, tol, "skew n=%zu", n); gsl_test_rel(kurtosis, expected_kurtosis, tol, "kurtosis n=%zu", n); status = gsl_rstat_reset(rstat_workspace_p); gsl_test_int(status, GSL_SUCCESS, "rstat returned success"); num = gsl_rstat_n(rstat_workspace_p); gsl_test_int(num, 0, "n n=%zu" , n); gsl_rstat_free(rstat_workspace_p); }
CAMLprim value ml_gsl_stats_kurtosis(value ow, value data) { size_t len = Double_array_length(data); double result; if(ow == Val_none) result = gsl_stats_kurtosis(Double_array_val(data), 1, len); else { value w = Unoption(ow); check_array_size(data, w); result = gsl_stats_wkurtosis(Double_array_val(w), 1, Double_array_val(data), 1, len); } return copy_double(result); }
void test_basic(const size_t n, const double data[], const double tol) { gsl_rstat_workspace *rstat_workspace_p = gsl_rstat_alloc(); const double expected_mean = gsl_stats_mean(data, 1, n); const double expected_var = gsl_stats_variance(data, 1, n); const double expected_sd = gsl_stats_sd(data, 1, n); const double expected_skew = gsl_stats_skew(data, 1, n); const double expected_kurtosis = gsl_stats_kurtosis(data, 1, n); double expected_rms = 0.0; double mean, var, sd, rms, skew, kurtosis; size_t i; /* compute expected rms */ for (i = 0; i < n; ++i) expected_rms += data[i] * data[i]; expected_rms = sqrt(expected_rms / n); /* add data to rstat workspace */ for (i = 0; i < n; ++i) gsl_rstat_add(data[i], rstat_workspace_p); mean = gsl_rstat_mean(rstat_workspace_p); var = gsl_rstat_variance(rstat_workspace_p); sd = gsl_rstat_sd(rstat_workspace_p); rms = gsl_rstat_rms(rstat_workspace_p); skew = gsl_rstat_skew(rstat_workspace_p); kurtosis = gsl_rstat_kurtosis(rstat_workspace_p); gsl_test_rel(mean, expected_mean, tol, "mean n=%zu", n); gsl_test_rel(var, expected_var, tol, "variance n=%zu", n); gsl_test_rel(sd, expected_sd, tol, "stddev n=%zu", n); gsl_test_rel(rms, expected_rms, tol, "rms n=%zu", n); gsl_test_rel(skew, expected_skew, tol, "skew n=%zu", n); gsl_test_rel(kurtosis, expected_kurtosis, tol, "kurtosis n=%zu", n); gsl_rstat_free(rstat_workspace_p); }
int main() { gsl_rng *r = gsl_rng_alloc(gsl_rng_default); const double tol1 = 1.0e-8; const double tol2 = 1.0e-3; gsl_ieee_env_setup(); { const size_t N = 2000000; double *data = random_data(N, r); double data2[] = { 4.0, 7.0, 13.0, 16.0 }; size_t i; test_basic(2, data, tol1); test_basic(100, data, tol1); test_basic(1000, data, tol1); test_basic(10000, data, tol1); test_basic(50000, data, tol1); test_basic(80000, data, tol1); test_basic(1500000, data, tol1); test_basic(2000000, data, tol1); for (i = 0; i < 4; ++i) data2[i] += 1.0e9; test_basic(4, data2, tol1); free(data); } { /* dataset from Jain and Chlamtac paper */ const size_t n_jain = 20; const double data_jain[] = { 0.02, 0.15, 0.74, 3.39, 0.83, 22.37, 10.15, 15.43, 38.62, 15.92, 34.60, 10.28, 1.47, 0.40, 0.05, 11.39, 0.27, 0.42, 0.09, 11.37 }; double expected_jain = 4.44063435326; test_quantile(0.5, data_jain, n_jain, expected_jain, tol1, "jain"); } { size_t n = 1000000; double *data = malloc(n * sizeof(double)); double *sorted_data = malloc(n * sizeof(double)); gsl_rstat_workspace *rstat_workspace_p = gsl_rstat_alloc(); double p; size_t i; for (i = 0; i < n; ++i) { data[i] = gsl_ran_gaussian_tail(r, 1.3, 1.0); gsl_rstat_add(data[i], rstat_workspace_p); } memcpy(sorted_data, data, n * sizeof(double)); gsl_sort(sorted_data, 1, n); /* test quantile calculation */ for (p = 0.1; p <= 0.9; p += 0.1) { double expected = gsl_stats_quantile_from_sorted_data(sorted_data, 1, n, p); test_quantile(p, data, n, expected, tol2, "gauss"); } /* test mean, variance */ { const double expected_mean = gsl_stats_mean(data, 1, n); const double expected_var = gsl_stats_variance(data, 1, n); const double expected_sd = gsl_stats_sd(data, 1, n); const double expected_skew = gsl_stats_skew(data, 1, n); const double expected_kurtosis = gsl_stats_kurtosis(data, 1, n); const double expected_median = gsl_stats_quantile_from_sorted_data(sorted_data, 1, n, 0.5); const double mean = gsl_rstat_mean(rstat_workspace_p); const double var = gsl_rstat_variance(rstat_workspace_p); const double sd = gsl_rstat_sd(rstat_workspace_p); const double skew = gsl_rstat_skew(rstat_workspace_p); const double kurtosis = gsl_rstat_kurtosis(rstat_workspace_p); const double median = gsl_rstat_median(rstat_workspace_p); gsl_test_rel(mean, expected_mean, tol1, "mean"); gsl_test_rel(var, expected_var, tol1, "variance"); gsl_test_rel(sd, expected_sd, tol1, "stddev"); gsl_test_rel(skew, expected_skew, tol1, "skew"); gsl_test_rel(kurtosis, expected_kurtosis, tol1, "kurtosis"); gsl_test_abs(median, expected_median, tol2, "median"); } free(data); free(sorted_data); gsl_rstat_free(rstat_workspace_p); } gsl_rng_free(r); exit (gsl_test_summary()); }
int main (void) { int i, j, warn, counter; double lim[15]; lim[0]=0.01; //lim[1]=0.02; lim[1]=0.03; //lim[3]=0.04; lim[2]=0.05; //lim[5]=0.09; lim[3]=0.11; //lim[7]=0.14; lim[4]=0.17; //lim[9]=0.208; lim[5]=0.26; //lim[11]=0.32; lim[6]=0.4; //lim[13]=0.51; lim[7]=0.64; //lim[15]=0.8; lim[8]=1.0; //lim[17]=1.25; lim[9]=1.56; //lim[19]=1.95; lim[10]=2.44; //lim[21]=3.05; lim[11]=3.81; //lim[23]=4.76; lim[12]=5.96; //lim[25]=7.45; lim[13]=9.31; //lim[27]=11.64; lim[14]=14.55; //lim[29]=18.18; counter = 0.0; double pos[N],vel[N],err[N],vel_sq, sum; double mean, median, skew, sd, kurtosis, error, sum1, sum2; FILE *velo, *sig, *script; velo = fopen("organized.dat", "r"); sig = fopen("sigma.dat","w"); for(i=0.0; i<N; i++) { fscanf(velo, "%lf %lf %lf", &pos[i], &vel[i], &err[i]); } //printf ("The sample mean is %g\n", mean); fclose(velo); for(j=0.0; j<14.0; j=j+1.0) { counter = 0.0; for(i = 0.0;(i)<=N; i++) { if( lim[j] <= pos[i] && pos[i] < lim[(j)+1] ) { counter++; gsl_sort (vel, 1, counter); mean = gsl_stats_mean(vel, 1, counter); median = gsl_stats_median_from_sorted_data (vel, 1, counter); sd = gsl_stats_sd (vel, 1, counter); skew = gsl_stats_skew(vel, 1, counter); kurtosis = gsl_stats_kurtosis (vel, 1, counter); sum1 = (vel[i]-mean)*(vel[i]-mean); sum1++; sum2 = (vel[i]-mean)*err[i]; sum2++; error = 1.0/(sqrt(counter)) * pow(sum1,-0.5) * sum2; } } printf("Particulas entre %lf y %lf es %d\n",lim[j],lim[j+1], counter); printf("Error %lf\n", error); printf ("The sample mean is %g\n", mean); printf ("The median is %g\n", median); printf ("Standard deviation is %g\n", sd); printf ("Skewness is %g\n", skew); printf ("kurtosis is %g\n\n", kurtosis); //printf("Sigma in the bin is: %.2f\n\n", sig); fprintf(sig, "%lf\t %lf\t %lf\t %d\n", (lim[j]+lim[j+1])*0.5, sd, error, counter); } fclose(sig); script = fopen( "script1.gpl", "w" ); fprintf(script, "set grid\nset terminal png\nset output 'Sigma_vs_rad.png'\nset nokey\n"); fprintf( script, "set title 'Sigma vs Radius'\n" ); fprintf( script, "set logscale x\n" ); fprintf( script, "set xlabel 'Radius in Arcmin'\n" ); fprintf( script, "set xrange [0.01:20]\n" ); //fprintf( script, "set logscale x 10\n" ); fprintf( script, "set ylabel 'Sigma (km/s)'\n" ); fprintf( script, "plot 'sigma.dat' u 1:2:3 pt 7 ps 1 with errorbars\n"); fclose(script); warn = system("gnuplot script1.gpl"); return(warn); }
int main (void) { int i, j, warn, lim[13], counter; lim[0]=0.0; lim[1]=1.0; lim[2]=2.0; lim[3]=3.0; lim[4]=4.0; lim[5]=5.0; lim[6]=8.0; lim[7]=12.0; lim[8]=16.0; lim[9]=20.0; lim[10]=24.0; lim[11]=28.0; lim[12]=45.0; counter = 0.0; double pos[N],vel[N],err[N],vel_sq, sum; double mean, median, skew, sd, kurtosis; FILE *velo, *sig, *script; velo = fopen("velocity.dat", "r"); sig = fopen("sigma.dat","w"); for(i=0.0; i<N; i++) { fscanf(velo, "%lf %lf %lf", &pos[i], &vel[i], &err[i]); } //printf ("The sample mean is %g\n", mean); fclose(velo); for(j=0.0; j<12.0; j=j+1.0) { counter = 0.0; for(i = 0.0;(i)<=N; i++) { if( lim[j] <= pos[i] && pos[i] < lim[(j)+1] ) { counter++; gsl_sort (vel, 1, counter); mean = gsl_stats_mean(vel, 1, counter); median = gsl_stats_median_from_sorted_data (vel, 1, counter); sd = gsl_stats_sd (vel, 1, counter); skew = gsl_stats_skew(vel, 1, counter); kurtosis = gsl_stats_kurtosis (vel, 1, counter); } } printf("Particulas entre %d y %d es %d\n",lim[j],lim[j +1], counter); printf ("The sample mean is %g\n", mean); printf ("The median is %g\n", median); printf ("Standard deviation is %g\n", sd); printf ("Skewness is %g\n", skew); printf ("kurtosis is %g\n\n", kurtosis); //printf("Sigma in the bin is: %.2f\n\n", sig); fprintf(sig, "%.2f\t %.2f\n", (lim[j]+lim[j+1])*0.5, sd); } fclose(sig); script = fopen( "script1.gpl", "w" ); fprintf(script, "set grid\nset terminal png\nset output 'Sigma_vs_rad.png'\nset nokey\n"); fprintf( script, "set title 'Sigma vs Radius'\n" ); //fprintf( script, "set logscale x\n" ); fprintf( script, "set xlabel 'Radius in Arcmin'\n" ); //fprintf( script, "set yrange [25:100]\n" ); fprintf( script, "set ylabel 'Sigma (km/s)'\n" ); fprintf( script, "plot 'sigma.dat' u 1:2 pt 7 ps 1\n"); fclose(script); warn = system("gnuplot script1.gpl"); return(warn); }