sstat 0.0.2 → 0.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: beee6865b0bc618d70c67be9c3f000089416b24e
4
- data.tar.gz: 21761e26f6a5af3402d3adc1d12e4a2af33897ce
3
+ metadata.gz: 05e07132478ee73c200a313aa3c07cd4861216c3
4
+ data.tar.gz: 0fac54eb739c5c1a0799f405d25e44a37cb816f4
5
5
  SHA512:
6
- metadata.gz: d994e68d96cdebf07f8a2da62c14329eb0c65f29cedcc3c5f71563f6af7de1b1f480e608fa1a575d7129122dbf7da5d5a42976aac4ff9f27ef111c741dbcb0f2
7
- data.tar.gz: bbe5ab1b30dbaeee27995d678b2dcf64e8d5a0b456e263d12d8685464a95da119d4145deb431444a49c278b6846ad375e87e9c877ebdb63cb3a7d0b90d11bce3
6
+ metadata.gz: 0f3d87d88a4482fe56fe3f65bc20b182da4c536c45e607c9a5bea4d1656543662bc0990fd3545af90aa3e4b4fa589f1c751f7a2f2d1fa75578f2a5085980d5f8
7
+ data.tar.gz: 35d138ebf041f1b3e5735a8c325387e01a5e1eea43f07f833a4d2473fa5d33eb3b91ea448d61c85ce96c5cb61fff1295a58d3fbbaf4a1dee37019671ed9bef47
@@ -0,0 +1,14 @@
1
+ k
2
+
3
+ REQUIREsdfasdfjjjkksadfkjsdfkjj "bundler/setup"
4
+ require "simple_statistics"
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ # require "pry"
11
+ # Pry.start
12
+
13
+ require "irb"
14
+ IRB.start
@@ -0,0 +1,4 @@
1
+ require 'mkmf'
2
+ $CFLAGS << ' -std=gnu99 -Wno-declaration-after-statement'
3
+
4
+ create_makefile('sstat')
@@ -0,0 +1,274 @@
1
+ #ifndef _SSTAT_DISTRIBUTION_UTILITY_H_
2
+ #define _SSTAT_DISTRIBUTION_UTILITY_H_
3
+ #include "type_def.h"
4
+ static double
5
+ get_del (double x, double rational)
6
+ {
7
+ double xsq = 0.0;
8
+ double del = 0.0;
9
+ double result = 0.0;
10
+
11
+ xsq = floor (x * GAUSS_SCALE) / GAUSS_SCALE;
12
+ del = (x - xsq) * (x + xsq);
13
+ del *= 0.5;
14
+
15
+ result = exp (-0.5 * xsq * xsq) * exp (-1.0 * del) * rational;
16
+
17
+ return result;
18
+ }
19
+
20
+ /*
21
+ * Normal cdf for fabs(x) < 0.66291
22
+ */
23
+ static double
24
+ gauss_small (const double x)
25
+ {
26
+ unsigned int i;
27
+ double result = 0.0;
28
+ double xsq;
29
+ double xnum;
30
+ double xden;
31
+
32
+ const double a[5] = {
33
+ 2.2352520354606839287,
34
+ 161.02823106855587881,
35
+ 1067.6894854603709582,
36
+ 18154.981253343561249,
37
+ 0.065682337918207449113
38
+ };
39
+ const double b[4] = {
40
+ 47.20258190468824187,
41
+ 976.09855173777669322,
42
+ 10260.932208618978205,
43
+ 45507.789335026729956
44
+ };
45
+
46
+ xsq = x * x;
47
+ xnum = a[4] * xsq;
48
+ xden = xsq;
49
+
50
+ for (i = 0; i < 3; i++)
51
+ {
52
+ xnum = (xnum + a[i]) * xsq;
53
+ xden = (xden + b[i]) * xsq;
54
+ }
55
+
56
+ result = x * (xnum + a[3]) / (xden + b[3]);
57
+
58
+ return result;
59
+ }
60
+
61
+ /*
62
+ * Normal cdf for 0.66291 < fabs(x) < sqrt(32).
63
+ */
64
+ static double
65
+ gauss_medium (const double x)
66
+ {
67
+ unsigned int i;
68
+ double temp = 0.0;
69
+ double result = 0.0;
70
+ double xnum;
71
+ double xden;
72
+ double absx;
73
+
74
+ const double c[9] = {
75
+ 0.39894151208813466764,
76
+ 8.8831497943883759412,
77
+ 93.506656132177855979,
78
+ 597.27027639480026226,
79
+ 2494.5375852903726711,
80
+ 6848.1904505362823326,
81
+ 11602.651437647350124,
82
+ 9842.7148383839780218,
83
+ 1.0765576773720192317e-8
84
+ };
85
+ const double d[8] = {
86
+ 22.266688044328115691,
87
+ 235.38790178262499861,
88
+ 1519.377599407554805,
89
+ 6485.558298266760755,
90
+ 18615.571640885098091,
91
+ 34900.952721145977266,
92
+ 38912.003286093271411,
93
+ 19685.429676859990727
94
+ };
95
+
96
+ absx = fabs (x);
97
+
98
+ xnum = c[8] * absx;
99
+ xden = absx;
100
+
101
+ for (i = 0; i < 7; i++)
102
+ {
103
+ xnum = (xnum + c[i]) * absx;
104
+ xden = (xden + d[i]) * absx;
105
+ }
106
+
107
+ temp = (xnum + c[7]) / (xden + d[7]);
108
+
109
+ result = get_del (x, temp);
110
+
111
+ return result;
112
+ }
113
+
114
+ /*
115
+ * Normal cdf for
116
+ * {sqrt(32) < x < GAUSS_XUPPER} union { GAUSS_XLOWER < x < -sqrt(32) }.
117
+ */
118
+ static double
119
+ gauss_large (const double x)
120
+ {
121
+ int i;
122
+ double result;
123
+ double xsq;
124
+ double temp;
125
+ double xnum;
126
+ double xden;
127
+ double absx;
128
+
129
+ const double p[6] = {
130
+ 0.21589853405795699,
131
+ 0.1274011611602473639,
132
+ 0.022235277870649807,
133
+ 0.001421619193227893466,
134
+ 2.9112874951168792e-5,
135
+ 0.02307344176494017303
136
+ };
137
+ const double q[5] = {
138
+ 1.28426009614491121,
139
+ 0.468238212480865118,
140
+ 0.0659881378689285515,
141
+ 0.00378239633202758244,
142
+ 7.29751555083966205e-5
143
+ };
144
+
145
+ absx = fabs (x);
146
+ xsq = 1.0 / (x * x);
147
+ xnum = p[5] * xsq;
148
+ xden = xsq;
149
+
150
+ for (i = 0; i < 4; i++)
151
+ {
152
+ xnum = (xnum + p[i]) * xsq;
153
+ xden = (xden + q[i]) * xsq;
154
+ }
155
+
156
+ temp = xsq * (xnum + p[4]) / (xden + q[4]);
157
+ temp = (M_1_SQRT2PI - temp) / absx;
158
+
159
+ result = get_del (x, temp);
160
+
161
+ return result;
162
+ }
163
+
164
+ double
165
+ gsl_cdf_ugaussian_P (const double x)
166
+ {
167
+ double result;
168
+ double absx = fabs (x);
169
+
170
+ if (absx < GAUSS_EPSILON)
171
+ {
172
+ result = 0.5;
173
+ return result;
174
+ }
175
+ else if (absx < 0.66291)
176
+ {
177
+ result = 0.5 + gauss_small (x);
178
+ return result;
179
+ }
180
+ else if (absx < SQRT32)
181
+ {
182
+ result = gauss_medium (x);
183
+
184
+ if (x > 0.0)
185
+ {
186
+ result = 1.0 - result;
187
+ }
188
+
189
+ return result;
190
+ }
191
+ else if (x > GAUSS_XUPPER)
192
+ {
193
+ result = 1.0;
194
+ return result;
195
+ }
196
+ else if (x < GAUSS_XLOWER)
197
+ {
198
+ result = 0.0;
199
+ return result;
200
+ }
201
+ else
202
+ {
203
+ result = gauss_large (x);
204
+
205
+ if (x > 0.0)
206
+ {
207
+ result = 1.0 - result;
208
+ }
209
+ }
210
+
211
+ return result;
212
+ }
213
+
214
+ double
215
+ cdf_ugaussian_Q (const double x)
216
+ {
217
+ double result;
218
+ double absx = fabs (x);
219
+
220
+ if (absx < GAUSS_EPSILON)
221
+ {
222
+ result = 0.5;
223
+ return result;
224
+ }
225
+ else if (absx < 0.66291)
226
+ {
227
+ result = gauss_small (x);
228
+
229
+ if (x < 0.0)
230
+ {
231
+ result = fabs (result) + 0.5;
232
+ }
233
+ else
234
+ {
235
+ result = 0.5 - result;
236
+ }
237
+
238
+ return result;
239
+ }
240
+ else if (absx < SQRT32)
241
+ {
242
+ result = gauss_medium (x);
243
+
244
+ if (x < 0.0)
245
+ {
246
+ result = 1.0 - result;
247
+ }
248
+
249
+ return result;
250
+ }
251
+ else if (x > -(GAUSS_XLOWER))
252
+ {
253
+ result = 0.0;
254
+ return result;
255
+ }
256
+ else if (x < -(GAUSS_XUPPER))
257
+ {
258
+ result = 1.0;
259
+ return result;
260
+ }
261
+ else
262
+ {
263
+ result = gauss_large (x);
264
+
265
+ if (x < 0.0)
266
+ {
267
+ result = 1.0 - result;
268
+ }
269
+
270
+ }
271
+
272
+ return result;
273
+ }
274
+ #endif
@@ -0,0 +1,17 @@
1
+ #ifndef _SSTAT_GLOBAL_UTILITY_H_
2
+ #define _SSTAT_GLOBAL_UTILITY_H_
3
+ #include <stdio.h>
4
+ #include <stdlib.h>
5
+ #include "type_def.h"
6
+
7
+ int compare_double (const void * a, const void * b)
8
+ {
9
+ return *((double*)a) > *((double*)b)? 1 : 0;
10
+ }
11
+
12
+ int point_compare_x (const void * a, const void * b)
13
+ {
14
+ return ((struct point*)a)->x - ((struct point*)b)->x;
15
+ }
16
+
17
+ #endif
@@ -0,0 +1,6 @@
1
+ #ifndef _SURVIVAL_STAT_H_
2
+ #define _SURVIVAL_STAT_H_
3
+
4
+ #include "survival_func.h"
5
+
6
+ #endif
@@ -0,0 +1,47 @@
1
+ #ifndef _SURVIVAL_STAT_DEF_H_
2
+ #define _SURVIVAL_STAT_DEF_H_
3
+
4
+ #include "type_def.h"
5
+
6
+ /* Define survival stat data structure */
7
+ typedef struct Group_N
8
+ {
9
+ /* Time stands for the event time */
10
+ double* time;
11
+
12
+ /* How many people died at different event times */
13
+ int * uncensored;
14
+
15
+ /* How many people censored at different event times */
16
+ int * censored;
17
+
18
+ int size;
19
+
20
+ } Group_N;
21
+
22
+ void free_Group_N(struct Group_N* grp_n)
23
+ {
24
+ if(grp_n->time != NULL)
25
+ free(grp_n->time);
26
+
27
+ if(grp_n->uncensored != NULL )
28
+ free(grp_n->uncensored);
29
+
30
+ if(grp_n->censored != NULL )
31
+ free(grp_n->censored);
32
+ }
33
+
34
+ void put_Group_N(struct Group_N * grp_n)
35
+ {
36
+ int i;
37
+ puts("Start to print out Group N");
38
+ for( i = 0; i < grp_n->size; i++ )
39
+ {
40
+ printf("Time : %f -- Uncensored : %f -- Censored : %f \n",
41
+ grp_n-> time[i],
42
+ grp_n-> uncensored[i],
43
+ grp_n-> censored[i]);
44
+ }
45
+ }
46
+
47
+ #endif
@@ -0,0 +1,204 @@
1
+ #ifndef _SURVIVAL_STAT_FUNC_H_
2
+ #define _SURVIVAL_STAT_FUNC_H_
3
+
4
+ #include <stdio.h>
5
+ #include <stdlib.h>
6
+ #include "survival_def.h"
7
+ #include "survival_utility.h"
8
+
9
+ double precentile(double* array, int size, double target_percentile)
10
+ {
11
+ double percentage_each = 1.0 / size;
12
+ int i;
13
+ int count = 0;
14
+
15
+ for (i = 1; i <= size; i++)
16
+ {
17
+ if ( i * percentage_each < target_percentile )
18
+ {
19
+ count++;
20
+ } else
21
+ {
22
+ return array[count];
23
+ }
24
+ }
25
+
26
+ return array[size - 1];
27
+ }
28
+
29
+ int index_less_equal(double* array, int size, double target)
30
+ {
31
+ int i;
32
+
33
+ for (i = 0; i < size; i++)
34
+ {
35
+ if (array[i] > target)
36
+ return i;
37
+ }
38
+
39
+ return i;
40
+ }
41
+
42
+ double log_rank_test(double* time_1, int* censored_1, double* time_2, int* censored_2, int size_1, int size_2)
43
+ {
44
+ int i, time_pnt_size;
45
+ int index;
46
+
47
+ array merged_time_pnts = merge_two_array(time_1, size_1, time_2, size_2);
48
+ array merged_uniq_time_pnts = create_sorted_unique_array(merged_time_pnts.D_ptr, merged_time_pnts.size);
49
+
50
+ //The lengths of Group_N_1 and Group_N_2 are not expected to be same. Step 1. create unique time array which inlcude time points for both
51
+ Group_N Group_N_1 = group_N_given_range(time_1, censored_1, size_1, merged_uniq_time_pnts.D_ptr, merged_uniq_time_pnts.size);
52
+ Group_N Group_N_2 = group_N_given_range(time_2, censored_2, size_2, merged_uniq_time_pnts.D_ptr, merged_uniq_time_pnts.size);
53
+
54
+ double Z = 0;
55
+ double V_i_sum = 0;
56
+
57
+ Group_N combined_Group_N_1;
58
+ Group_N combined_Group_N_2;
59
+
60
+ combined_Group_N_1.uncensored = (int*) malloc(merged_uniq_time_pnts.size * sizeof(int));
61
+ combined_Group_N_1.censored = (int*) malloc(merged_uniq_time_pnts.size * sizeof(int));
62
+
63
+ combined_Group_N_2.uncensored = (int*) malloc(merged_uniq_time_pnts.size * sizeof(int));
64
+ combined_Group_N_2.censored = (int*) malloc(merged_uniq_time_pnts.size * sizeof(int));
65
+
66
+ //CAUTION: DO NOT SET TIME ARRAY HEERE, USE merged_uniq_time_pnts INSTEAD
67
+ combined_Group_N_1.time = NULL;
68
+ combined_Group_N_2.time = NULL;
69
+
70
+ time_pnt_size = merged_uniq_time_pnts.size;
71
+
72
+ int* N1_at_risk = (int*) malloc(time_pnt_size * sizeof(int));
73
+ int* N2_at_risk = (int*) malloc(time_pnt_size * sizeof(int));
74
+ int* N_i = (int*) malloc(time_pnt_size * sizeof(int));
75
+ int* O_i = (int*) malloc(time_pnt_size * sizeof(int));
76
+
77
+ double* E_i = (double*) malloc(time_pnt_size * sizeof(double));
78
+ double* V_i = (double*) malloc(time_pnt_size * sizeof(double));
79
+
80
+ //update at_risk for 1 and 2 based on combined_time_arr.
81
+ for (i = 0; i < time_pnt_size; ++i)
82
+ {
83
+ index = find_first_index_has(Group_N_1.time, Group_N_1.size, merged_uniq_time_pnts.D_ptr[i]);
84
+ if (index >= 0)
85
+ {
86
+ combined_Group_N_1.uncensored[i] = Group_N_1.uncensored[index];
87
+ combined_Group_N_1.censored[i] = Group_N_1.censored[index];
88
+ } else {
89
+
90
+ combined_Group_N_1.uncensored[i] = 0;
91
+ combined_Group_N_1.censored[i] = 0;
92
+ }
93
+ }
94
+
95
+ for (i = 0; i < time_pnt_size; ++i)
96
+ {
97
+ index = find_first_index_has(Group_N_2.time, Group_N_2.size, merged_uniq_time_pnts.D_ptr[i]);
98
+
99
+ if (index >= 0)
100
+ {
101
+ combined_Group_N_2.uncensored[i] = Group_N_2.uncensored[index];
102
+ combined_Group_N_2.censored[i] = Group_N_2.censored[index];
103
+ } else {
104
+ combined_Group_N_2.uncensored[i] = 0;
105
+ combined_Group_N_2.censored[i] = 0;
106
+ }
107
+ }
108
+
109
+ N1_at_risk[0] = size_1 - combined_Group_N_1.censored[0];
110
+ N2_at_risk[0] = size_2 - combined_Group_N_2.censored[0];
111
+
112
+ for (i = 1; i < time_pnt_size; ++i)
113
+ {
114
+ N1_at_risk[i] = N1_at_risk[i - 1] - combined_Group_N_1.uncensored[i - 1] - combined_Group_N_1.censored[i];
115
+ N2_at_risk[i] = N2_at_risk[i - 1] - combined_Group_N_2.uncensored[i - 1] - combined_Group_N_2.censored[i];
116
+
117
+ }
118
+
119
+ for (i = 0; i < time_pnt_size; ++i)
120
+ {
121
+ N_i[i] = N1_at_risk[i] + N2_at_risk[i];
122
+ O_i[i] = (combined_Group_N_1.uncensored[i] + combined_Group_N_2.uncensored[i]);
123
+ E_i[i] = 1.0 * N1_at_risk[i] * O_i[i] / N_i[i];
124
+
125
+ if (N_i[i] > 1)
126
+ {
127
+ V_i[i] = 1.0 * O_i[i]
128
+ * (1.0 * N1_at_risk[i] / N_i[i])
129
+ * (1 - 1.0 * N1_at_risk[i] / N_i[i])
130
+ * (N_i[i] - O_i[i]) / (N_i[i] - 1);
131
+
132
+ V_i_sum += V_i[i];
133
+ }
134
+
135
+ Z += (combined_Group_N_1.uncensored[i] - E_i[i]);
136
+ }
137
+
138
+ Z = Z / sqrt(V_i_sum);
139
+ free(Group_N_1.uncensored);
140
+ free(Group_N_1.censored);
141
+ free(Group_N_2.uncensored);
142
+ free(Group_N_2.censored);
143
+ free(merged_time_pnts.D_ptr);
144
+ free(merged_uniq_time_pnts.D_ptr);
145
+ free(N1_at_risk);
146
+ free(N2_at_risk);
147
+ free(N_i);
148
+ free(O_i);
149
+ free(E_i);
150
+ free(V_i);
151
+
152
+ return Z;
153
+ }
154
+
155
+ /*
156
+ * This function does not provide a normal kaplan meier curve. A extension based on the last 3 points is applied during the calculation of KM curve
157
+ */
158
+ int kaplan_meier_3p_extrapolation(double* time, int* censored, int size)
159
+ {
160
+
161
+ Group_N at_risk = group_N_self_range(time, censored, size);
162
+ printf("XXXXXXXXXXXXXXXXXXX \n");
163
+ puts_Group_N(&at_risk);
164
+ free_Group_N(at_risk);
165
+
166
+ return 0;
167
+ }
168
+
169
+ struct curve kaplan_meier(double* time, int* censored, int size)
170
+ {
171
+
172
+ int i, N;
173
+
174
+ Group_N at_risk = group_N_self_range(time, censored, size);
175
+
176
+ N = size;
177
+
178
+ struct point* KM = (struct point*) malloc(at_risk.size * sizeof(struct point));
179
+
180
+ for (i = 0; i < at_risk.size; i++)
181
+ {
182
+ if (i > 0)
183
+ {
184
+ N = (N - at_risk.uncensored[i - 1] - at_risk.censored[i - 1]);
185
+ KM[i].x = at_risk.time[i];
186
+ KM[i].y = 1.0 * (N - at_risk.uncensored[i] - at_risk.censored[i]) / (N - at_risk.censored[i]) * KM[i - 1].y;
187
+ } else {
188
+ KM[0].x = at_risk.time[i];
189
+ KM[0].y = 1.0 * (N - at_risk.uncensored[0] - at_risk.censored[0]) / (N - at_risk.censored[0]);
190
+ }
191
+ }
192
+
193
+ curve KM_curve;
194
+ KM_curve.point_array = KM;
195
+ KM_curve.size = at_risk.size;
196
+
197
+ free(at_risk.uncensored);
198
+ free(at_risk.censored);
199
+ free(at_risk.time);
200
+
201
+ return KM_curve;
202
+ }
203
+
204
+ #endif