UNPKG

@bunchmark/stats

Version:

The bunchmark statistical routines.

150 lines (118 loc) 20 kB
import o from "ospec" import { mwu, mwUnaive, wilcoxon} from "../stats.js" const {abs} = Math const roughlyEquals = (ref, significant) => val => { const threshold = 1 / 10**(significant) const success = ( abs(val - ref) / abs(ref) < threshold && abs(val - ref) / abs(val) < threshold ) return success ? {pass: true} : {pass: false, message: `${val} and ${ref} have less than ${significant} significant digits in common`} } o("statistical tests", ()=>{ let s s = wilcoxon(...dataPair) o(s).deepEquals(wilcoxon(dataDiff)) o(s.T).equals(141) o(s.z).equals(-7.030049545241504) o(s.p).satisfies(roughlyEquals(2.0646021288265827e-12, 2)) s = wilcoxon(dataDiffWithZeros) o(s.T).equals(143) o(s.z).equals(-7.013049487483857) o(s.p).satisfies(roughlyEquals(2.3317892565393536e-12, 2)) s = wilcoxon(dataDiffWithTies) o(s.T).equals(149) o(s.z).equals(-6.990994731245785) o(s.p).satisfies(roughlyEquals(2.729440130554611e-12, 2)) s = wilcoxon(dataDiffWithBoth) o(s.T).equals(154) o(s.z).equals(-6.959301308559146) o(s.p).satisfies(roughlyEquals(3.4196443339155714e-12, 2)) o(()=>wilcoxon([1,2,3,4,5,6,7,8,9,10,11], [[1,2,3,4,5,6,7,8,9,10,11, 12]])).throws(RangeError) s = mwu(...dataPair) o(s).deepEquals(mwUnaive(...dataPair)) o(s.U).equals(4538) o(s.p).satisfies(roughlyEquals(8.324884918980824e-07, 2)) s = mwu(...dataPairWithTies) o(s).deepEquals(mwUnaive(...dataPairWithTies)) o(s.U).equals(4532.5) o(s.p).satisfies(roughlyEquals(9.177372527489687e-07, 2)) }) // const clone = x => JSON.parse(JSON.stringify(x)) const dataPair = [ [23.571374893188477,23.65754222869873,23.72883367538452,23.828625202178955,23.87404203414917,23.916083335876465,23.961249828338623,23.747458934783936,23.96508264541626,24.061416625976562,24.08549976348877,24.18179225921631,24.33966588973999,24.363874912261963,24.347167015075684,24.496209144592285,24.589707851409912,24.657249927520752,24.73716688156128,24.95045804977417,24.958959102630615,24.977375030517578,24.015583038330078,25.158709049224854,25.167458057403564,25.219165802001953,25.2357497215271,25.19974994659424,25.197792053222656,25.486207962036133,25.514957904815674,25.60004234313965,26.05774974822998,26.032791137695312,26.05775022506714,26.074124813079834,26.252624988555908,26.171082973480225,26.446041107177734,26.588125228881836,26.529458045959473,26.563082695007324,26.511332988739014,26.62849998474121,26.695416927337646,26.899916172027588,26.943583011627197,26.94474983215332,27.088292121887207,27.610249996185303,27.18829107284546,27.252124786376953,27.597750186920166,27.139209270477295,27.639625072479248,27.94141721725464,27.665249824523926,28.069249629974365,28.08887481689453,30.98341703414917,28.422917366027832,29.50854206085205,33.39312505722046,32.221750259399414,28.430790901184082,30.013750076293945,29.80745792388916,33.76300001144409,35.36525011062622,36.135375022888184,35.76216697692871,37.02025032043457,41.15950012207031,42.00858402252197,43.77966594696045,70.82854223251343,24.345624923706055,24.815541744232178,29.246041297912598], [23.42308282852173,23.464624881744385,23.689208030700684,23.51579189300537,23.60925006866455,23.523624897003174,23.710041046142578,23.711124897003174,23.712584018707275,23.729415893554688,23.73733377456665,23.755374908447266,23.772292137145996,23.809707641601562,23.814375400543213,23.845666885375977,23.879458904266357,23.89008331298828,23.892457962036133,23.89408302307129,23.920499801635742,24.021084308624268,24.023958206176758,24.066625118255615,24.079708099365234,24.100499629974365,24.11762523651123,24.188499927520752,24.269667148590088,24.12012481689453,24.294958114624023,24.32154083251953,24.35620927810669,24.3746657371521,24.382541179656982,24.395166397094727,24.457333087921143,24.444124698638916,24.493374824523926,24.534957885742188,24.688875198364258,24.56454086303711,24.598604440689087,24.678458213806152,24.60908317565918,24.558916568756104,24.69362497329712,24.730207920074463,24.73591661453247,24.74945831298828,24.844624996185303,24.882291793823242,24.978000164031982,25.044540882110596,25.25120782852173,25.32479190826416,25.419415950775146,25.56991672515869,25.642333984375,25.795540809631348,25.719333171844482,25.835875034332275,25.989209175109863,26.00016736984253,26.130000114440918,25.94004201889038,26.13904094696045,26.39329195022583,26.659125328063965,26.664207935333252,26.702499866485596,26.768208980560303,26.869874954223633,27.388332843780518,27.83220911026001,29.10949993133545,27.167250156402588,47.360459327697754,28.970749855041504] ] const pairTie = dataPair[0][5] const dataPairWithTies = clone(dataPair) dataPairWithTies[0][6]= pairTie dataPairWithTies[0][9]= pairTie dataPairWithTies[1][19]= pairTie const dataDiff = dataPair[0].map((x, i)=> x - dataPair[1][i]) const dataDiffWithZeros = clone(dataDiff) dataDiffWithZeros[1] = dataDiffWithZeros[2] = 0 const dataDiffWithTies = clone(dataDiff) const tie = dataDiffWithTies[2] dataDiffWithTies[3] = dataDiffWithTies[4] = -tie const dataDiffWithBoth = clone(dataDiff) dataDiffWithBoth[1] = dataDiffWithBoth[2] = 0 dataDiffWithBoth[3] = dataDiffWithBoth[4] = -tie const dump = () => { console.log('dataPair = ', JSON.stringify(dataPair)) console.log('dataPairWithTies = ', JSON.stringify(dataPairWithTies)) console.log('dataDiff = ', JSON.stringify(dataDiff)) console.log('dataDiffWithZeros = ', JSON.stringify(dataDiffWithZeros)) console.log('dataDiffWithTies = ', JSON.stringify(dataDiffWithTies)) console.log('dataDiffWithBoth = ', JSON.stringify(dataDiffWithBoth)) } // dump() /* dataPair = [ [23.571374893188477,23.65754222869873,23.72883367538452,23.828625202178955,23.87404203414917,23.916083335876465,23.961249828338623,23.747458934783936,23.96508264541626,24.061416625976562,24.08549976348877,24.18179225921631,24.33966588973999,24.363874912261963,24.347167015075684,24.496209144592285,24.589707851409912,24.657249927520752,24.73716688156128,24.95045804977417,24.958959102630615,24.977375030517578,24.015583038330078,25.158709049224854,25.167458057403564,25.219165802001953,25.2357497215271,25.19974994659424,25.197792053222656,25.486207962036133,25.514957904815674,25.60004234313965,26.05774974822998,26.032791137695312,26.05775022506714,26.074124813079834,26.252624988555908,26.171082973480225,26.446041107177734,26.588125228881836,26.529458045959473,26.563082695007324,26.511332988739014,26.62849998474121,26.695416927337646,26.899916172027588,26.943583011627197,26.94474983215332,27.088292121887207,27.610249996185303,27.18829107284546,27.252124786376953,27.597750186920166,27.139209270477295,27.639625072479248,27.94141721725464,27.665249824523926,28.069249629974365,28.08887481689453,30.98341703414917,28.422917366027832,29.50854206085205,33.39312505722046,32.221750259399414,28.430790901184082,30.013750076293945,29.80745792388916,33.76300001144409,35.36525011062622,36.135375022888184,35.76216697692871,37.02025032043457,41.15950012207031,42.00858402252197,43.77966594696045,70.82854223251343,24.345624923706055,24.815541744232178,29.246041297912598], [23.42308282852173,23.464624881744385,23.689208030700684,23.51579189300537,23.60925006866455,23.523624897003174,23.710041046142578,23.711124897003174,23.712584018707275,23.729415893554688,23.73733377456665,23.755374908447266,23.772292137145996,23.809707641601562,23.814375400543213,23.845666885375977,23.879458904266357,23.89008331298828,23.892457962036133,23.89408302307129,23.920499801635742,24.021084308624268,24.023958206176758,24.066625118255615,24.079708099365234,24.100499629974365,24.11762523651123,24.188499927520752,24.269667148590088,24.12012481689453,24.294958114624023,24.32154083251953,24.35620927810669,24.3746657371521,24.382541179656982,24.395166397094727,24.457333087921143,24.444124698638916,24.493374824523926,24.534957885742188,24.688875198364258,24.56454086303711,24.598604440689087,24.678458213806152,24.60908317565918,24.558916568756104,24.69362497329712,24.730207920074463,24.73591661453247,24.74945831298828,24.844624996185303,24.882291793823242,24.978000164031982,25.044540882110596,25.25120782852173,25.32479190826416,25.419415950775146,25.56991672515869,25.642333984375,25.795540809631348,25.719333171844482,25.835875034332275,25.989209175109863,26.00016736984253,26.130000114440918,25.94004201889038,26.13904094696045,26.39329195022583,26.659125328063965,26.664207935333252,26.702499866485596,26.768208980560303,26.869874954223633,27.388332843780518,27.83220911026001,29.10949993133545,27.167250156402588,47.360459327697754,28.970749855041504] ] dataPairWithTies = [[ 23.571374893188477,23.65754222869873,23.72883367538452,23.828625202178955,23.87404203414917,23.916083335876465,23.916083335876465,23.747458934783936,23.96508264541626,23.916083335876465,24.08549976348877,24.18179225921631,24.33966588973999,24.363874912261963,24.347167015075684,24.496209144592285,24.589707851409912,24.657249927520752,24.73716688156128,24.95045804977417,24.958959102630615,24.977375030517578,24.015583038330078,25.158709049224854,25.167458057403564,25.219165802001953,25.2357497215271,25.19974994659424,25.197792053222656,25.486207962036133,25.514957904815674,25.60004234313965,26.05774974822998,26.032791137695312,26.05775022506714,26.074124813079834,26.252624988555908,26.171082973480225,26.446041107177734,26.588125228881836,26.529458045959473,26.563082695007324,26.511332988739014,26.62849998474121,26.695416927337646,26.899916172027588,26.943583011627197,26.94474983215332,27.088292121887207,27.610249996185303,27.18829107284546,27.252124786376953,27.597750186920166,27.139209270477295,27.639625072479248,27.94141721725464,27.665249824523926,28.069249629974365,28.08887481689453,30.98341703414917,28.422917366027832,29.50854206085205,33.39312505722046,32.221750259399414,28.430790901184082,30.013750076293945,29.80745792388916,33.76300001144409,35.36525011062622,36.135375022888184,35.76216697692871,37.02025032043457,41.15950012207031,42.00858402252197,43.77966594696045,70.82854223251343,24.345624923706055,24.815541744232178,29.246041297912598], [23.42308282852173,23.464624881744385,23.689208030700684,23.51579189300537,23.60925006866455,23.523624897003174,23.710041046142578,23.711124897003174,23.712584018707275,23.729415893554688,23.73733377456665,23.755374908447266,23.772292137145996,23.809707641601562,23.814375400543213,23.845666885375977,23.879458904266357,23.89008331298828,23.892457962036133,23.916083335876465,23.920499801635742,24.021084308624268,24.023958206176758,24.066625118255615,24.079708099365234,24.100499629974365,24.11762523651123,24.188499927520752,24.269667148590088,24.12012481689453,24.294958114624023,24.32154083251953,24.35620927810669,24.3746657371521,24.382541179656982,24.395166397094727,24.457333087921143,24.444124698638916,24.493374824523926,24.534957885742188,24.688875198364258,24.56454086303711,24.598604440689087,24.678458213806152,24.60908317565918,24.558916568756104,24.69362497329712,24.730207920074463,24.73591661453247,24.74945831298828,24.844624996185303,24.882291793823242,24.978000164031982,25.044540882110596,25.25120782852173,25.32479190826416,25.419415950775146,25.56991672515869,25.642333984375,25.795540809631348,25.719333171844482,25.835875034332275,25.989209175109863,26.00016736984253,26.130000114440918,25.94004201889038,26.13904094696045,26.39329195022583,26.659125328063965,26.664207935333252,26.702499866485596,26.768208980560303,26.869874954223633,27.388332843780518,27.83220911026001,29.10949993133545,27.167250156402588,47.360459327697754,28.970749855041504] ] dataDiff = [0.14829206466674805,0.1929173469543457,0.03962564468383789,0.312833309173584,0.26479196548461914,0.392458438873291,0.2512087821960449,0.03633403778076172,0.2524986267089844,0.332000732421875,0.34816598892211914,0.42641735076904297,0.5673737525939941,0.5541672706604004,0.5327916145324707,0.6505422592163086,0.7102489471435547,0.7671666145324707,0.8447089195251465,1.0563750267028809,1.038459300994873,0.9562907218933105,-0.008375167846679688,1.0920839309692383,1.08774995803833,1.118666172027588,1.1181244850158691,1.0112500190734863,0.9281249046325684,1.3660831451416016,1.2199997901916504,1.2785015106201172,1.701540470123291,1.658125400543213,1.6752090454101562,1.6789584159851074,1.7952919006347656,1.7269582748413086,1.9526662826538086,2.0531673431396484,1.8405828475952148,1.9985418319702148,1.9127285480499268,1.9500417709350586,2.086333751678467,2.3409996032714844,2.249958038330078,2.2145419120788574,2.3523755073547363,2.8607916831970215,2.3436660766601562,2.369832992553711,2.6197500228881836,2.094668388366699,2.3884172439575195,2.6166253089904785,2.2458338737487793,2.499332904815674,2.4465408325195312,5.187876224517822,2.7035841941833496,3.6726670265197754,7.403915882110596,6.221582889556885,2.300790786743164,4.0737080574035645,3.668416976928711,7.369708061218262,8.706124782562256,9.471167087554932,9.059667110443115,10.252041339874268,14.28962516784668,14.620251178741455,15.94745683670044,41.71904230117798,-2.821625232696533,-22.544917583465576,0.27529144287109375] dataDiffWithZeros = [0.14829206466674805,0,0,0.312833309173584,0.26479196548461914,0.392458438873291,0.2512087821960449,0.03633403778076172,0.2524986267089844,0.332000732421875,0.34816598892211914,0.42641735076904297,0.5673737525939941,0.5541672706604004,0.5327916145324707,0.6505422592163086,0.7102489471435547,0.7671666145324707,0.8447089195251465,1.0563750267028809,1.038459300994873,0.9562907218933105,-0.008375167846679688,1.0920839309692383,1.08774995803833,1.118666172027588,1.1181244850158691,1.0112500190734863,0.9281249046325684,1.3660831451416016,1.2199997901916504,1.2785015106201172,1.701540470123291,1.658125400543213,1.6752090454101562,1.6789584159851074,1.7952919006347656,1.7269582748413086,1.9526662826538086,2.0531673431396484,1.8405828475952148,1.9985418319702148,1.9127285480499268,1.9500417709350586,2.086333751678467,2.3409996032714844,2.249958038330078,2.2145419120788574,2.3523755073547363,2.8607916831970215,2.3436660766601562,2.369832992553711,2.6197500228881836,2.094668388366699,2.3884172439575195,2.6166253089904785,2.2458338737487793,2.499332904815674,2.4465408325195312,5.187876224517822,2.7035841941833496,3.6726670265197754,7.403915882110596,6.221582889556885,2.300790786743164,4.0737080574035645,3.668416976928711,7.369708061218262,8.706124782562256,9.471167087554932,9.059667110443115,10.252041339874268,14.28962516784668,14.620251178741455,15.94745683670044,41.71904230117798,-2.821625232696533,-22.544917583465576,0.27529144287109375] dataDiffWithTies = [0.14829206466674805,0.1929173469543457,0.03962564468383789,-0.03962564468383789,-0.03962564468383789,0.392458438873291,0.2512087821960449,0.03633403778076172,0.2524986267089844,0.332000732421875,0.34816598892211914,0.42641735076904297,0.5673737525939941,0.5541672706604004,0.5327916145324707,0.6505422592163086,0.7102489471435547,0.7671666145324707,0.8447089195251465,1.0563750267028809,1.038459300994873,0.9562907218933105,-0.008375167846679688,1.0920839309692383,1.08774995803833,1.118666172027588,1.1181244850158691,1.0112500190734863,0.9281249046325684,1.3660831451416016,1.2199997901916504,1.2785015106201172,1.701540470123291,1.658125400543213,1.6752090454101562,1.6789584159851074,1.7952919006347656,1.7269582748413086,1.9526662826538086,2.0531673431396484,1.8405828475952148,1.9985418319702148,1.9127285480499268,1.9500417709350586,2.086333751678467,2.3409996032714844,2.249958038330078,2.2145419120788574,2.3523755073547363,2.8607916831970215,2.3436660766601562,2.369832992553711,2.6197500228881836,2.094668388366699,2.3884172439575195,2.6166253089904785,2.2458338737487793,2.499332904815674,2.4465408325195312,5.187876224517822,2.7035841941833496,3.6726670265197754,7.403915882110596,6.221582889556885,2.300790786743164,4.0737080574035645,3.668416976928711,7.369708061218262,8.706124782562256,9.471167087554932,9.059667110443115,10.252041339874268,14.28962516784668,14.620251178741455,15.94745683670044,41.71904230117798,-2.821625232696533,-22.544917583465576,0.27529144287109375] dataDiffWithBoth = [0.14829206466674805,0,0,-0.03962564468383789,-0.03962564468383789,0.392458438873291,0.2512087821960449,0.03633403778076172,0.2524986267089844,0.332000732421875,0.34816598892211914,0.42641735076904297,0.5673737525939941,0.5541672706604004,0.5327916145324707,0.6505422592163086,0.7102489471435547,0.7671666145324707,0.8447089195251465,1.0563750267028809,1.038459300994873,0.9562907218933105,-0.008375167846679688,1.0920839309692383,1.08774995803833,1.118666172027588,1.1181244850158691,1.0112500190734863,0.9281249046325684,1.3660831451416016,1.2199997901916504,1.2785015106201172,1.701540470123291,1.658125400543213,1.6752090454101562,1.6789584159851074,1.7952919006347656,1.7269582748413086,1.9526662826538086,2.0531673431396484,1.8405828475952148,1.9985418319702148,1.9127285480499268,1.9500417709350586,2.086333751678467,2.3409996032714844,2.249958038330078,2.2145419120788574,2.3523755073547363,2.8607916831970215,2.3436660766601562,2.369832992553711,2.6197500228881836,2.094668388366699,2.3884172439575195,2.6166253089904785,2.2458338737487793,2.499332904815674,2.4465408325195312,5.187876224517822,2.7035841941833496,3.6726670265197754,7.403915882110596,6.221582889556885,2.300790786743164,4.0737080574035645,3.668416976928711,7.369708061218262,8.706124782562256,9.471167087554932,9.059667110443115,10.252041339874268,14.28962516784668,14.620251178741455,15.94745683670044,41.71904230117798,-2.821625232696533,-22.544917583465576,0.27529144287109375] def p(x) : print(x) print(x.zstatistic) from scipy import stats p(stats.wilcoxon(dataPair[0], dataPair[1], zero_method='pratt', correction=True, alternative='two-sided', method='approx')) p(stats.wilcoxon(dataDiff, zero_method='pratt', correction=True, alternative='two-sided', method='approx')) p(stats.wilcoxon(dataDiffWithZeros, zero_method='pratt', correction=True, alternative='two-sided', method='approx')) p(stats.wilcoxon(dataDiffWithTies, zero_method='pratt', correction=True, alternative='two-sided', method='approx')) p(stats.wilcoxon(dataDiffWithBoth, zero_method='pratt', correction=True, alternative='two-sided', method='approx')) stats.mannwhitneyu(dataPair[0], dataPair[1], use_continuity=True, alternative='two-sided', axis=0, method='asymptotic') stats.mannwhitneyu(dataPairWithTies[0], dataPairWithTies[1], use_continuity=True, alternative='two-sided', axis=0, method='asymptotic') */ /* >>> scipy.version <module 'scipy.version' from '/opt/homebrew/lib/python3.9/site-packages/scipy/version.py'> >>> p(stats.wilcoxon(dataPair[0], dataPair[1], zero_method='pratt', correction=True, alternative='two-sided', method='approx')) WilcoxonResult(statistic=141.0, pvalue=2.0646021288265827e-12) -7.030049545241504 >>> p(stats.wilcoxon(dataDiff, zero_method='pratt', correction=True, alternative='two-sided', method='approx')) WilcoxonResult(statistic=141.0, pvalue=2.0646021288265827e-12) -7.030049545241504 >>> p(stats.wilcoxon(dataDiffWithZeros, zero_method='pratt', correction=True, alternative='two-sided', method='approx')) WilcoxonResult(statistic=143.0, pvalue=2.3317892565393536e-12) -7.013049487483857 >>> p(stats.wilcoxon(dataDiffWithTies, zero_method='pratt', correction=True, alternative='two-sided', method='approx')) WilcoxonResult(statistic=149.0, pvalue=2.729440130554611e-12) -6.990994731245785 >>> p(stats.wilcoxon(dataDiffWithBoth, zero_method='pratt', correction=True, alternative='two-sided', method='approx')) WilcoxonResult(statistic=154.0, pvalue=3.4196443339155714e-12) -6.959301308559146 >>> >>> stats.mannwhitneyu(dataPair[0], dataPair[1], use_continuity=True, alternative='two-sided', axis=0, method='asymptotic') MannwhitneyuResult(statistic=4538.0, pvalue=8.324884918980824e-07) >>> stats.mannwhitneyu(dataPairWithTies[0], dataPairWithTies[1], use_continuity=True, alternative='two-sided', axis=0, method='asymptotic') MannwhitneyuResult(statistic=4532.5, pvalue=9.177372527489687e-07) */