From 01e01c035770ce61505bd7f541d9558addd7ff36 Mon Sep 17 00:00:00 2001 From: Jim Pollaro <30908497+pollaro@users.noreply.github.com> Date: Mon, 2 Mar 2026 09:22:02 -0600 Subject: [PATCH] [NET-303] Move KS test from Network Level Tests to QC (#137) * remove ks from network tests, plots work, need titles * added (crappy) title to normality plot and changed color scale * Exported mlapp files * remove some unused inputs and change some variable names * minor changes to ks plot * Exported mlapp files --------- Co-authored-by: Github Action --- +nla/+net/+test/KolmogorovSmirnovTest.m | 68 -------------------- +nla/+qualityControl/checkNormalityWithKS.m | 64 ++++++++++++++++++ NLAQualityControl.mlapp | Bin 16451 -> 14666 bytes docs/source/network_level_tests.rst | 10 --- docs/source/quality_control.rst | 0 5 files changed, 64 insertions(+), 78 deletions(-) delete mode 100644 +nla/+net/+test/KolmogorovSmirnovTest.m create mode 100644 +nla/+qualityControl/checkNormalityWithKS.m create mode 100644 docs/source/quality_control.rst diff --git a/+nla/+net/+test/KolmogorovSmirnovTest.m b/+nla/+net/+test/KolmogorovSmirnovTest.m deleted file mode 100644 index 1207f222..00000000 --- a/+nla/+net/+test/KolmogorovSmirnovTest.m +++ /dev/null @@ -1,68 +0,0 @@ -classdef KolmogorovSmirnovTest < handle - %KOLMOGOROVSMIRNOVTEST Kolmogorov-Smirnov test - properties (Constant) - name = "kolmogorov_smirnov" - display_name = "Kolmogorov-Smirnov" - statistics = ["ks_statistic", "single_sample_ks_statistic"] - ranking_statistic = "ks_statistic" - end - - methods - function obj = KolmogorovSmirnovTest() - end - - function result = run(obj, test_options, edge_test_results, network_atlas, permutations) - %RUN runs the Kolmogorov-Smirnov goodness of fit test - % test_options: The selected values for the test to be run. Formerly input_struct. Options are in nla.net.genBaseInputs - % edge_test_results: Non-permuted edge test results. Formerly edge_result - % network_atlas: Network atlas for data - - import nla.TriMatrix nla.TriMatrixDiag - - number_of_networks = network_atlas.numNets(); - - % Store results in the 'no_permutations' structure if this is the no-permutation test - permutation_results = "no_permutations"; - ks_statistic = "ks_statistic"; - p_value = "uncorrected_two_sample_p_value"; - single_sample_p_value = "uncorrected_single_sample_p_value"; - single_sample_ks_statistic = "single_sample_ks_statistic"; - if isequal(permutations, true) - % Otherwise, add it on to the back of the 'permutation_results' structure - permutation_results = "permutation_results"; - p_value = "two_sample_p_value_permutations"; - ks_statistic = strcat(ks_statistic, "_permutations"); - single_sample_p_value = "single_sample_p_value_permutations"; - single_sample_ks_statistic = strcat(single_sample_ks_statistic, "_permutations"); - end - - result = nla.net.result.NetworkTestResult(test_options, number_of_networks, obj.name, obj.display_name, obj.statistics, obj.ranking_statistic); - - % Double for-loop to iterate through trimatrix. Network is the row, network2 the column. Since - % we only care about the bottom half, second for-loop is 1:network - for network = 1:number_of_networks - for network2 = 1:network - network_rho = edge_test_results.coeff.get(network_atlas.nets(network).indexes,... - network_atlas.nets(network2).indexes); - [~, p, ks] = kstest2(network_rho, edge_test_results.coeff.v); - result.(permutation_results).(p_value).set(network, network2, p); - result.(permutation_results).(ks_statistic).set(network, network2, ks); - - [~, single_sample_p, single_sample_ks] = kstest(network_rho); - result.(permutation_results).(single_sample_p_value).set(network, network2, single_sample_p); - result.(permutation_results).(single_sample_ks_statistic).set(network, network2, single_sample_ks); - end - end - - end - end - - methods (Static) - function inputs = requiredInputs() - inputs = {... - nla.inputField.Integer('behavior_count', 'Test count:', 1, 1, Inf),... - nla.inputField.Number('prob_max', 'Net-level P threshold <', 0, 0.05, 1),... - }; - end - end -end \ No newline at end of file diff --git a/+nla/+qualityControl/checkNormalityWithKS.m b/+nla/+qualityControl/checkNormalityWithKS.m new file mode 100644 index 00000000..58ad6e39 --- /dev/null +++ b/+nla/+qualityControl/checkNormalityWithKS.m @@ -0,0 +1,64 @@ +function checkNormalityWithKS(fig, input_struct, test_pool) + + prog = uiprogressdlg(... + fig, 'Title', 'Checking Normaility', 'Message', 'Running Kolmogorov-Smirnov Test'... + ); + prog.Value = 0.02; + + prog.Value = 0.25; + edge_test_result = test_pool.runEdgeTest(input_struct); + + prog.Value = 0.5; + ks_result = runKolmogorovSmirnovTest(input_struct, edge_test_result); + + prog.Value = 0.75; + qcKSOutput(ks_result.p, input_struct) + +end + +function ks_result = runKolmogorovSmirnovTest(input_struct, edge_result) + import nla.TriMatrix nla.TriMatrixDiag + + ks_result = struct(); + number_of_networks = input_struct.net_atlas.numNets(); + ks_result.p = TriMatrix(number_of_networks, TriMatrixDiag.KEEP_DIAGONAL); + ks_result.ks = TriMatrix(number_of_networks, TriMatrixDiag.KEEP_DIAGONAL); + + for network1 = 1:number_of_networks + for network2 = 1:network1 + network_rho = edge_result.coeff.get(input_struct.net_atlas.nets(network1).indexes,... + input_struct.net_atlas.nets(network2).indexes); + [~, p, ks] = kstest(network_rho); + ks_result.p.set(network1, network2, p); + ks_result.ks.set(network1, network2, ks); + end + end +end + +function qcKSOutput(ks_result_p_value, edge_test_options) + % This will open the qc figure for the KS test + + network_test_options = nla.net.genBaseInputs(); + network_test_options.full_connectome = false; + network_test_options.within_network_pair = false; + network_test_options.fdr_correction = nla.net.mcc.None(); + edge_test_options.prob_max = 0.05; + default_discrete_colors = 1000; + + p_value_max = network_test_options.fdr_correction.correct(edge_test_options.net_atlas,... + edge_test_options, ''); + + color_map = nla.net.result.NetworkResultPlotParameter.getColormap(default_discrete_colors,... + p_value_max); + + fig = nla.gfx.createFigure(); + % Also remember to move this in read the docs + matrix_plot = nla.gfx.plots.MatrixPlot(fig, sprintf("Non-permuted Kolmogorov-Smirnov Test p-value\nSmaller values are less normal"), ks_result_p_value, edge_test_options.net_atlas.nets, nla.gfx.FigSize.LARGE,... + 'lower_limit', 0.00, 'upper_limit', p_value_max, 'color_map', color_map); + matrix_plot.displayImage(); + width = matrix_plot.image_dimensions('image_width'); + height = matrix_plot.image_dimensions('image_height'); + + fig.Position(3) = width; + fig.Position(4) = height; +end \ No newline at end of file diff --git a/NLAQualityControl.mlapp b/NLAQualityControl.mlapp index 335374a3ca51ea3e4278491630802eed3bdf9c9b..97ded08b78c03e85986dc5fa1ccfadf293310396 100644 GIT binary patch delta 13579 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 V{%i1HV928u&crq+wr$&diAQ_ zyY|_;>Qt{$r#^pBL?u~p2n-Mq5SV|1q+XA~2NaZ~eudEi6omu?i{y9gIwS~)2POyz zI!GcBHzv@bb)mS%h4a%AG6cbd z#wQ=++OTfs^6~L(22FMIJN*%<2lH2LN0#iHdma&v@Yx7ly)`lhS;tJzX9-Rdr*F;I z(8JEmxs%()_X;&35f?X}H_o2u(=gGVzZeJ?WJp<>JlX*@(r zm0V`9*U6uR$nvyjwm;-tU^J2@6Z&d?t&B`Ld-;Ojzo8>`Z)NRr8#8+GDxnxEVMPR6 z$s<9+_Q}&8^%J32iqpK-Pj5>NCDjmZtSf@X?KEoVuH9|%6(J|h2ijFVizqzO1iK94d--is5)X~1% zOS_PR6$=^D+*}_i^`jY6f?ncXkn@u_xi#U_P5PT`<&l_a(&k5ozwu0 z{l-7+D7dhY;>g)|5xjvwnFJr%5^_*DG!qkAc9=-x6%XM!FQp9n_;lxD8y_2{+_+T9 zWcSci2#{mZiURs&Wvq*jr_2$BZgBr|ovJK{PL&J&L^+SB~?uBzsb$7DFD zCO_#+d?{SSlHjXlf%X^G>r8^(qIpI2IQqKK>=a&D564fz-fwuYYv@Sq;fOqG4(iWX z%Jx;M)W3k?6WQO5#DqO4vzJxGeVvoCLcLiyEOOo8@_KkQw&(#yz#a1W%-It zPl-%8GtI`&IJqTfkCX^DkxXB=cSg`Jp~;w3f8(9z0;wN|)3#J)LkEC1RcaU9x`PHp zT=m>XkRo?0%Oir-4cABYj5xy{ra ziXyXDap26EEUnval8~b^t>Fy?Vb(KCzb&8siXTkSaZ)qv;%AJ5o)7QS)HJ-hg@xyT zac)Cgqjisczowbhb_F8Zc++==yidMul-ZBIx1=3X9=%j;ZC@jNT~YJk1?AFI62dx= zXrBMt;BZhmr0fdx3Q}W%X+e@GRqXlV;1L??tSfi_aUq<8&p;rTjmM>5VZ(Co^?Uba z@Ruca4*uHc@A&j!ua$<)!)>Seo8tSvDL6*WY9;+Q4_n`pjb#8=2RmM?FC`(DnJ&#u z@CDv=cFd+AVANvAC!xSQEj=jJw!lW#MF{7_hNuoaZB--95|36Xe}g`)Aj|r#!K$Vg zZ4B~2(FPxXBfKShKHP@{z6>D=O1EGl<8+wuJ)HX5mh=Y%YbFxSI5R3<5}0n`$pG0mw2ODbvCs*EYw3|mHUR;`^J~?{X^QG`^}+H>5ZXeX`v)Q zT1ZGlN>4;6TsqG18gcHc_?}PnjYwE?j`Z~?d}e0){jRA}(3kYn?Ck{okga3=8RVPS zuPOxi6T-p8$v&HB(IZ>S4D}cYibgkaDwdxvMs4!i9Ok7)bPM(zh4_#>JpRkEIVa)d ztO_Ml0cdNzNDmRqU<`v%a(#(xA1eC5ailfVIohxb2yiwaoJuLJiXZ&;9+-MwZoA)< zIIjrD9fzYUfn}Vns4J%la+-#XPo%4O5Fh9y+2Wh0h4beo?{*3{ovubrzh*X$k7x+- z0Fq%^LR{QMjBOrr;jkfiUi@&Yg#E{-_3S)Gx(yl@$_xqy>O7jVUCg*EdBjmm=~w($ryGAoC2@l~~S4G1C^y z*IcTpsAm(d-|ZQzrubWM>UlhP(EUJl`76u?X5<2zUgdYe886-PNto(OHg5TB6rJT`2@5VB2i@)D%(x(I!Dw$rsbu=sT}(@d^)^WdB7BXzb;E;F3y8n>P6ep?H&pC#zS4^2K&b* zIh;rl#AZCt@J3u`a5dn87e=qO0u@^#RR`+az*TPtYJ`>2Pb#a}CkUgJ@<9BNst zXFlI%ryB$VSbr58g@o};fv`{g#deTA=M3H^?{T6xsRh-F*3=j{RgHdSRRCP%;e13S zJ7}ZSDapYFuLZT*{f@&ym9sYfc*V?ppC)GM70A`B zuiU}xM_o3UyD%o^P2q`A1c5k8cG8StWcy_BTY-gmNUMqM&Y7_&WTZcGOc>j3c_Z{x z%iLMyHJD6?euJqp5{jH#+9x;_0?L2lwa;J(BNA#PY+|A{;>mfbi_k@6iM!J(Kn@Y z&evhn`T04$4sFgqt}=Pe4+>qb-xbXf+BxK{j5s2wyRfBaF0*icIB0fC>RW!fl|Oz! zQY0FvY9opOU$6YUnW&7fCb#A}T#9l9zO)xY-PXEC1;9mLYMlLUXuLxU3B|BeoO@gd zvC#?7r-ADZY$KBusD=TzgBcHOeXen7RsQtq=wWuF!DI-pm-m{`;ceBMG1dt?ntbprFwIg(pWJ7GgbQ9m>e2)8%38b<7Z2pmv9nR7& zMa2ft(z`cPQ)-9Mhw`&cC7W=%1qZ|c-@Gwip;c1$bTki~i|R!~F=s&gzKq;=%P1a^ z7d8&5LViQ1oSozPgooyxYNN5y?{;cxHYlXxInaJOwj|D83<#b+em2J-8c*7F{)LN_ z9TG@I&G_EngevEF>;x{aQ%G`g=ES9o`x^itGNw1418#}I7;$YddUuUWgiiPe(GF;EWjF^6(Mz0?^B{e`40T>6k!70|i) zX{^i1_@_BO;+`Ehtljuc7P(UMWbpXruQRw4W8ZI#P!2b}X7@SiT^wb~A(_)2D04yp zHv;!5gJvOhr{dA2gSJ9Yb_`)d1y=p5^=Z%vzedWW?__A{^x7l5JW3@@4K!mQw%9;C9}cWs74 zF87R;ZX_W+q+nE`yZUXixGIzzqij>4nXHskcp?|`(?(C{GfQwG4f^fb@s}$w`(}EM z%#z^I0j>#taH1%)*3n<+u)@}$!GI*unzaJS8fkUdwKE2l|4&UF$L-}G3V7=cHO2h`*f(x0p_|QhlxGD+6I7)xu z)7;=W$-DvVuy43UA)r5u%$kAZc*)E00fBB^_<7Knfg(7)6MwX-$Pq zPNE5dG?n=`bOq=l4^^?nBlO2;T$9@ZzYq1`woFZGbx7H_5t>LDjB(({3cb5|NJp?C zKd1S}rcMX_*QX}Nh%6y8vYd{uv8DIVjG5&{G1FujQW^6zZv)bE#b-l0o2EJ|3>c_Y zpaC!b5~9^5x>mlL z9k=I(KD{r2ri9wMvzBk}&F_|RRhB3kzg?h~EUA0+Qu>Na+c^hgl=UBvjm5)cSr42U zBVZ=n1AjC-ysG~7VYj>rv~K>f%gyfp-In2k{RT>nYJS$a(Ru}7d95{*kaS}&JX}aw zn99v0lq-*K)B*ws|C_-egNQxSzNJ+KQruuNZ>N z-;alobsjyf2|WRI!HSMT88^j&fvVUAv|}jq)-9+vLs+g`-P!EFYT_-giQI$N>NKo+ z-zq9JXE$2!b1Dk$gPep*diLexasCt!)- zdGu|@g;E$#)9cH>Yin+1fTk(wvMSmcWy^(*?A?t2eG>z!BY1aFxJjt+0}eQRLL^FB zhrM7i5|-QF_TSep^(%($y*Eq2J@EEteaT~blI>R&-s6HUX9Qj~uyt9RR zP%-`*(tHM%`se4?Sc~~T&K>?tJz~xL+7$>@Ub!ll!Tl73pwl8_|-C(Pt1~G5Z zU6cp^w=OY?W53utc<*H%#cEePYQMW<YmYsb3u+Jhi?GS+6BWV)%AP)nyhQ6mL1WB}ZX zV)boTggZ8)+yQa!6Vl#w{%ok91O`v#{vz(ZBGNNCm@L!-s|!!xkVu~nl)1EbfE
    |};dcVjPjI)%x`e{zS?^=5 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 aM@Ic0n{xU7dlNl!A{#dfR0;oot^Pmb51StV diff --git a/docs/source/network_level_tests.rst b/docs/source/network_level_tests.rst index db40d8a8..b9eff44b 100644 --- a/docs/source/network_level_tests.rst +++ b/docs/source/network_level_tests.rst @@ -53,16 +53,6 @@ Provided Tests * :math:`\textstyle E_i = \sum_{}\frac{\text{thresholded & binarized ROIs}}{\text{number of ROIs}} \scriptstyle * (\text{number of ROIs in the network-pair of interest})` * :math:`O_i`: non-permuted, nominally thresholded, and binarized edge-level *p*-values for the network-pair of interest -* **Kolmogorov-Smirnov** - - * MATLAB `kstest2 `_ function. - - *Inputs:* - * Edge-level correlation coefficients for the network-pair of interest - * Edge-level correlation coefficients across the full connectome - - * **Note**: This input is not used for single-sample tests - * **Wilcoxon rank-sum test** * MATLAB `ranksum `_ function. diff --git a/docs/source/quality_control.rst b/docs/source/quality_control.rst new file mode 100644 index 00000000..e69de29b