From e0a8bcbfb229e30266ab6860fd5b929b649824b2 Mon Sep 17 00:00:00 2001 From: Florence Bockting Date: Fri, 27 Mar 2026 13:16:33 +0200 Subject: [PATCH 1/5] feat: update print.loo to support kfold pareto-k diagnostics --- R/print.R | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/R/print.R b/R/print.R index f05834d6..70f69707 100644 --- a/R/print.R +++ b/R/print.R @@ -22,6 +22,18 @@ print.loo <- function(x, digits = 1, ...) { } cat("\n") print(.fr(as.data.frame(x$estimates), digits), quote = FALSE) + + if (inherits(x, "kfold") & "diagnostics" %in% names(x)) { + cat("------\n") + S <- dim(x)[1] + k_threshold <- ps_khat_threshold(S) + if (length(pareto_k_ids(x, threshold = k_threshold))) { + cat("\n") + } + print(pareto_k_table(x), digits = digits) + cat(.k_help()) + } + return(invisible(x)) } From 0efb8b18f476e14c3640ae7fd60a3635b529bcbf Mon Sep 17 00:00:00 2001 From: Florence Bockting Date: Fri, 27 Mar 2026 13:18:43 +0200 Subject: [PATCH 2/5] tests: add unittest for updated print method and test data --- .../data-for-tests/kfold-calibrated.Rds | Bin 0 -> 6122 bytes .../data-for-tests/kfold-miscalibrated.Rds | Bin 0 -> 7822 bytes tests/testthat/data-for-tests/kfold-notes.md | 31 ++++++++++++++++++ tests/testthat/test_print_plot.R | 21 ++++++++++++ 4 files changed, 52 insertions(+) create mode 100644 tests/testthat/data-for-tests/kfold-calibrated.Rds create mode 100644 tests/testthat/data-for-tests/kfold-miscalibrated.Rds create mode 100644 tests/testthat/data-for-tests/kfold-notes.md diff --git a/tests/testthat/data-for-tests/kfold-calibrated.Rds b/tests/testthat/data-for-tests/kfold-calibrated.Rds new file mode 100644 index 0000000000000000000000000000000000000000..49cb75ee2364e0dc79042b39ff112869d056004c GIT binary patch literal 6122 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 E0I5HHIRF3v literal 0 HcmV?d00001 diff --git a/tests/testthat/data-for-tests/kfold-miscalibrated.Rds b/tests/testthat/data-for-tests/kfold-miscalibrated.Rds new file mode 100644 index 0000000000000000000000000000000000000000..e6140f33f5b6209a2edba8ad6c880e8c88237eee GIT binary patch literal 7822 zcmXw2bwHE**C(V~Qqs7Dba$sB-HkAMgfvKlbg4+k5JX_)=#Y>u>5fs-IjO;j_wje{ zyT5kM_rxd8!xWE;_P-xy(W1Yk{@8=)DTruL!=|-Cp562^3r10(bMjgKQ<3~7m5XbU zlB0Hm@Ta(MAG3w*K76!E7dC#J>P*IU-qzNCak+;;o$Me)w{yfiEd=aGmz#H_$K2Nn z+2SHLey`<=Hf5Ai%-whoQ`7LCDL$;o!3cPDU2l0mtLt>E5fbjZE^;EZ@Y2*>nHs64 zMuI4D87`X`8RMwK`E0TaL>DsqVcIzqClJwN2_OCxoL!XmN4{c zHP6|7I42A^&-HpP19&n89gNp29w%#fF^=`N)F-^zw+@`IbC3WzSdq*&1*-)#E*d+J zH@rSoK9Cs6g)$9UA_#a!kXzg)vkAY-(~CeL&s(!!^67 zf}9WQ1516YAfufw!j?cN_iXwUm%2p_qnisFz9F`+RVDQxL1PQb8jIxN83BogbBo;d z&PJOi%wV)sJrOcety^#RaMfrJ8!~*SyrhF(_R@t=D!V*p?)#CM5Jx|iX@FSdy{>xq zb1p|j(h>v|5#dtneePi7-k$uB7jW+f@3(4B||c6R_U%` zU`1!~@%re4*LV8w<_X>fJ+{?Z^J)j86*MC|^NU8DBrtcX)+K^$grxg5 zdM3@Y^4lSc^k4Bw7gjbVTVHpKdW`-VxArBnNU2FLmRF$|j&iqf)>iG`=dzwq?!7QF zLB^dC{}U7WrzVFkj|6ndZ`k)jKe*i4f{t$o^-NO4r}mfMg7!!&|IOv_fGDS3$8nDg zKMsueC{z1l$%B)#;i9Is&x13Bn+3|ej5j>Vec<-aKejig$#muR3M931Oyt|Ty|z-e zms$I`h}ZBO<&wj9X~gzm;pSdKO11swbU*;yHA!b1(rf$8DywG?J*;<*mo7P>hbtME zv)RkfG1Om_s^hHysY#6udnFR5UV_Wct$I?}vDvmLP#2Y&s&}CTLB37eS}x(xBO42T zw|^fPM$b8&^0A}K8*i4lW6x4j7dzfpj2^^6^;3Xz2rQJvCP-Sw<`N)*`NsH$z-?>2 zkM>zJCb4H?^|5DEx$Pa!NWHj()`TiuJg#BP-k3(Ob)*b8pI=e+@8MfSUM0myp~*La zOJ!`+SI*_)z6O+2E$T7`u~*iE+ldoS5RJF~4D0r9(tY0c!ZXzSn@p;AKRjGK%|_!) zgNfx&UrHHBe824ThAaHIm>fh-PtbCvG>JTOGv(NRpJVI1O%c;;fzuOmG?gc=IiV7K zL>T?H9F*Rscu0NbSwLGa!F@$VRarj?)fMhOyQ1^so~-W{EW+I(kR$i|UV0mM*DIZI zg-H4k6wgxapr+z;5T0se`eNsF8}p=ZKC6c%{N$sIoPEd1z|OS6#{?=3!g2Mw z$muI6>xaG&qVc1WngzJ$-1-U%BwGm> zkyg*bzMUUKYGE8#WCE-pa?Z98GJF3Q5>)dl0^3}tKk)+-P7SK?%L$6Y`_CFd2$ZGo z;n;j47DI58l8=t=-Lqz!{??21Sx}_I?S;cF$M()xbwFm+KifA{ptG?zz9UZtc!St` zB6hr2%jQikt~-JS8_l+9Lh#;*eHYLD!5XvGMXNs|p-_F(3Ju@gp*c%0NsPy@=sKI` zhHREO_2&4`ZtU2yRzLs4&)3lvp_CPWdU?iWw2pfGMGP)LX~->qD%R-re4F32oX5T@ zjPkl&MAgDHI`@zo>SPxK+Eajct!T1w)?4;oD;eT_XCQg^$QM1$--msEp_mq2)22qu z$kQ3uw;V1!j#f5=EqQeHrdNIo8^`V?ybF8I*6D^W5s@`bQ#=)>Ql0g#en##3)yT8A z6QD0{p+Yl~Uq+;v`orJvtKtPyG$0@^P%B??%K}eM9{5hAqreh@9N8$|WN_dBry&ui ziDw7MPMd!__sK@f2p3(vOuX4RlIs!pcTCz6oW4hn5TOeH&E==u5OX@`Ywb7suJB#~ z!DIBa(bZiXB144>7JjcALM5?3Uz)qN`?HQo+sE+-q2$%>O4~s>xVr1EhVedrNVoL! zx8s`H)YN&GO`X?YYb*T>W-%j1bL`65K1$C*E8-Ut9=&MHwvP*UT9Y zdInrAOpWb1f!%_Y7%rfG?`78q7r5kgxZ|bISHQ`SP=S{Wf zXUHeUX_L+BQ}}t_e#)!!!q|RNA)Im=xz@BRHbsp|K|_^I7U-Tt;6$QkNHx>@R`Q*5 z?Hs1KAFYg?)M;!IRweZibI7YuK_a9UQUU*)aUTtyC10qI$mNsNM}NYiY?M2t$O&ol zybp%Vzjro@KS2~>?R=drmOqG&cPqelO3xY~#lj{$3y6}XqfJU`3NULTYJ*=q6H(*G zye(+smsrdRvv5%Uj+h_U_O6RDEEVZHR2J=f;KlAH6Ou9^`H+9hK)FSIt^Vl z4hwrKN!mc-{bPK^H)2#$s%RhxYO~u9C;yAfI&HVkGr=rsoq1|FCgYKZg-dg4m%vbm zRD*S~+-2w^(2*A{Ej-A!XXOlyrZlNcefSlczOvi&;f|KWty9%yR1mjO=l(55zYyN; zk!hy$wjjE);g@giE>a|UN8db%2d1>$?mxFR4n2D-DPr0mk}6+Cyy*HWrh6B@Ie}c{ z!zT)G(>bLq3S*4$&Hf$d=-_ana`{5$R<5n7!7=tN-L&rE>RPcQL7v#C@AR9m5yw@- z*N0cOp?P}dXR!*Tf^E$;0TO63Wyq1`DF4ld}%}Ge`P8wdJxdkN+Gi-#hvGmybXAoj3Q6_B)us_M?XjNcP z)(=gN2)sLtyLWh(Y;Yn4$DQuqe%ov&L~YAJ!kfB+BezNh`C((6U_mW@?FnWHWsS^) zdo=E{!RjE|S{h$_d0cz#btu^2H5M0lZnzfJM5TH3VI^yOP|TMIiXoE$<2{$?uj5fT zGRHXQ@>2!xQwmZHN-hzp1SksfaiifWd{kS*K!Cx>@?5~n@#Qftx|S-cAImobGV%*p z%v3*6-^hO+rhDFo{{)fhfz91q)Z9S5SVX^kyQ607&|6&I^lzV0fMrU^kHfYXygm*a zJ*oG?jgTuchbQoh5Aog_-OXc#V~-sBr$rO*H*)PVHBKou>G+6>lSCw*6sljCvz;1E zmRpeWZHDYAif}weD@-}4JrlyO7YhB&-`KVWzia?mJfnya*3f=9eDxKce0A;APLj{s zvXge>)gTu(k!?z^xBGUaEM4Ta5w=-Jz`{@FFJg>UDDHh3u2{zGYhv7!!iYGGB@hQs zU6?|230%dU0{Yvh%_A!XFmm@Dr-A8eqleDz$s(}GWYw$Z$EW(uTmsQQp=FQ15S zKj(%olykUb(HJf79qrM|KJ$1y`g8PV36#i->p)LKuokoG>!8+gv&p+Nd#z8esUo@Q zVSCB;4XqEha#ib#guDX};#wSOV%!`>3d=Ih`2%`YaASs%OJ`fR&lJ9LmRMEHGTR4o z7YI5Yn-l9Klx8RD56(bV^!Ts)1)LOowrM>s8wQmzS(SMO!^!NI6t?ctZ(SGl=szMR zg5XQ5UIPXP^M73Iv7qs9u0)Mq;hccp+Bd?phorFh?JMd|sY=)Jxqfu#yg1{vqzZS@WQDrIdk1|@S}8KdYF)>y~9CEcpE_c}Q(8fS&{O@CGt z-;L9haW0Vm`XeaYtHxDM5GfaQ+Qdwx_T%vMGB3Xn!apjscaQmWuR`bEep~e9!HSb{ zavfvHC$8Z=-NaX~K@=tT$k|>?Wh1*&ri>Gh?w4^tjGu*y)M0F<+kqaVHyXEZsPzVd zROEkCW2>7Cy?5fz%2=s$caWE*c53~xx8xq0WI|hg>R%H=|lRk;2FyUql`G+CM zG}U{iHHEmZS2Uy*%-3;6>|Mb_Pk?RCSnJ+swRUCWeQ~%Y3iCj6Jk0DFkhjoSL zwQTxai|>AU;nRQG(bQvkWYISWv@(zw)6d$`s6V5Wo6?XNUx25J7#>;A4TAApAbi@6 zmJ5V#K$wEWAOv2yVt6`*dZ_d95LgaMf#|BFmZ5KAc{=NX6a@mS37A*M0?Z?`4BZA& z%m^%+SApnpvg&E&ojiNV5aj|FXjX2*&^;W&fsdLWcnzHi5J#0_zokkP=Yp8VFecNNR!TP=Evb zZ{G_&GfH4jG_q?t*c|u+$dLm8o&?|s0AVB$st2O$0DZK8!T@&@VD|pF{}6?DpjCc6$qaI z>i`p+fY-BF0$Cwoe(e9SSvfII0)ou|>>~fy7FjC#R}4yE9UunxbKsf)^mu@gfO92) zbALBr02Kh_ra0gr05R%;3QPdQ2S9EBvMnID(!U$N0sGPam0Bwacm>7*Hzxa6q&#Go zUPuW*$E1fk1JV%^^uI#_%mhv(^5F*XN)H%K4HN)g%>YRROeF08--rUf&P^0S<(K^Cduo6PaO#syDFuDS!m{$o?Wx0>b8h zOa6XFPC&;Q!1_N;{$8X#aAbdd7Y0NO2aEuy{aqyvq^J;BegGqi=k2n2an*PCCysb@ zBL3EYSRr>;b;U2pADA>>-Ag`@-d*hxDB<0fVt%1kY&Sm6#br;FKG{fbz@EEC1{4r` zhB-ACA3KvLu6f>RlNUNEXvJb|3r*>0Cn=Ro=7EoQu|23O;b&x4gScXRrgUD??YYG; zpOO6Yt& z|JlI+q28e%^Q;&vO)8?vjxmcy(f=CHP0+6~-wR8)7+IJu8=>m7qjZn`rFrJoAG)CO z@j)N@HaDJzjVO<9gi@S(W!|G>B%BY&W;^5w&%r*H2)Di}wBZO768%1&=lom5!G^T` zw5AL8ld`+d@(_n`(_$097m1bOd|8`m^}_pW8^!j)*{dw!6fmM{Y!SFUn}v zMk0@R4$|iGm-MS#?W3XLb(vVfE!iJ_=B8b_FukvpMfEXPx+KqjJ?)nBzZL5sbzRnW z%T~g{$$LoRuUo~hOqd@?m`x8W*X%G@zzvcsQEIc9V9-1jRoFkTLiCgh4zBI+1XP-@ z;T3v4Ie{vV9~zkRx4g!?U`{-BJ%v3I5`Q}EdCIoy72?}>^xOE|D#`@@21fXWLYsoA zQH-Px+$Pgd^+5Z+`dy|^lPDAZW471Exnv)7C}-k1nMgvTcI%3LPx7!`B)7#?=6nhd zuvQ^1kRaN`Cq@x{N z4$1SwI>|iM{!pB7y-N2++NR#OWs=%265`4hcIOPAgwZk7ZHcq+v)P>~O3@~v%Osf} zwZpV&8IF?cdK^rsOof)xESy@LJ2Pj$T~D(dFSv1kHIhk^)s|AIrZ<1H9pfC$?hvF|nBA5UN#k_o z_8WdBFEY%75_A=i_iv^BoNmsq@KVY&$$zXRj$N3rrauv`awT|`DCo+Tu^8MUQKfWd zA_ZL%okCW3yd3g6kaTC=6M`o0qu>xv(mFTQ9M*tZ624_0JE)-V*U$ds4E+gih2$>~ z_`*uf4(E2{OX(RN9~2Fc(aFvcx4E;mZ89YhjKh?62O2AiGyIFNeF5&T^hG3G!R6$wNR`(nUdq^G?P1x!eB*(zK2yFo5EIqsWr;^ z^s;TzY`P!C~(zgH<>>SYDVb%|~b;J?1uDAL5J>?!oJUnsCC*)9DD;qjZ04FPe{hRk_ssj z18KIU(8Oy$XMF|wu+Ka(>`2ig*7-+FY59aYg5N(|0``j` z|2+PByO|_M&YWZIiz)=KMG`JLJT{?JxXD@>3@egd82i(kO%;SSsMO~U8gyTq&xM$; zFwJQc^-k89c%&c5sxPW_{~_1OztkFDS?$Jr%1PA`$Z*`t9*u8uMO|4z_DG!rl7OeE z8X-T<7U!BLk5|M!*C2Er(c|V*Bs92HqPWuXJKK}pPqIewOMeYrPN3gv+00A2uepeH z21NmFK22o!u-j+3*R#ny6CBnP>-ZDkF;&}%VALuL-m;T}1qSfO>AbWJxWz0Qf`{pf!_uZ`v97u)_>+X%k}rehua!<2Lgjuf~~ zx8MiUeMnMFr*sP-3@4|3oWA0WmT4`HGh*H*8?2iSl3oIRr1kO~sQf*yclX-Y`cGDr zs`1k9V!eM`xKDEld;?;KAb6~M9hQljo6j^?WF#IP_U5wGWO%3uKDmh><(W9LBxTB| z->+&EX)>yE#Z?a}>RuHZe=+YCFVeh@^hE1F>2NjilVY(P!?m_WqK;09;I%JeF1q^E zt{5tp0`D?{X2r!^SnP5oow1 z#{J@O^GvF-#9+3Ne~KXZPt<{?3w`-wXXnHBhuobIhO?bCj+jTtD-G8^$cRkUw3_Ko zwwWj^2MDq(;=iMUQ2)N1venEo?5@fEBc=b3+P0^~|93kS;T)Payy^&HWbV7(GAgNVcuFy}ACQRtA}287+-R zT83zxC>TgNPYs=FaF@St{=TIyW1r{P4;xLdH{Pj(Ny;<~Bo-d_Nsb*4B&S0_u6=cq#QP!r zG-Gw(0VysP@NG@Q^>>Eh{ph{TxT`8rvnibhM_c2~2z~0Z5M!4cl;_WVw^{${(d?Q2 za`4DLlYu2{2&M_%JcmiQ(U)1wdfOxx?ro-ekCxv)%(cGz5yFzl_4C<%h~2ZVjuK6n z=0PiWKKD}nes`Jt59~whjTa|-pQnQQM+ZxHHB-a!Y*cSnja;QG<;r7oE{GZC&MiOD zO9uysFj3U32sxlEiL_=sJw Date: Fri, 27 Mar 2026 14:15:45 +0200 Subject: [PATCH 3/5] refactor: create new kfold.print method instead of changing print.loo --- NAMESPACE | 1 + R/print.R | 34 ++++++++++++++++++++++------------ man/print.loo.Rd | 3 +++ 3 files changed, 26 insertions(+), 12 deletions(-) diff --git a/NAMESPACE b/NAMESPACE index 4d1a9118..3405d737 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -56,6 +56,7 @@ S3method(print,compare.loo) S3method(print,compare.loo_ss) S3method(print,importance_sampling) S3method(print,importance_sampling_loo) +S3method(print,kfold) S3method(print,loo) S3method(print,pareto_k_table) S3method(print,pseudobma_bb_weights) diff --git a/R/print.R b/R/print.R index 70f69707..6a3f2139 100644 --- a/R/print.R +++ b/R/print.R @@ -22,18 +22,6 @@ print.loo <- function(x, digits = 1, ...) { } cat("\n") print(.fr(as.data.frame(x$estimates), digits), quote = FALSE) - - if (inherits(x, "kfold") & "diagnostics" %in% names(x)) { - cat("------\n") - S <- dim(x)[1] - k_threshold <- ps_khat_threshold(S) - if (length(pareto_k_ids(x, threshold = k_threshold))) { - cat("\n") - } - print(pareto_k_table(x), digits = digits) - cat(.k_help()) - } - return(invisible(x)) } @@ -117,6 +105,28 @@ print.importance_sampling <- function(x, digits = 1, plot_k = FALSE, ...) { invisible(x) } +#' @export +#' @rdname print.loo +print.kfold <- function(x, digits = 1, plot_k = FALSE, ...) { + print.loo(x, digits = digits, ...) + + if ("diagnostics" %in% names(x)) { + cat("------\n") + S <- dim(x)[1] + k_threshold <- ps_khat_threshold(S) + if (length(pareto_k_ids(x, threshold = k_threshold))) { + cat("\n") + } + print(pareto_k_table(x), digits = digits) + cat(.k_help()) + + if (plot_k) { + graphics::plot(x, ...) + } + } + return(invisible(x)) + } + # internal ---------------------------------------------------------------- #' Print dimensions of log-likelihood or log-weights matrix diff --git a/man/print.loo.Rd b/man/print.loo.Rd index 78a5bedd..42a37bbe 100644 --- a/man/print.loo.Rd +++ b/man/print.loo.Rd @@ -8,6 +8,7 @@ \alias{print.psis_loo_ap} \alias{print.psis} \alias{print.importance_sampling} +\alias{print.kfold} \title{Print methods} \usage{ \method{print}{loo}(x, digits = 1, ...) @@ -23,6 +24,8 @@ \method{print}{psis}(x, digits = 1, plot_k = FALSE, ...) \method{print}{importance_sampling}(x, digits = 1, plot_k = FALSE, ...) + +\method{print}{kfold}(x, digits = 1, plot_k = FALSE, ...) } \arguments{ \item{x}{An object returned by \code{\link[=loo]{loo()}}, \code{\link[=psis]{psis()}}, or \code{\link[=waic]{waic()}}.} From 9bd9ff004969bec45e16c02601b3799b4fc6dda2 Mon Sep 17 00:00:00 2001 From: Florence Bockting Date: Sat, 28 Mar 2026 08:28:27 +0200 Subject: [PATCH 4/5] tests: use expect_snapshot to check table output --- tests/testthat/_snaps/print_plot.md | 51 +++++++++++++++++++++++++++++ tests/testthat/test_print_plot.R | 8 ++--- 2 files changed, 55 insertions(+), 4 deletions(-) diff --git a/tests/testthat/_snaps/print_plot.md b/tests/testthat/_snaps/print_plot.md index 17742c92..9153c8e9 100644 --- a/tests/testthat/_snaps/print_plot.md +++ b/tests/testthat/_snaps/print_plot.md @@ -2,3 +2,54 @@ WAoAAAACAAQFAAACAwAAAAAOAAAAAT+2J8YDcP5s +# print.loo supports kfold with pareto-k diagnostics - calibrated + + Code + print(kfold1) + Output + + Based on 10-fold cross-validation. + + Estimate SE + elpd_kfold -284.7 10.0 + p_kfold 2.4 0.6 + kfoldic 569.3 20.1 + ------ + + All Pareto k estimates are good (k < 0.7). + See help('pareto-k-diagnostic') for details. + +# print.loo supports kfold with pareto-k diagnostics - miscalibrated + + Code + print(kfold1) + Output + + Based on 10-fold cross-validation. + + Estimate SE + elpd_kfold -5521.0 713.1 + p_kfold 318.5 97.9 + kfoldic 11042.0 1426.3 + ------ + + Pareto k diagnostic values: + Count Pct. Min. ESS + (-Inf, 0.7] (good) 249 95.0% + (0.7, 1] (bad) 6 2.3% + (1, Inf) (very bad) 7 2.7% + See help('pareto-k-diagnostic') for details. + +# print.loo supports kfold without pareto-k diagnostics + + Code + print(kfold1) + Output + + Based on 10-fold cross-validation. + + Estimate SE + elpd_kfold -5521.0 713.1 + p_kfold 318.5 97.9 + kfoldic 11042.0 1426.3 + diff --git a/tests/testthat/test_print_plot.R b/tests/testthat/test_print_plot.R index 09ea3250..a991c57f 100644 --- a/tests/testthat/test_print_plot.R +++ b/tests/testthat/test_print_plot.R @@ -191,18 +191,18 @@ test_that("mcse_loo errors if not psis_loo object", { test_that("print.loo supports kfold with pareto-k diagnostics - calibrated", { kfold1 <- readRDS("data-for-tests/kfold-calibrated.Rds") - expect_output(print(kfold1), "All Pareto k estimates are good") + expect_snapshot(print(kfold1)) }) test_that("print.loo supports kfold with pareto-k diagnostics - miscalibrated", { kfold1 <- readRDS("data-for-tests/kfold-miscalibrated.Rds") - - expect_output(print(kfold1), "Pareto k diagnostic values:") + + expect_snapshot(print(kfold1)) }) test_that("print.loo supports kfold without pareto-k diagnostics", { kfold1 <- readRDS("data-for-tests/kfold-miscalibrated.Rds") kfold1$diagnostics <- NULL - expect_output(print(kfold1), "Based on 10-fold cross-validation.") + expect_snapshot(print(kfold1)) }) \ No newline at end of file From 97c2f903b1267d17924367fafec7333c737c579d Mon Sep 17 00:00:00 2001 From: Florence Bockting Date: Mon, 30 Mar 2026 09:33:01 +0300 Subject: [PATCH 5/5] tests: update test data and snapshot for kfold-print tests --- tests/testthat/_snaps/print_plot.md | 24 +++++++++--------- .../data-for-tests/kfold-calibrated.Rds | Bin 6122 -> 7674 bytes .../data-for-tests/kfold-miscalibrated.Rds | Bin 7822 -> 9810 bytes 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/tests/testthat/_snaps/print_plot.md b/tests/testthat/_snaps/print_plot.md index 9153c8e9..564d6e7e 100644 --- a/tests/testthat/_snaps/print_plot.md +++ b/tests/testthat/_snaps/print_plot.md @@ -11,9 +11,9 @@ Based on 10-fold cross-validation. Estimate SE - elpd_kfold -284.7 10.0 - p_kfold 2.4 0.6 - kfoldic 569.3 20.1 + elpd_kfold -285.0 9.2 + p_kfold 2.5 0.6 + kfoldic 570.0 18.4 ------ All Pareto k estimates are good (k < 0.7). @@ -28,16 +28,16 @@ Based on 10-fold cross-validation. Estimate SE - elpd_kfold -5521.0 713.1 - p_kfold 318.5 97.9 - kfoldic 11042.0 1426.3 + elpd_kfold -5556.6 701.0 + p_kfold 358.2 108.5 + kfoldic 11113.1 1401.9 ------ Pareto k diagnostic values: Count Pct. Min. ESS - (-Inf, 0.7] (good) 249 95.0% - (0.7, 1] (bad) 6 2.3% - (1, Inf) (very bad) 7 2.7% + (-Inf, 0.7] (good) 245 93.5% 24 + (0.7, 1] (bad) 8 3.1% + (1, Inf) (very bad) 9 3.4% See help('pareto-k-diagnostic') for details. # print.loo supports kfold without pareto-k diagnostics @@ -49,7 +49,7 @@ Based on 10-fold cross-validation. Estimate SE - elpd_kfold -5521.0 713.1 - p_kfold 318.5 97.9 - kfoldic 11042.0 1426.3 + elpd_kfold -5556.6 701.0 + p_kfold 358.2 108.5 + kfoldic 11113.1 1401.9 diff --git a/tests/testthat/data-for-tests/kfold-calibrated.Rds b/tests/testthat/data-for-tests/kfold-calibrated.Rds index 49cb75ee2364e0dc79042b39ff112869d056004c..e20d23e69da1d4a5960a0efd65e22d34cc3108fc 100644 GIT binary patch literal 7674 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 literal 6122 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 E0I5HHIRF3v diff --git a/tests/testthat/data-for-tests/kfold-miscalibrated.Rds b/tests/testthat/data-for-tests/kfold-miscalibrated.Rds index e6140f33f5b6209a2edba8ad6c880e8c88237eee..c0b371ba1ff51159f1f11e4351050394495b8104 100644 GIT binary patch literal 9810 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 AHUIzs literal 7822 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