From ae9c803ddb560beb92aaf6d439bfa6a3cc32beed Mon Sep 17 00:00:00 2001 From: Anthony Raborn Date: Mon, 2 Dec 2024 18:48:58 -0700 Subject: [PATCH 01/12] added new ordinal example --- R/ACO_lavaan.R | 43 +++++++++++++++++++++++++++++++++++++++++ man/antcolony.lavaan.Rd | 43 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 86 insertions(+) diff --git a/R/ACO_lavaan.R b/R/ACO_lavaan.R index c8a3a17..10ad215 100644 --- a/R/ACO_lavaan.R +++ b/R/ACO_lavaan.R @@ -208,6 +208,49 @@ #' ) #' #' abilityShortForm # print the results of the final short form +#' +#' # an example using binary (ordered) data +#' # create the simulated full model and model data +#' sim_model <- " +#' f1 =~ x1 + x2 + x3 + x4 + x5 + x6 + x7 + x8 + x9 + x10 +#' f2 =~ x11 + x12 + x13 + x14 + x15 + x16 + x17 + x18 + x19 + x20 +#' f3 =~ x21 + x22 + x23 + x24 + x25 + x26 + x27 + x28 + x29 + x30" +#' +#' sim_data <- +#' cbind( +#' psych::sim.rasch(nvar = 10)$items, +#' psych::sim.rasch(nvar = 10)$items, +#' psych::sim.rasch(nvar = 10)$items +#' ) +#' +#' colnames(sim_data) = paste0("x", 1:30) +#' # fit with antcolony.lavaan +#' # note that ONLY the estimator and ordered args +#' # of lavaan.model.specs are changed. This retains +#' # the default args, fitting a CFA but with ordered data. +#' example <- +#' antcolony.lavaan( +#' data = sim_data, +#' ants = 5, evaporation = 0.7, +#' antModel = sim_model, +#' lavaan.model.specs = +#' list(estimator = "wlsmv", ordered = T), +#' list.items = list(paste0('x', 1:10), +#' paste0('x', 11:20), +#' paste0('x', 21:30)), +#' full = 30, +#' i.per.f = c(5, 5, 5), +#' factors = c("f1", "f2", "f3"), +#' steps = 20, +#' fit.indices = c("cfi.scaled"), +#' fit.statistics.test = "(cfi.scaled > 0.90)", +#' summaryfile = NULL, +#' feedbackfile = NULL, +#' max.run = 500, +#' parallel = T +#' ) +#' # note that this example will take a bit of time to run +#' # as ordered data factor analysis is computationally expensive. #' } #' @import lavaan utils #' @export diff --git a/man/antcolony.lavaan.Rd b/man/antcolony.lavaan.Rd index cb1cc83..f2d2fbb 100644 --- a/man/antcolony.lavaan.Rd +++ b/man/antcolony.lavaan.Rd @@ -261,6 +261,49 @@ abilityShortForm <- antcolony.lavaan( ) abilityShortForm # print the results of the final short form + +# an example using binary (ordered) data +# create the simulated full model and model data +sim_model <- " +f1 =~ x1 + x2 + x3 + x4 + x5 + x6 + x7 + x8 + x9 + x10 +f2 =~ x11 + x12 + x13 + x14 + x15 + x16 + x17 + x18 + x19 + x20 +f3 =~ x21 + x22 + x23 + x24 + x25 + x26 + x27 + x28 + x29 + x30" + +sim_data <- + cbind( + psych::sim.rasch(nvar = 10)$items, + psych::sim.rasch(nvar = 10)$items, + psych::sim.rasch(nvar = 10)$items + ) + +colnames(sim_data) = paste0("x", 1:30) +# fit with antcolony.lavaan +# note that ONLY the estimator and ordered args +# of lavaan.model.specs are changed. This retains +# the default args, fitting a CFA but with ordered data. +example <- +antcolony.lavaan( + data = sim_data, + ants = 5, evaporation = 0.7, + antModel = sim_model, + lavaan.model.specs = + list(estimator = "wlsmv", ordered = T), + list.items = list(paste0('x', 1:10), + paste0('x', 11:20), + paste0('x', 21:30)), + full = 30, + i.per.f = c(5, 5, 5), + factors = c("f1", "f2", "f3"), + steps = 20, + fit.indices = c("cfi.scaled"), + fit.statistics.test = "(cfi.scaled > 0.90)", + summaryfile = NULL, + feedbackfile = NULL, + max.run = 500, + parallel = T +) +# note that this example will take a bit of time to run +# as ordered data factor analysis is computationally expensive. } } \seealso{ From 3ae204bdbfcd3143a12b3660a73f43bcc5a891ce Mon Sep 17 00:00:00 2001 From: Anthony Raborn Date: Mon, 2 Dec 2024 18:49:38 -0700 Subject: [PATCH 02/12] new model building process in antcolony.lavaan --- R/ACO_lavaan.R | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/R/ACO_lavaan.R b/R/ACO_lavaan.R index 10ad215..c77fb20 100644 --- a/R/ACO_lavaan.R +++ b/R/ACO_lavaan.R @@ -407,7 +407,20 @@ antcolony.lavaan <- function(data = NULL, sample.cov = NULL, sample.nobs = NULL, select.indicator <- is.element(item.vector, selected.vector) # MODIFY LAVAAN SYNTAX - new_ant_model <- paste(antcolony.lavaan.env$input, collapse = "\n") + new_ant_model <- + input + for (factor in 1:length(factors)) { + temp_factor_definition <- + new_ant_model[grepl(factors[factor], new_ant_model)] + temp_factor_definition <- + sub( + "=~[[:alnum:][:space:] +]{1,}", + paste0("=~ ", paste0(selected.items[[factor]], collapse = " + ")), + temp_factor_definition + ) + new_ant_model[grepl(factors[factor], new_ant_model)] <- + temp_factor_definition + } # Run the model check function # checks for and saves error/warning messages within the lavaan output, From ea153dacd10747405d7bdf09aeba8ad21c260d83 Mon Sep 17 00:00:00 2001 From: Anthony Raborn Date: Mon, 2 Dec 2024 18:51:28 -0700 Subject: [PATCH 03/12] adjusted pheromone calcluation to allow ties --- R/ACO_lavaan.R | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/R/ACO_lavaan.R b/R/ACO_lavaan.R index c77fb20..725d20c 100644 --- a/R/ACO_lavaan.R +++ b/R/ACO_lavaan.R @@ -547,8 +547,8 @@ antcolony.lavaan <- function(data = NULL, sample.cov = NULL, sample.nobs = NULL, antResults[[bestAnt,'pheromone']] - # adjusts pheromone and best.so.far values only if the current pheromone is best than the previous. - if (best.pheromone > best.so.far.pheromone) { + # adjusts pheromone and best.so.far values only if the current pheromone is as good or better than the previous. + if (best.pheromone >= best.so.far.pheromone) { include.pheromone <- antResults[[bestAnt, 'solution']] * best.pheromone include <- include + include.pheromone From 9043e2a77dc052d33aa1849f13a0086ab49b49ac Mon Sep 17 00:00:00 2001 From: Anthony Date: Tue, 28 Apr 2026 16:13:35 -0400 Subject: [PATCH 04/12] bugfix newModelSyntax with external or factor relationships --- R/simulated_annealing_internals.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/R/simulated_annealing_internals.R b/R/simulated_annealing_internals.R index e4887fa..ce321ca 100644 --- a/R/simulated_annealing_internals.R +++ b/R/simulated_annealing_internals.R @@ -49,7 +49,7 @@ randomInitialModel <- ) } newModelSyntax <- - paste0(newModelSyntax, externalRelation, factorRelation, collapse = "\n") + paste(newModelSyntax, externalRelation, factorRelation, sep = "\n") newModelSyntax <- stringr::str_replace_all(newModelSyntax, "\n\n", "\n") From b6a7d8d21a51a1476c7091353b69cb4f0b2b9aba Mon Sep 17 00:00:00 2001 From: Anthony Date: Tue, 28 Apr 2026 22:25:24 -0400 Subject: [PATCH 05/12] updating CI/CD workflow --- .github/workflows/R-CMD-check.yaml | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 .github/workflows/R-CMD-check.yaml diff --git a/.github/workflows/R-CMD-check.yaml b/.github/workflows/R-CMD-check.yaml new file mode 100644 index 0000000..84b0f9a --- /dev/null +++ b/.github/workflows/R-CMD-check.yaml @@ -0,0 +1,19 @@ +name: R-CMD-check + +on: + push: + pull_request: + +jobs: + R-CMD-check: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v3 + + - uses: r-lib/actions/setup-r@v2 + + - uses: r-lib/actions/setup-r-dependencies@v2 + + - name: Check + run: R CMD check . \ No newline at end of file From 560c7928fc62a8fd165cf540106267485f8ed8a7 Mon Sep 17 00:00:00 2001 From: Anthony Date: Tue, 28 Apr 2026 22:25:53 -0400 Subject: [PATCH 06/12] updating usage of ggplot to remove depreciation warning --- R/ACO.R | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/R/ACO.R b/R/ACO.R index ba3cf88..ebb4c44 100644 --- a/R/ACO.R +++ b/R/ACO.R @@ -69,6 +69,7 @@ setMethod('show', #' #' @importFrom ggrepel geom_text_repel #' @importFrom tidyr gather +#' @importFrom rlang .data #' #' @export setMethod('plot', @@ -91,12 +92,12 @@ setMethod('plot', pheromone_plot <- ggplot2::ggplot( pheromone_long, - ggplot2::aes_string( - x = "run", - y = "Pheromone", - group = "Item", - fill = "Item", - colour = "Item" + aes( + x = .data$run, + y = .data$Pheromone, + group = .data$Item, + fill = .data$Item, + colour = .data$Item ) ) + ggplot2::geom_area( @@ -122,7 +123,7 @@ setMethod('plot', gamma_plot <- ggplot2::ggplot( summary_results, - ggplot2::aes_string(x = "run", y = "mean.gamma") + aes(x = .data$run, y = .data$mean.gamma) ) + ggplot2::geom_line() + ggplot2::ylab(expression("Mean " * gamma)) + @@ -147,7 +148,7 @@ setMethod('plot', beta_plot <- ggplot2::ggplot( summary_results, - ggplot2::aes_string(x = "run", y = "mean.beta") + aes(x = .data$run, y = .data$mean.beta) ) + ggplot2::geom_line() + ggplot2::ylab(expression("Mean " * beta)) + @@ -172,7 +173,7 @@ setMethod('plot', variance_plot <- ggplot2::ggplot( summary_results, - ggplot2::aes_string(x = "run", y = "mean.var.exp") + aes(x = .data$run, y = .data$mean.var.exp) ) + ggplot2::geom_line() + ggplot2::ylab(expression("Mean Variance Explained")) + From 8e0f986a86ed21e7f823470f1e27ed7e84240bd2 Mon Sep 17 00:00:00 2001 From: Anthony Date: Tue, 28 Apr 2026 22:43:43 -0400 Subject: [PATCH 07/12] Modernizing README --- README-ACO example-1.png | Bin 11928 -> 0 bytes README-ACO example-2.png | Bin 8238 -> 0 bytes README-ACO example-3.png | Bin 6244 -> 0 bytes README-ACO example-4.png | Bin 7835 -> 0 bytes README-Simulated Annealing example-1.png | Bin 11885 -> 0 bytes README-Tabu example-1.png | Bin 5653 -> 0 bytes README-Tabu short form-1.png | Bin 5523 -> 0 bytes README-quick-example-ACO-1.png | Bin 0 -> 13802 bytes README-quick-example-ACO-2.png | Bin 0 -> 7878 bytes README-quick-example-ACO-3.png | Bin 0 -> 8003 bytes README-quick-example-ACO-4.png | Bin 0 -> 8095 bytes README-quick-example-SA-1.png | Bin 0 -> 9389 bytes README.Rmd | 464 ++++++---------- README.md | 665 +++++++++-------------- 14 files changed, 421 insertions(+), 708 deletions(-) delete mode 100644 README-ACO example-1.png delete mode 100644 README-ACO example-2.png delete mode 100644 README-ACO example-3.png delete mode 100644 README-ACO example-4.png delete mode 100644 README-Simulated Annealing example-1.png delete mode 100644 README-Tabu example-1.png delete mode 100644 README-Tabu short form-1.png create mode 100644 README-quick-example-ACO-1.png create mode 100644 README-quick-example-ACO-2.png create mode 100644 README-quick-example-ACO-3.png create mode 100644 README-quick-example-ACO-4.png create mode 100644 README-quick-example-SA-1.png diff --git a/README-ACO example-1.png b/README-ACO example-1.png deleted file mode 100644 index a2cf62d2aa320b31d8587e7875d2bc770e786064..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11928 zcmbVyXIN9g({Jd4bWkZGN)IXsiPQk0Do98m6hYBHiU}Y^daoi?iWHF+f(W6bgd!kV z0O=$^0O`^p^xn;lzVCX-lk zv{(Ru=Jz=|>KmAeEF<-y24QHbOML_YQ~&@JKt%T9G^o2n3>{P$5(RsJ}>mFO&+3 zN{K3{8kIyUjpeuDEB2Qim555LK~++qg%MkPuO zg;JXX_>lo<3!t>e!`dm7p0|J@kF%jSfU!iCu|(8Z4V4ndYW}g0Q7;O$5cM`jp-jF8 z%sTJSl{n8)C<_rhD=RB&c57>)>N^4V_iSemy_`;Lex168P;9y>Prg!YKT_;+DUNTb zs!%0S#u6!GHGg5|N+^G|ph~7fQjsVVR^Or2c4K~V*U}vTU~m5Wr)hI3v;_dJ0`zq> zO?|S~CSr4}%{-Ylh0YZ@g^yk&-WTb2y&4{7$A%C|PysqT|9(|L&se7$n-}%#ZdkRJ zlM^=|YT-{?<6`6E=Q-7cpwhrz>#qsI$*kT4wS*1p6W88Gi&CYmFwsKAkY?9cp>8qk zbo0DIjGaIg))b@%pA>HC7Q(2{2AlOBDMhUP8e~=KezN#g{A^QiFYl>rl2eMfu!f1# zz+1x0ldM1EX_L!;kf9CccMa(M4!e-e_K^M5KZ^{QR!*$hmCvK6I9l(rMBa0|&36Wq zeeU>k--E>FLL0KLzZhoG_l3G-_rqtlhBGN9zb#oArHx3GqHosM#ad}@2YN}m?xXuy zOtVV<42*lG+}I6Za}Zrm%}C1;+L=ijr39%SH$JTuCM zQ6Cfz@Pz>DMYl$mS~I$LbsJXoyo^;0%BEPK_FccZrZRJ8|?b&1W_;rf|v z31#K@M$j%fa79CdGCQpq>7wTKcu&~nE9HSf!=CK%(#i2l3*jc>*;3`UgHk}XRe+k; z*Dw3^#~&@%o#Ob`S`k0NuyUGv)TzAsK4a^nxMdjtiz|o-| zu0M;@ix0MuVEaEiZ?|^-d>{RCQZu{Ppm8o?#{Th41F6QG9~+q#ITbxV8c|l+{NTF#S+N;vy|``+@t}guAiXj~A#(CR!~!+D!B#@8 z5nJ1$+d*^lL=DlK{aK`5n4Z)2sSFrz@Ja?w=Sm<$fK4 z-~GC;Ggayzrulp)%Dq3Kq;33#Q(P1Oz9d+sR1=r%x-6aedf~nb?(ya&AQ)g z6;D5w1-gV#tLBKtiT$(sbfT~;d(g+@O5rPb$sC;EghmGCk@psq6rSD&UnzZNiNb-+l~ z19-mBNoef6Tl`&pRqDh#2Q1vGZPj`Gnd7Sm;LC2VOU%U#6c+pO-?A zZcM(def&|z5XZpcn94{}i}j}SB+PuGw&*LG!3`#-4Ufc&so53eMma1|rO;ge+sy&V zGW$^42l+If6))>U>xVV}GUwBntrt?329cE(ZJ+PfF)jg$S>5t4y<|Pu{IPZryi-lC zh;*TB#vXWLO9w@7B2LVgp<`!&aas4uSBb`LYBnh6~=O_x)d<`<;Kb z7wql%xvNzDT2GzwAD6R?Z^z1G)4GjKyL}vUHJZp|aA9<4Oh z=Nikb(QclqZV#aimB9SEN5wEiJ}`W%BwvitVM3a&(6xQ8Azd#->z~|CI)^W^e?I#Q znX04Ontllzw8x%qp5){AKOL9$EDztNtM!qfbC{wQTL~h{VarecnaeJ9_IjG$+{AFt%;cDP1_vzD`W zD4)i(VL{KW%sap?B1JnVD&>JfOrwXT4M%<#gE8nWamAbM`9Q9y=a1V$AB~k)Hm_h? z74zRSo8D3E^nqI2V4s1-vC0f0bQ50+ENzUW6IeZXG8eAc|Gd)yP5WgkV-t&|Ci=nG zdrYmB>8zh1Y15Pu^28&>o?ofSpKY;tr;Jz$%btIUEYv!Ugh+XF3pCa~qsH-Vgh~9$ zEjc1>MnN{ig%!7K)Y!ww=+Gnun3Aq+t*yb+*Hc5TLK2JyB=BH8N>hd*af<9JWW$)z zXkS@u8Fo)nN2*-38wyf@nSz%i(xb@jP;?*IX|US>G%iYav&cT9INkpPzpyx+xQlcS zDZSp%C^@tr4AXVjl;W4N9C!!bN$nn|CSe113OlKW0x7Iu?*Thc(Cn?`NeQ|hB6!jV z6lvJmbUA9}9Eg}$U@WQ4>~t}Ts`cD0Vl?dOs9`_uQv82CGQ&js3~%eoPUI73Rg_st zczfQ=q5{qN{uH%84-=>b5D7Zp(j!pHGI8W{xwhChnT)fB`uNK!Mp3L_;{j+Evt9qe ze6AF~-G>5ArM&)>^B0smU!<~vzu4cOe~nJ=e;uWI=?{0k-M?tGSP&t)p_{Q*6k z20BeW5&4|0R#af=#VSn+z4Ko8t`U$J9v#ty!69|i8 zmHPOi^5kYHLy)e$3al zpj4%gQFEP~3>RnWsZPSm7w22V{TKP)(uX9C6(*m_T9wHc3b_-D7R%~* zXr!Ayl@FlWe2HAxRgebix;#syKvc4zoa6rSeort;q%z(=C6$c&-J6Vi;nfxC34 z;!DO1<*V{U^`5xx$w7C4-gdB>aRgCJr>+k=ec-C(Vf3B9LL2@Z*7R z=l-4#On2-Sf|};c{oK1U6A}i=of*k)fq=QBu00z{8Gtjjcs{zsNcs+9?42^ox7Ur{ zQA`U`xmvzcFNF;n9JsUy&MxTsWHambuWcA;7&i23%;Bjc59`>QjS_n) zc%GN2{02uS`QBD00%aASNl%Jgw9R^#1iYc9avP*0Z`uZ96iAQ^;n5zb?=)hAa{%6O z&u@o{_{PX#%(DuMEw8}nbxfk655*ABgPc+8vT`RE7mcb06(6sYZqNMN%!m-&<}9;? z(FVJkY>%&2_>4#>jUPU&uD%j^cD6LrOCD`DcutEQ{9(eH{i`z_BT=y5^H_xQ5;HyV zI!BPVwPwPjCeyRo-$xS#SoShJUG>+@=6dq-j6Hr?d3;WuPh5t3NhWBb+J)*g_H&w= zRD8-SkJF{=nrMyU*DBvUg52>TxAIgne?4(5?v0~Yx;Q+dM>i3?ZDOYDf>{pP|AG(J z$$quCu?2Zmz|+D!usd8=RLyni67#88QDcqL;WYv0>C_C)>=3P&!nEPgQ z(|h}JZs!WxIr`yZwVccS09^d-N;(~+}5<5sfSz-Rfv7t z(ew7r_FgMd{dKRClphIw-{vcI(}zyXuHUSc7A z-i)6EzGmm0%Bp!}Fq}riSP&b`FiyJ#DMEBz)T_IU zwK|YVgL7bhOjHc3+hofQM%#k!4ppVh_eI6(OhZea@`o!@}pGSPVn4Q9NgM!&+DY9?j%xG{pZEC39Yc_foW0 z=#P1x2as&Y%~pKST=+<$VU)2^Y^+W?w7MED*NGgq+@kmM%JWf3*pbaLj-5wg=^24C z+`6<3_1@D+wKovm+V-QQ$lj1J=B)Rvh2i@Z9hX+A+H)25H{OFx`4dX~tX_}<{o9b( z7<6zJzlapq)g`LBzR4TvqPtbIl;_?PFxFoyYph|GEcKBdIyjBC z(D(#l=tjz5e6pIrML=DBt9Y)EM@_Se30bONUOeHwAAlX*#LMRJVa}$jrgwMs>y;Du}Vo0foa-_B=4UaGyJ zI1Zyyn1kc56cMhd*zoGusgnA`1mO_@hKrX9<<-cN8+nlF{-Vv*f|WNfOfvC|h4JF= zQ|OXIB=i-F8wC#dFBL-6$Xz(TY2_?>MYvoIX?dUoscH%mjzU1WOOoEEe^`FQN$kh@ zRwQw{e4z>8@oYwtM}@%Xp%OwNM1=OuQgj&$z`<){p&xf7A<9G;U2Ok65G(PjCw+ee zLvxq4#aw{+07uSCbWal7T@TDcdtPrBgicLvc|2^<87=ip%KcD~Ea}C~{VA1&7f&l) z9S<C^GVN`5!Y;j}9vj@p zY7VJ9J3IbbT`(K9cvH;u$@Rvt1qKJhgx!4cSBvj@BXEsAer84ye0)oMd~*7BE#{+q zyq|PrtJ(i3$l(3Gx9D9M>|YFhVpH2vx{k?}E^?h?&cG(A?(vCvP_bfNf{ZcxNz=#& zR@??#9$TiKF&#>ho8zph$W5D>^Sn7Pu>HG*>yvROTHy~NcYLi})Qw*6bj9ZJBUsZI zO*5`Ak9D3B8@(gx^N`mucA1k(mrRwOc^wStx5_aR8y(!`ACgmWciwjR6Y%N~Vp4$r zZfWh$ryemtg~fY3kFO-ZXQi#Th*JlR-w+9hoRa*#qa_1c?+)4TuI53~40*V{D^j{S zpVBxDYbH-QrJBJwE%o)txvfk$!Jb_dVzf7YxsD#Xe1;&4*oS&)2xL1M&I?vu8~c_u^Ers7RO8Y!LA~PTk+7Q!+-fz=!Ij z!Q`wcj+aRp#^C^2xyRU!4JNZdg9-oPh6lbi{x4-PNCWf^FAZ3cRlFcCaXW4QkQNrG zQ81imT`ag4H}3Kc>H_3^}A#`x0_LFNd+}>la`+M9svP z#dMD~qf&7ZbghTMJx2I3c3DDybk{olvZb$d?aOoMJsq;4elm3$lO@_Fi!~5x{Dl{n z@0rw$&(E$8SI#$Pm;8YEwOJEvQeK%=3a$_ z?bk>~#8#8X&X=Vw^iJRda(@zZ%W$ad{IC4c1bmm$7E{LWAfgvw^owHo!AOu$R)6Eu zA+>Bst61h^Vq{iLQil|>MbIuxmCTf*wSQFbNnW_qog9VyHRV*|Jx^M6d$YwLK!Ley zZ69H*GzL3V!*K3%%Q!q*ssZA={lPZ5!R_liZ4n*nWO7h+ur7t^#RU3wKrGvqdW+yn zzL2s&2ZMl6y^Wb?IcxKgeM<&8M^>0$q_?2^+Env{a;_j_*zVmjZhV)zNZ4!4BFiII(RwS^! zf(pO50;=`%3Ci$d8~Bx zk}b;JP!D=LRZWw?Cg2gT+eW$U&1J~S)5S<+OS7_h=(dFEMKuHENvN#Fe?04_!1 zBwA6Edreg};+Xldvb?XKd9RYvc{fXg##m~v6}EVMF<9o%3i8|i-4#n;77Yxut4W=Q zXH%CZFp^Q~hh&xf#`l3Z_Zcm2&7PFav+9)j_bIdIJ*q7{w{jI@0qT*~I!8r17`pFx#hnFLA_9unfkmqJajQ{f$6J0R!Kv24Om)+ah!yex31@#RSBAnVavo|F2cm!OC^ zYi{2E`}xX_nNW9cq|nis?i>}g;=b%h&lT~)`O&S(ZzV!Zy!2s`x+ffgN4*vbb`( zULSS^^7VmP|2_vjahmP!#GdFG`AwdG?G~xL^0{!4axdsgk6g+<>GbdOax{q9hcOR8K2`3!}9*(nIhUn&&s<39T$G`uwixw!L!3)}I39 z!00Agza7Jy_%k|V&1*SY2Swf+7cp*IkfNUqVJJHJ-7KPJa6^ z4A1jF_^n*}Q`F9=8kk-7rdXdz?k&(E-RV6*t=^|8y*1}f?@R-O1P)&9J?zU8xCBfT z?X}OYe<0q`f-BTYyMckq3cBpSt73OJJdJL}JyeHb_M?r%xFq8x@(g)3uxT5gM+2(P ziO68rXqPreVt&l<%oSZEB->#gDcw2Q4gf3Citx%}_XK$Mv$sT{se-F2IsGRy^xZt~ z_~I-GO5*t1^sL#R#VIokRgd!9g1F)Y3ny?+hs@ii#kdzcEuL$38C#CdkEp9X0qpxm z0LKxvhdCUD`!ddS8zdY5kYi_IBj(&YPn{A#(gb-sc>{4`tZAp@3W6r}(mURq?M
>?v+9VwkNn+BHLa*W3!aT=Ze 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 IH@%4eE18@AA^-pY diff --git a/README-ACO example-4.png b/README-ACO example-4.png deleted file mode 100644 index 5658051bfabe15f22dbf3ed1bd09fe56e3aa6d92..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7835 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 diff --git a/README-Tabu example-1.png b/README-Tabu example-1.png deleted file mode 100644 index 62087934cd03669c9a2cc9ae99e4cefd83070e86..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5653 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 H#|QrfCMLm| diff --git a/README-Tabu short form-1.png b/README-Tabu short form-1.png deleted file mode 100644 index 97c751a5185167cedc0507a3d9603eb04989f2db..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5523 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 a26v25bEmjdX3EaXRRev)bMJI-1^yS?(`>N- diff --git a/README-quick-example-ACO-1.png b/README-quick-example-ACO-1.png new file mode 100644 index 0000000000000000000000000000000000000000..fd88367c29cd66d09f2700d9c4695ce4d4b7eb3c GIT binary patch literal 13802 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 literal 0 HcmV?d00001 diff --git a/README-quick-example-ACO-3.png b/README-quick-example-ACO-3.png new file mode 100644 index 0000000000000000000000000000000000000000..699a138f13fdb7b28705233905b7f7749ea19aa7 GIT binary patch literal 8003 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 literal 0 HcmV?d00001 diff --git a/README-quick-example-ACO-4.png b/README-quick-example-ACO-4.png new file mode 100644 index 0000000000000000000000000000000000000000..91c6df643b631ca6c597918e58ebbb2353827bb6 GIT binary patch literal 8095 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
fkX`ejzkpG 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 CgSUVH literal 0 HcmV?d00001 diff --git a/README.Rmd b/README.Rmd index 131adac..49063af 100644 --- a/README.Rmd +++ b/README.Rmd @@ -3,6 +3,7 @@ output: github_document: html_preview: TRUE --- + ```{r, echo = FALSE} knitr::opts_chunk$set( collapse = TRUE, @@ -12,323 +13,190 @@ knitr::opts_chunk$set( ``` # ShortForm -[![CRAN_Status_Badge](http://www.r-pkg.org/badges/version-last-release/ShortForm)](http://cran.r-project.org/package=ShortForm) -[![Travis-CI Build Status](http://travis-ci.org/AnthonyRaborn/ShortForm.svg?branch=master)](http://travis-ci.org/AnthonyRaborn/ShortForm) -[![CRAN Downloads Per Month](https://cranlogs.r-pkg.org/badges/ShortForm)](https://cran.r-project.org/package=ShortForm) -[![CRAN Downloads Total](https://cranlogs.r-pkg.org/badges/grand-total/ShortForm?color=orange)](https://cran.r-project.org/package=ShortForm) +[![CRAN_Status_Badge](http://www.r-pkg.org/badges/version-last-release/ShortForm)](http://cran.r-project.org/package=ShortForm) [![R-CMD-check](https://github.com/AnthonyRaborn/ShortForm/actions/workflows/R-CMD-check.yaml/badge.svg)](https://github.com/AnthonyRaborn/ShortForm/actions/workflows/R-CMD-check.yaml) [![CRAN Downloads Per Month](https://cranlogs.r-pkg.org/badges/ShortForm)](https://cran.r-project.org/package=ShortForm) [![CRAN Downloads Total](https://cranlogs.r-pkg.org/badges/grand-total/ShortForm?color=orange)](https://cran.r-project.org/package=ShortForm) + +## Overview + +**ShortForm** is an R package for constructing short-form assessments from larger item banks using reproducible, optimization-based workflows. + +It provides implementations of metaheuristic search algorithms to automate item selection while preserving prespecified psychometric properties. The package is designed for researchers and practitioners who need scalable, transparent, and reproducible methods for reducing assessment length. + +------------------------------------------------------------------------ + +## Key Features + +- Automated short-form construction from full item banks +- Multiple optimization algorithms: + - Ant Colony Optimization (ACO) + - Tabu Search (TS) + - Simulated Annealing (SA) +- Integration with `lavaan` and `Mplus` workflows +- Support for custom objective functions and model specifications +- Reproducible, scriptable workflows for assessment design + +------------------------------------------------------------------------ + +## Use Cases + +ShortForm is useful when you need to: + +- Reduce assessment length while maintaining measurement validity +- Automate item selection workflows for large-scale assessments +- Build reproducilbe pipelines for psychometric modeling and evaluation + +------------------------------------------------------------------------ -Automatic Short Form Creation for scales. Currently, the Ant Colony Optimization (ACO) Algorithm and the Tabu search are implemented. The original R implementation for the ACO algorithm is from [Leite, Huang, & Marcoulides (2008)](), while the Tabu search function was taken from [Marcoulides & Falk (2018)](). There does not yet seem to be an application of Simulated Annealing (SA) within psychometrics, but Drezner & Marcoulides, 1999 (in *Multiple Linear Regression Viewpoints*, Volume 25(2); not available online) used SA for multiple regression model selection; this package appears to be the first to implement SA for psychometric models. +## Engineering Highlights + +This package demonstrates: + +- Development and maintenance of an R package distributed via CRAN +- Implementation of optimization algorithms for applied statistical workflows +- Automated build and testing pipelines using CI/CD +- Integration with other modeling tools +- Reproducible examples using structured simulated data + +------------------------------------------------------------------------ This document was created on `r Sys.Date()`. ## Installation + ```{r gh-installation, eval = FALSE} install.packages("ShortForm") # the CRAN-approved version require("devtools") devtools::install_github("AnthonyRaborn/ShortForm", branch = "devel") # the developmental version ``` -## Usage - -Here are some (slightly modified) examples from the help documentation using -lavaan. Be warned, the algorithms may take some time to converge, particularly -with large forms, multiple dimensions, and different settings. The time for these -examples to converge on a laptop with an Intel Core i7 8th Gen processor is printed at the bottom. See the `sessionInfo()` below. +## Quick Examples + +```{r quick-example-ACO} +set.seed(58310) +library(ShortForm) + +# Example workflow: +# 1. Define item pool and model +# 2. Run optimization algorithm +# 3. Evaluate resulting short form + +result_ACO <- antcolony.lavaan( + data = simulated_test_data, + antModel = exampleAntModel, + list.items = list(paste0("Item", 1:56)), + full = 56, i.per.f = 15, + factors = "Ability", + steps = 100, + fit.indices = c("cfi", "rmsea"), + fit.statistics.test = "(cfi > 0.98)&(rmsea < 0.03)", + summaryfile = NULL, + feedbackfile = NULL, + max.run = 200 +) -```{r session-info} -sessionInfo() +summary(result_ACO) +plot(result_ACO) ``` -### ACO Algorithm - -```{r ACO example} -start.time.ACO <- Sys.time() -library(ShortForm, quietly = T) -# using simulated test data and the default values for lavaan.model.specs -set.seed(1) -# create simulation data from the `psych` package -# four factors, 12 items each, 48 total items -# factor loading matrix - not quite simple structure -fxMatrix <- - matrix(data = c(rep(x = c(.8, .8, .4, .3), times = 3), - rep(0.2, times = 3*4*3), # first factor loadings - - rep(0.2, times = 3*4), - rep(x = c(.8, .8, .4, .3), times = 3), - rep(0.2, times = 3*4*2), # second factor loadings - - rep(0.2, times = 3*4*2), - rep(x = c(.8, .8, .4, .3), times = 3), - rep(0.2, times = 3*4), # third factor loadings - - rep(0.2, times = 3*4*3), - rep(x = c(.8, .8, .4, .3), times = 3) # fourth factor loadings - ), - ncol = 4) -# factor correlation matrix - all factors uncorrelated -PhiMatrix <- - matrix(data = c(1,0,0,0, - 0,1,0,0, - 0,0,1,0, - 0,0,0,1), ncol = 4) -antData <- - psych::sim( - fx = fxMatrix, - Phi = PhiMatrix, - n = 600, - mu = c(-2, -1, 1, 2), - raw = TRUE - )$observed # observed is the simulated observed data - -colnames(antData) = paste0("Item", 1:48) - -antModel <- ' -Trait1 =~ Item1 + Item2 + Item3 + Item4 + Item5 + Item6 + Item7 + Item8 + Item9 + Item10 + Item11 + Item12 -Trait2 =~ Item13 + Item14 + Item15 + Item16 + Item17 + Item18 + Item19 + Item20 + Item21 + Item22 + Item23 + Item24 -Trait3 =~ Item25 + Item26 + Item27 + Item28 + Item29 + Item30 + Item31 + Item32 + Item33 + Item34 + Item35 + Item36 -Trait4 =~ Item37 + Item38 + Item39 + Item40 + Item41 + Item42 + Item43 + Item44 + Item45 + Item46 + Item47 + Item48 -' - -# then, create the list of the items by the factors -list.items <- - list( - paste0("Item", 1:12), - paste0("Item", 13:24), - paste0("Item", 25:36), - paste0("Item", 37:48) - ) -# finally, call the function with some minor changes to the default values. -abilityShortForm = - antcolony.lavaan(data = antData, - ants = 10, evaporation = 0.9, antModel = antModel, - list.items = list.items, full = 48, i.per.f = c(6,6,6,6), - lavaan.model.specs = - list(model.type = "cfa", auto.var = T, estimator = "default", - ordered = NULL, int.ov.free = TRUE, - int.lv.free = FALSE, auto.fix.first = TRUE, - auto.fix.single = TRUE, std.lv = FALSE, auto.cov.lv.x = TRUE, - auto.th = TRUE, auto.delta = TRUE, - auto.cov.y = TRUE), - factors = c("Trait1", "Trait2", "Trait3", "Trait4"), steps = 100, - max.run = 100, - parallel = T) -abilityShortForm # print the results of the final short form -plot(abilityShortForm, type = 'pheromone') # the pheromone plot for class "antcolony" -``` +```{r quick-example-SA} +set.seed(58310) +result_SA <- simulatedAnnealing( + initialModel = paste("Ability =~", paste0("Item", 1:56, collapse = " + ")), + originalData = simulated_test_data, + maxSteps = 20, + maxItems = 40, + items = paste0("Item", 1:56), + setChains = 4 +) -A similar example can be found in the `antcolony.mplus` function, but requires you to have a valid Mplus installation on the computer. It took a total of `r round(as.difftime(Sys.time() - start.time.ACO, units = "mins"),2)` `r attr(round(as.difftime(Sys.time() - start.time.ACO, units = "mins"),2), 'units')` to run this example. - -### Tabu Search Algorithm - -This example demonstrates how to use the Tabu search for model specification searches when the original model may be misspecified in some way. - -```{r Tabu example} -start.time.Tabu <- Sys.time() -library(ShortForm, quietly = T) -set.seed(2) -# create simulation data from the `psych` package -# two factors, 12 items total -# factor loading matrix - not quite simple structure -fxMatrix <- - matrix(data = c( - # first factor loadings - rep(x = c(.8, .8, .6, .6), times = 3), - # second factor loadings - rep(x = c(.2), times = 12) - ), - ncol = 2) -# factor correlation matrix - all factors uncorrelated -PhiMatrix <- - matrix(data = c(1,0, - 0,1 - ), ncol = 2) -tabuData <- - psych::sim( - fx = fxMatrix, - Phi = PhiMatrix, - n = 600, - raw = TRUE - )$observed # observed is the simulated observed data - -colnames(tabuData) = paste0("Item", 1:12) - -tabuModel <- ' -Trait1 =~ Item1 + Item2 + Item3 + Item4 + Item5 + Item6 + 0*Item7 + 0*Item8 + 0*Item9 + 0*Item10 + 0*Item11 + 0*Item12 -Trait2 =~ 0*Item1 + 0*Item2 + 0*Item3 + 0*Item4 + 0*Item5 + 0*Item6 + Item7 + Item8 + Item9 + Item10 + Item11 + Item12 -' -# fit the initial misspecified model for Tabu -init.model <- lavaan::lavaan(model = tabuModel, data = tabuData, - auto.var=TRUE, auto.fix.first=FALSE, std.lv=TRUE, - auto.cov.lv.x=FALSE) - -# use search.prep to prepare for the Tabu search -ptab <- - search.prep(fitted.model = init.model, - loadings=TRUE, - fcov=FALSE, - errors=FALSE) - -Tabu_example <- - suppressWarnings( - tabu.sem(init.model = init.model, - ptab = ptab, - obj = AIC, - niter = 20, - tabu.size = 10) - ) # the suppressWarning wrapping hides the lavaan WARNING output from improper models - -# check the final model -summary(Tabu_example) - -# plot the change in the objective/criterion function over each run -plot(Tabu_example) +summary(result_SA) +plot(result_SA) ``` -It took a total of `r round(as.difftime(Sys.time() - start.time.Tabu, units = "mins"),2)` `r attr(round(as.difftime(Sys.time() - start.time.Tabu, units = "mins"),2), 'units')` to run this example. - -The next Tabu example demonstrates how to use it to find a short form of a prespecified length with different data. - -```{r Tabu short form} -start.time.Tabu <- Sys.time() -library(ShortForm, quietly = T) -# set the seed to reproduce this example -set.seed(3) -# create simulation data from the `psych` package -# four factors, 12 items each, 48 total items -# factor loading matrix - not quite simple structure -fxMatrix <- - matrix(data = c(rep(x = c(.8, .8, .4, .3), times = 3), - rep(0.2, times = 3*4*3), # first factor loadings - - rep(0.2, times = 3*4), - rep(x = c(.8, .8, .4, .3), times = 3), - rep(0.2, times = 3*4*2), # second factor loadings - - rep(0.2, times = 3*4*2), - rep(x = c(.8, .8, .4, .3), times = 3), - rep(0.2, times = 3*4), # third factor loadings - - rep(0.2, times = 3*4*3), - rep(x = c(.8, .8, .4, .3), times = 3) # fourth factor loadings - ), - ncol = 4) -# factor correlation matrix - all factors uncorrelated -PhiMatrix <- - matrix(data = c(1,0,0,0, - 0,1,0,0, - 0,0,1,0, - 0,0,0,1), ncol = 4) -tabuData <- - psych::sim( - fx = fxMatrix, - Phi = PhiMatrix, - n = 600, - mu = c(-2, -1, 1, 2), - raw = TRUE - )$observed # observed is the simulated observed data - -colnames(tabuData) = paste0("Item", 1:48) - -tabuModel <- ' -Trait1 =~ Item1 + Item2 + Item3 + Item4 + Item5 + Item6 + Item7 + Item8 + Item9 + Item10 + Item11 + Item12 -Trait2 =~ Item13 + Item14 + Item15 + Item16 + Item17 + Item18 + Item19 + Item20 + Item21 + Item22 + Item23 + Item24 -Trait3 =~ Item25 + Item26 + Item27 + Item28 + Item29 + Item30 + Item31 + Item32 + Item33 + Item34 + Item35 + Item36 -Trait4 =~ Item37 + Item38 + Item39 + Item40 + Item41 + Item42 + Item43 + Item44 + Item45 + Item46 + Item47 + Item48 -' - -# specify the criterion function that the Tabu Search minimizes -# wrap this in a tryCatch in case a model does not converge! -# specify an appropriate error value: since we're minimizing, error value must be large -tabuCriterion = function(x) { - tryCatch(lavaan::fitmeasures(object = x, fit.measures = 'chisq'), - error = function(e) Inf) -} - -# use the tabuShortForm function -# reduce form to the best 12 items, 3 per factor -tabuShort <- - tabuShortForm(initialModel = tabuModel, originalData = tabuData, - numItems = c(5,5,5,5), criterion = tabuCriterion, - niter = 20, tabu.size = 10, verbose = FALSE - ) - -# check the chosen model -summary(tabuShort) -# plot the changes in the objective function over each iteration -plot(tabuShort) +```{r quick-example-TS} +set.seed(58310) +shortAntModel <- " +Ability =~ Item1 + Item2 + Item3 + Item4 + Item5 + Item6 + Item7 + Item8 +Ability ~ Outcome +" + +result_TS <- tabuShortForm( + initialModel = shortAntModel, + originalData = simulated_test_data, numItems = 7, + niter = 1, tabu.size = 3, parallel = FALSE +) +summary(result_TS) ``` -It took a total of `r round(as.difftime(Sys.time() - start.time.Tabu, units = "mins"),2)` `r attr(round(as.difftime(Sys.time() - start.time.Tabu, units = "mins"),2), 'units')` to run this example. - -### Simulated Annealing - -This example demonstrates the use of simulated annealing for creating short forms. - -```{r Simulated Annealing example} -start.time.SA <- Sys.time() -library(ShortForm, quietly = T) -# create simulation data from the `psych` package -# four factors, 12 items each, 48 total items -# factor loading matrix - not quite simple structure -set.seed(4) -fxMatrix <- - matrix(data = c(rep(x = c(.8, .8, .4, .3), times = 3), - rep(0.2, times = 3*4*3), # first factor loadings - - rep(0.2, times = 3*4), - rep(x = c(.8, .8, .4, .3), times = 3), - rep(0.2, times = 3*4*2), # second factor loadings - - rep(0.2, times = 3*4*2), - rep(x = c(.8, .8, .4, .3), times = 3), - rep(0.2, times = 3*4), # third factor loadings - - rep(0.2, times = 3*4*3), - rep(x = c(.8, .8, .4, .3), times = 3) # fourth factor loadings - ), - ncol = 4) -# factor correlation matrix - all factors uncorrelated -PhiMatrix <- - matrix(data = c(1,0,0,0, - 0,1,0,0, - 0,0,1,0, - 0,0,0,1), ncol = 4) -annealData <- - psych::sim( - fx = fxMatrix, - Phi = PhiMatrix, - n = 600, - mu = c(-2, -1, 1, 2), - raw = TRUE - )$observed # observed is the simulated observed data - -colnames(annealData) = paste0("Item", 1:48) - -annealModel <- ' -Trait1 =~ Item1 + Item2 + Item3 + Item4 + Item5 + Item6 + Item7 + Item8 + Item9 + Item10 + Item11 + Item12 -Trait2 =~ Item13 + Item14 + Item15 + Item16 + Item17 + Item18 + Item19 + Item20 + Item21 + Item22 + Item23 + Item24 -Trait3 =~ Item25 + Item26 + Item27 + Item28 + Item29 + Item30 + Item31 + Item32 + Item33 + Item34 + Item35 + Item36 -Trait4 =~ Item37 + Item38 + Item39 + Item40 + Item41 + Item42 + Item43 + Item44 + Item45 + Item46 + Item47 + Item48 -' - -lavaan.model.specs <- - list(model.type = "cfa", - auto.var = TRUE, estimator = "default", ordered = NULL, - int.ov.free = TRUE, int.lv.free = FALSE, std.lv = TRUE, auto.fix.first = FALSE, - auto.fix.single = TRUE, auto.cov.lv.x = TRUE, auto.th = TRUE, - auto.delta = TRUE, auto.cov.y = TRUE) - -# perform the SA algorithm -set.seed(1) -SA_example <- - simulatedAnnealing(initialModel = annealModel, originalData = annealData, maxSteps = 200, - fitStatistic = 'cfi', maximize = TRUE, - temperature = "logistic", items = paste0("Item", 1:48), - lavaan.model.specs = lavaan.model.specs, - maxChanges = 3, maxItems = c(6,6,6,6), setChains = 4) -summary(SA_example) -plot(SA_example) # plot showing how the fit value changes at each step +## Workflow + +```{mermaid} +flowchart LR + A@{ shape: lean-r, label: "Full Item Bank" } --> B[Specify Model] + B --> C[Run Optimization Algorithm(s)] + C --> D[Evaluate Candidate Forms] + D --> |One or More Forms Fit| E@{ shape: diamond, label: "Select Short Form" } + D --> |No Adequate Forms Found| C + E --> F@{ shape: lean-l, label: "Reporting & Visualization" }] + ``` -It took a total of `r round(as.difftime(Sys.time() - start.time.SA, units = "mins"),2)` `r attr(round(as.difftime(Sys.time() - start.time.SA, units = "mins"),2), 'units')` to run the SA example, and a total of `r round(as.difftime(Sys.time() - start.time.ACO, units = "mins"),2)` `r attr(round(as.difftime(Sys.time() - start.time.ACO, units = "mins"),2), 'units')` to run all four together. \ No newline at end of file +## Outputs + +ShortForm produces diagnostic outputs such as: + +- Objective function convergence plots +- Algorithm-specific diagnostics +- Summary statistic s for selected item sets + +------------------------------------------------------------------------ + +## Algorithms + +### Ant Colony Optimization (ACO) + +Implementation adapted from [Leite, Huang, & Marcoulides (2008)](https://doi.org/10.1080/00273170802285743). + +### Tabu Search (TS) + +Based on [Marcoulides & Falk (2018)](https://doi.org/10.1080/10705511.2017.1409074), extended for model search and short-form construction. + +### Simulated Annealing (SA) + +Provides one of the first implementations of simulated annealing for psychometric model selection workflows. Implemented following [Kirkpatrick et al. (1983)](https://doi.org/10.1126/science.220.4598.671). + +------------------------------------------------------------------------ + +## Performance Notes + +Computational time depends on: + +- Number and types of items +- Dimensionality/model complexity +- Algorithm convergence settings + +Parallelization is supported for certain workflows. + +------------------------------------------------------------------------ + +## Reproducibility + +ShortForm is designed for reproducible analytical workflows: + +- Fully scriptable +- Compatible with R Markdown and Quarto +- Supports integration into larger modeling pipelines + +------------------------------------------------------------------------ + +## License + +LGPL (\>= 2.0, \< 3) \| Mozilla Public License + +------------------------------------------------------------------------ + +## Citation + +If you use this package, please cite: + +Raborn A, Leite W (2024). *ShortForm: Automatic Short Form Creation*. . ShortForm , R package version 0.5.6, . diff --git a/README.md b/README.md index fd4f959..fb89d51 100644 --- a/README.md +++ b/README.md @@ -2,26 +2,62 @@ # ShortForm [![CRAN_Status_Badge](http://www.r-pkg.org/badges/version-last-release/ShortForm)](http://cran.r-project.org/package=ShortForm) -[![Travis-CI Build -Status](http://travis-ci.org/AnthonyRaborn/ShortForm.svg?branch=master)](http://travis-ci.org/AnthonyRaborn/ShortForm) +[![R-CMD-check](https://github.com/AnthonyRaborn/ShortForm/actions/workflows/R-CMD-check.yaml/badge.svg)](https://github.com/AnthonyRaborn/ShortForm/actions/workflows/R-CMD-check.yaml) [![CRAN Downloads Per Month](https://cranlogs.r-pkg.org/badges/ShortForm)](https://cran.r-project.org/package=ShortForm) [![CRAN Downloads Total](https://cranlogs.r-pkg.org/badges/grand-total/ShortForm?color=orange)](https://cran.r-project.org/package=ShortForm) -Automatic Short Form Creation for scales. Currently, the Ant Colony -Optimization (ACO) Algorithm and the Tabu search are implemented. The -original R implementation for the ACO algorithm is from [Leite, Huang, & -Marcoulides (2008)](doi:10.1080/00273170802285743), while the Tabu -search function was taken from [Marcoulides & Falk -(2018)](doi:10.1080/10705511.2017.1409074). There does not yet seem to -be an application of Simulated Annealing (SA) within psychometrics, but -Drezner & Marcoulides, 1999 (in *Multiple Linear Regression Viewpoints*, -Volume 25(2); not available online) used SA for multiple regression -model selection; this package appears to be the first to implement SA -for psychometric models. +## Overview -This document was created on 2024-05-22. +**ShortForm** is an R package for constructing short-form assessments +from larger item banks using reproducible, optimization-based workflows. + +It provides implementations of metaheuristic search algorithms to +automate item selection while preserving prespecified psychometric +properties. The package is designed for researchers and practitioners +who need scalable, transparent, and reproducible methods for reducing +assessment length. + +------------------------------------------------------------------------ + +## Key Features + +- Automated short-form construction from full item banks +- Multiple optimization algorithms: + - Ant Colony Optimization (ACO) + - Tabu Search (TS) + - Simulated Annealing (SA) +- Integration with `lavaan` and `Mplus` workflows +- Support for custom objective functions and model specifications +- Reproducible, scriptable workflows for assessment design + +------------------------------------------------------------------------ + +## Use Cases + +ShortForm is useful when you need to: + +- Reduce assessment length while maintaining measurement validity +- Automate item selection workflows for large-scale assessments +- Build reproducilbe pipelines for psychometric modeling and evaluation + +------------------------------------------------------------------------ + +## Engineering Highlights + +This package demonstrates: + +- Development and maintenance of an R package distributed via CRAN +- Implementation of optimization algorithms for applied statistical + workflows +- Automated build and testing pipelines using CI/CD +- Integration with other modeling tools +- Reproducible examples using structured simulated data + +------------------------------------------------------------------------ + +This document was created on 2026-04-28. ## Installation @@ -31,451 +67,260 @@ require("devtools") devtools::install_github("AnthonyRaborn/ShortForm", branch = "devel") # the developmental version ``` -## Usage - -Here are some (slightly modified) examples from the help documentation -using lavaan. Be warned, the algorithms may take some time to converge, -particularly with large forms, multiple dimensions, and different -settings. The time for these examples to converge on a laptop with an -Intel Core i7 8th Gen processor is printed at the bottom. See the -`sessionInfo()` below. +## Quick Examples ``` r -sessionInfo() -## R version 4.3.3 (2024-02-29 ucrt) -## Platform: x86_64-w64-mingw32/x64 (64-bit) -## Running under: Windows 11 x64 (build 22621) -## -## Matrix products: default -## +set.seed(58310) +library(ShortForm) +## Package 'ShortForm' version 0.5.6 + +# Example workflow: +# 1. Define item pool and model +# 2. Run optimization algorithm +# 3. Evaluate resulting short form + +result_ACO <- antcolony.lavaan( + data = simulated_test_data, + antModel = exampleAntModel, + list.items = list(paste0("Item", 1:56)), + full = 56, i.per.f = 15, + factors = "Ability", + steps = 100, + fit.indices = c("cfi", "rmsea"), + fit.statistics.test = "(cfi > 0.98)&(rmsea < 0.03)", + summaryfile = NULL, + feedbackfile = NULL, + max.run = 200 +) +## Run number 1 and ant number 1. Run number 1 and ant number 2. Run number 1 and ant number 3. Run number 1 and ant number 4. Run number 1 and ant number 5. Run number 1 and ant number 6. Run number 1 and ant number 7. Run number 1 and ant number 8. Run number 1 and ant number 9. Run number 1 and ant number 10. Run number 1 and ant number 11. Run number 1 and ant number 12. Run number 1 and ant number 13. Run number 1 and ant number 14. Run number 1 and ant number 15. Run number 1 and ant number 16. Run number 1 and ant number 17. Run number 1 and ant number 18. Run number 1 and ant number 19. Run number 1 and ant number 20. Run number 2 and ant number 1. Run number 2 and ant number 2. Run number 2 and ant number 3. Run number 2 and ant number 4. Run number 2 and ant number 5. Run number 2 and ant number 6. Run number 2 and ant number 7. Run number 2 and ant number 8. Run number 2 and ant number 9. Run number 2 and ant number 10. Run number 2 and ant number 11. Run number 2 and ant number 12. Run number 2 and ant number 13. Run number 2 and ant number 14. Run number 2 and ant number 15. Run number 2 and ant number 16. Run number 2 and ant number 17. Run number 2 and ant number 18. Run number 2 and ant number 19. Run number 2 and ant number 20. Run number 3 and ant number 1. Run number 3 and ant number 2. Run number 3 and ant number 3. Run number 3 and ant number 4. Run number 3 and ant number 5. Run number 3 and ant number 6. Run number 3 and ant number 7. Run number 3 and ant number 8. Run number 3 and ant number 9. Run number 3 and ant number 10. Run number 3 and ant number 11. Run number 3 and ant number 12. Run number 3 and ant number 13. Run number 3 and ant number 14. Run number 3 and ant number 15. Run number 3 and ant number 16. Run number 3 and ant number 17. Run number 3 and ant number 18. Run number 3 and ant number 19. Run number 3 and ant number 20. Run number 4 and ant number 1. Run number 4 and ant number 2. Run number 4 and ant number 3. Run number 4 and ant number 4. Run number 4 and ant number 5. Run number 4 and ant number 6. Run number 4 and ant number 7. Run number 4 and ant number 8. Run number 4 and ant number 9. Run number 4 and ant number 10. Run number 4 and ant number 11. Run number 4 and ant number 12. Run number 4 and ant number 13. Run number 4 and ant number 14. Run number 4 and ant number 15. Run number 4 and ant number 16. Run number 4 and ant number 17. Run number 4 and ant number 18. Run number 4 and ant number 19. Run number 4 and ant number 20. Run number 5 and ant number 1. Run number 5 and ant number 2. Run number 5 and ant number 3. Run number 5 and ant number 4. Run number 5 and ant number 5. Run number 5 and ant number 6. Run number 5 and ant number 7. Run number 5 and ant number 8. Run number 5 and ant number 9. Run number 5 and ant number 10. Run number 5 and ant number 11. Run number 5 and ant number 12. Run number 5 and ant number 13. Run number 5 and ant number 14. Run number 5 and ant number 15. Run number 5 and ant number 16. Run number 5 and ant number 17. Run number 5 and ant number 18. Run number 5 and ant number 19. Run number 5 and ant number 20. Run number 6 and ant number 1. Run number 6 and ant number 2. Run number 6 and ant number 3. Run number 6 and ant number 4. Run number 6 and ant number 5. Run number 6 and ant number 6. Run number 6 and ant number 7. Run number 6 and ant number 8. Run number 6 and ant number 9. Run number 6 and ant number 10. Run number 6 and ant number 11. Run number 6 and ant number 12. Run number 6 and ant number 13. Run number 6 and ant number 14. Run number 6 and ant number 15. Run number 6 and ant number 16. Run number 6 and ant number 17. Run number 6 and ant number 18. Run number 6 and ant number 19. Run number 6 and ant number 20. Run number 7 and ant number 1. Run number 7 and ant number 2. Run number 7 and ant number 3. Run number 7 and ant number 4. Run number 7 and ant number 5. Run number 7 and ant number 6. Run number 7 and ant number 7. Run number 7 and ant number 8. Run number 7 and ant number 9. Run number 7 and ant number 10. Run number 7 and ant number 11. Run number 7 and ant number 12. Run number 7 and ant number 13. Run number 7 and ant number 14. Run number 7 and ant number 15. Run number 7 and ant number 16. Run number 7 and ant number 17. Run number 7 and ant number 18. Run number 7 and ant number 19. Run number 7 and ant number 20. Run number 8 and ant number 1. Run number 8 and ant number 2. Run number 8 and ant number 3. Run number 8 and ant number 4. Run number 8 and ant number 5. Run number 8 and ant number 6. Run number 8 and ant number 7. Run number 8 and ant number 8. Run number 8 and ant number 9. Run number 8 and ant number 10. Run number 8 and ant number 11. Run number 8 and ant number 12. Run number 8 and ant number 13. Run number 8 and ant number 14. Run number 8 and ant number 15. Run number 8 and ant number 16. Run number 8 and ant number 17. Run number 8 and ant number 18. Run number 8 and ant number 19. Run number 8 and ant number 20. Run number 9 and ant number 1. Run number 9 and ant number 2. Run number 9 and ant number 3. Run number 9 and ant number 4. Run number 9 and ant number 5. Run number 9 and ant number 6. Run number 9 and ant number 7. Run number 9 and ant number 8. Run number 9 and ant number 9. Run number 9 and ant number 10. Run number 9 and ant number 11. Run number 9 and ant number 12. Run number 9 and ant number 13. Run number 9 and ant number 14. Run number 9 and ant number 15. Run number 9 and ant number 16. Run number 9 and ant number 17. Run number 9 and ant number 18. Run number 9 and ant number 19. Run number 9 and ant number 20. Run number 10 and ant number 1. Run number 10 and ant number 2. Run number 10 and ant number 3. Run number 10 and ant number 4. Run number 10 and ant number 5. Run number 10 and ant number 6. Run number 10 and ant number 7. Run number 10 and ant number 8. Run number 10 and ant number 9. Run number 10 and ant number 10. Run number 10 and ant number 11. Run number 10 and ant number 12. Run number 10 and ant number 13. Run number 10 and ant number 14. Run number 10 and ant number 15. Run number 10 and ant number 16. Run number 10 and ant number 17. Run number 10 and ant number 18. Run number 10 and ant number 19. Run number 10 and ant number 20. Run number 11 and ant number 1. Run number 11 and ant number 2. Run number 11 and ant number 3. Run number 11 and ant number 4. Run number 11 and ant number 5. Run number 11 and ant number 6. Run number 11 and ant number 7. Run number 11 and ant number 8. Run number 11 and ant number 9. Run number 11 and ant number 10. Run number 11 and ant number 11. Run number 11 and ant number 12. Run number 11 and ant number 13. Run number 11 and ant number 14. Run number 11 and ant number 15. Run number 11 and ant number 16. Run number 11 and ant number 17. Run number 11 and ant number 18. Run number 11 and ant number 19. Run number 11 and ant number 20. Run number 12 and ant number 1. Run number 12 and ant number 2. Run number 12 and ant number 3. Run number 12 and ant number 4. Run number 12 and ant number 5. Run number 12 and ant number 6. Run number 12 and ant number 7. Run number 12 and ant number 8. Run number 12 and ant number 9. Run number 12 and ant number 10. Run number 12 and ant number 11. Run number 12 and ant number 12. Run number 12 and ant number 13. Run number 12 and ant number 14. Run number 12 and ant number 15. Run number 12 and ant number 16. Run number 12 and ant number 17. Run number 12 and ant number 18. Run number 12 and ant number 19. Run number 12 and ant number 20. Run number 13 and ant number 1. Run number 13 and ant number 2. Run number 13 and ant number 3. Run number 13 and ant number 4. Run number 13 and ant number 5. Run number 13 and ant number 6. Run number 13 and ant number 7. Run number 13 and ant number 8. Run number 13 and ant number 9. Run number 13 and ant number 10. Run number 13 and ant number 11. Run number 13 and ant number 12. Run number 13 and ant number 13. Run number 13 and ant number 14. Run number 13 and ant number 15. Run number 13 and ant number 16. Run number 13 and ant number 17. Run number 13 and ant number 18. Run number 13 and ant number 19. Run number 13 and ant number 20. Run number 14 and ant number 1. Run number 14 and ant number 2. Run number 14 and ant number 3. Run number 14 and ant number 4. Run number 14 and ant number 5. Run number 14 and ant number 6. Run number 14 and ant number 7. Run number 14 and ant number 8. Run number 14 and ant number 9. Run number 14 and ant number 10. Run number 14 and ant number 11. Run number 14 and ant number 12. Run number 14 and ant number 13. Run number 14 and ant number 14. Run number 14 and ant number 15. Run number 14 and ant number 16. Run number 14 and ant number 17. Run number 14 and ant number 18. Run number 14 and ant number 19. Run number 14 and ant number 20. Run number 15 and ant number 1. Run number 15 and ant number 2. Run number 15 and ant number 3. Run number 15 and ant number 4. Run number 15 and ant number 5. Run number 15 and ant number 6. Run number 15 and ant number 7. Run number 15 and ant number 8. Run number 15 and ant number 9. Run number 15 and ant number 10. Run number 15 and ant number 11. Run number 15 and ant number 12. Run number 15 and ant number 13. Run number 15 and ant number 14. Run number 15 and ant number 15. Run number 15 and ant number 16. Run number 15 and ant number 17. Run number 15 and ant number 18. Run number 15 and ant number 19. Run number 15 and ant number 20. Run number 16 and ant number 1. Run number 16 and ant number 2. Run number 16 and ant number 3. Run number 16 and ant number 4. Run number 16 and ant number 5. Run number 16 and ant number 6. Run number 16 and ant number 7. Run number 16 and ant number 8. Run number 16 and ant number 9. Run number 16 and ant number 10. Run number 16 and ant number 11. Run number 16 and ant number 12. Run number 16 and ant number 13. Run number 16 and ant number 14. Run number 16 and ant number 15. Run number 16 and ant number 16. Run number 16 and ant number 17. Run number 16 and ant number 18. Run number 16 and ant number 19. Run number 16 and ant number 20. Run number 17 and ant number 1. Run number 17 and ant number 2. Run number 17 and ant number 3. Run number 17 and ant number 4. Run number 17 and ant number 5. Run number 17 and ant number 6. Run number 17 and ant number 7. Run number 17 and ant number 8. Run number 17 and ant number 9. Run number 17 and ant number 10. Run number 17 and ant number 11. Run number 17 and ant number 12. Run number 17 and ant number 13. Run number 17 and ant number 14. Run number 17 and ant number 15. Run number 17 and ant number 16. Run number 17 and ant number 17. Run number 17 and ant number 18. Run number 17 and ant number 19. Run number 17 and ant number 20. Run number 18 and ant number 1. Run number 18 and ant number 2. Run number 18 and ant number 3. Run number 18 and ant number 4. Run number 18 and ant number 5. Run number 18 and ant number 6. Run number 18 and ant number 7. Run number 18 and ant number 8. Run number 18 and ant number 9. Run number 18 and ant number 10. Run number 18 and ant number 11. Run number 18 and ant number 12. Run number 18 and ant number 13. Run number 18 and ant number 14. Run number 18 and ant number 15. Run number 18 and ant number 16. Run number 18 and ant number 17. Run number 18 and ant number 18. Run number 18 and ant number 19. Run number 18 and ant number 20. Run number 19 and ant number 1. Run number 19 and ant number 2. Run number 19 and ant number 3. Run number 19 and ant number 4. Run number 19 and ant number 5. Run number 19 and ant number 6. Run number 19 and ant number 7. Run number 19 and ant number 8. Run number 19 and ant number 9. Run number 19 and ant number 10. Run number 19 and ant number 11. Run number 19 and ant number 12. Run number 19 and ant number 13. Run number 19 and ant number 14. Run number 19 and ant number 15. Run number 19 and ant number 16. Run number 19 and ant number 17. Run number 19 and ant number 18. Run number 19 and ant number 19. Run number 19 and ant number 20. Run number 20 and ant number 1. Run number 20 and ant number 2. Run number 20 and ant number 3. Run number 20 and ant number 4. Run number 20 and ant number 5. Run number 20 and ant number 6. Run number 20 and ant number 7. Run number 20 and ant number 8. Run number 20 and ant number 9. Run number 20 and ant number 10. Run number 20 and ant number 11. Run number 20 and ant number 12. Run number 20 and ant number 13. Run number 20 and ant number 14. Run number 20 and ant number 15. Run number 20 and ant number 16. Run number 20 and ant number 17. Run number 20 and ant number 18. Run number 20 and ant number 19. Run number 20 and ant number 20. Run number 21 and ant number 1. Run number 21 and ant number 2. Run number 21 and ant number 3. Run number 21 and ant number 4. Run number 21 and ant number 5. Run number 21 and ant number 6. Run number 21 and ant number 7. Run number 21 and ant number 8. Run number 21 and ant number 9. Run number 21 and ant number 10. Run number 21 and ant number 11. Run number 21 and ant number 12. Run number 21 and ant number 13. Run number 21 and ant number 14. Run number 21 and ant number 15. Run number 21 and ant number 16. Run number 21 and ant number 17. Run number 21 and ant number 18. Run number 21 and ant number 19. Run number 21 and ant number 20. Run number 22 and ant number 1. Run number 22 and ant number 2. Run number 22 and ant number 3. Run number 22 and ant number 4. Run number 22 and ant number 5. Run number 22 and ant number 6. Run number 22 and ant number 7. Run number 22 and ant number 8. Run number 22 and ant number 9. Run number 22 and ant number 10. Run number 22 and ant number 11. Run number 22 and ant number 12. Run number 22 and ant number 13. Run number 22 and ant number 14. Run number 22 and ant number 15. Run number 22 and ant number 16. Run number 22 and ant number 17. Run number 22 and ant number 18. Run number 22 and ant number 19. Run number 22 and ant number 20. Run number 23 and ant number 1. Run number 23 and ant number 2. Run number 23 and ant number 3. Run number 23 and ant number 4. Run number 23 and ant number 5. Run number 23 and ant number 6. Run number 23 and ant number 7. Run number 23 and ant number 8. Run number 23 and ant number 9. Run number 23 and ant number 10. Run number 23 and ant number 11. Run number 23 and ant number 12. Run number 23 and ant number 13. Run number 23 and ant number 14. Run number 23 and ant number 15. Run number 23 and ant number 16. Run number 23 and ant number 17. Run number 23 and ant number 18. Run number 23 and ant number 19. Run number 23 and ant number 20. Run number 24 and ant number 1. Run number 24 and ant number 2. Run number 24 and ant number 3. Run number 24 and ant number 4. Run number 24 and ant number 5. Run number 24 and ant number 6. Run number 24 and ant number 7. Run number 24 and ant number 8. Run number 24 and ant number 9. Run number 24 and ant number 10. Run number 24 and ant number 11. Run number 24 and ant number 12. Run number 24 and ant number 13. Run number 24 and ant number 14. Run number 24 and ant number 15. Run number 24 and ant number 16. Run number 24 and ant number 17. Run number 24 and ant number 18. Run number 24 and ant number 19. Run number 24 and ant number 20. Run number 25 and ant number 1. Run number 25 and ant number 2. Run number 25 and ant number 3. Run number 25 and ant number 4. Run number 25 and ant number 5. Run number 25 and ant number 6. Run number 25 and ant number 7. Run number 25 and ant number 8. Run number 25 and ant number 9. Run number 25 and ant number 10. Run number 25 and ant number 11. Run number 25 and ant number 12. Run number 25 and ant number 13. Run number 25 and ant number 14. Run number 25 and ant number 15. Run number 25 and ant number 16. Run number 25 and ant number 17. Run number 25 and ant number 18. Run number 25 and ant number 19. Run number 25 and ant number 20. Run number 26 and ant number 1. Run number 26 and ant number 2. Run number 26 and ant number 3. Run number 26 and ant number 4. Run number 26 and ant number 5. Run number 26 and ant number 6. Run number 26 and ant number 7. Run number 26 and ant number 8. Run number 26 and ant number 9. Run number 26 and ant number 10. Run number 26 and ant number 11. Run number 26 and ant number 12. Run number 26 and ant number 13. Run number 26 and ant number 14. Run number 26 and ant number 15. Run number 26 and ant number 16. Run number 26 and ant number 17. Run number 26 and ant number 18. Run number 26 and ant number 19. Run number 26 and ant number 20. Run number 27 and ant number 1. Run number 27 and ant number 2. Run number 27 and ant number 3. Run number 27 and ant number 4. Run number 27 and ant number 5. Run number 27 and ant number 6. Run number 27 and ant number 7. Run number 27 and ant number 8. Run number 27 and ant number 9. Run number 27 and ant number 10. Run number 27 and ant number 11. Run number 27 and ant number 12. Run number 27 and ant number 13. Run number 27 and ant number 14. Run number 27 and ant number 15. Run number 27 and ant number 16. Run number 27 and ant number 17. Run number 27 and ant number 18. Run number 27 and ant number 19. Run number 27 and ant number 20. Run number 28 and ant number 1. Run number 28 and ant number 2. Run number 28 and ant number 3. Run number 28 and ant number 4. Run number 28 and ant number 5. Run number 28 and ant number 6. Run number 28 and ant number 7. Run number 28 and ant number 8. Run number 28 and ant number 9. Run number 28 and ant number 10. Run number 28 and ant number 11. Run number 28 and ant number 12. Run number 28 and ant number 13. Run number 28 and ant number 14. Run number 28 and ant number 15. Run number 28 and ant number 16. Run number 28 and ant number 17. Run number 28 and ant number 18. Run number 28 and ant number 19. Run number 28 and ant number 20. [1] "Compiling results." + +summary(result_ACO) +## Algorithm: Ant Colony Optimization +## Total Run Time: 55.258 secs ## -## locale: -## [1] LC_COLLATE=English_United States.utf8 -## [2] LC_CTYPE=English_United States.utf8 -## [3] LC_MONETARY=English_United States.utf8 -## [4] LC_NUMERIC=C -## [5] LC_TIME=English_United States.utf8 +## lavaan 0.6-20 ended normally after 52 iterations ## -## time zone: America/Phoenix -## tzcode source: internal +## Estimator ML +## Optimization method NLMINB +## Number of model parameters 32 ## -## attached base packages: -## [1] stats graphics grDevices utils datasets methods base +## Number of observations 1000 ## -## loaded via a namespace (and not attached): -## [1] compiler_4.3.3 fastmap_1.1.1 cli_3.6.2 tools_4.3.3 -## [5] htmltools_0.5.7 rstudioapi_0.15.0 yaml_2.3.8 rmarkdown_2.26 -## [9] knitr_1.45 xfun_0.42 digest_0.6.35 rlang_1.1.3 -## [13] evaluate_0.23 -``` - -### ACO Algorithm - -``` r -start.time.ACO <- Sys.time() -library(ShortForm, quietly = T) -## Package 'ShortForm' version 0.5.4 -# using simulated test data and the default values for lavaan.model.specs -set.seed(1) -# create simulation data from the `psych` package -# four factors, 12 items each, 48 total items -# factor loading matrix - not quite simple structure -fxMatrix <- - matrix(data = c(rep(x = c(.8, .8, .4, .3), times = 3), - rep(0.2, times = 3*4*3), # first factor loadings - - rep(0.2, times = 3*4), - rep(x = c(.8, .8, .4, .3), times = 3), - rep(0.2, times = 3*4*2), # second factor loadings - - rep(0.2, times = 3*4*2), - rep(x = c(.8, .8, .4, .3), times = 3), - rep(0.2, times = 3*4), # third factor loadings - - rep(0.2, times = 3*4*3), - rep(x = c(.8, .8, .4, .3), times = 3) # fourth factor loadings - ), - ncol = 4) -# factor correlation matrix - all factors uncorrelated -PhiMatrix <- - matrix(data = c(1,0,0,0, - 0,1,0,0, - 0,0,1,0, - 0,0,0,1), ncol = 4) -antData <- - psych::sim( - fx = fxMatrix, - Phi = PhiMatrix, - n = 600, - mu = c(-2, -1, 1, 2), - raw = TRUE - )$observed # observed is the simulated observed data - -colnames(antData) = paste0("Item", 1:48) - -antModel <- ' -Trait1 =~ Item1 + Item2 + Item3 + Item4 + Item5 + Item6 + Item7 + Item8 + Item9 + Item10 + Item11 + Item12 -Trait2 =~ Item13 + Item14 + Item15 + Item16 + Item17 + Item18 + Item19 + Item20 + Item21 + Item22 + Item23 + Item24 -Trait3 =~ Item25 + Item26 + Item27 + Item28 + Item29 + Item30 + Item31 + Item32 + Item33 + Item34 + Item35 + Item36 -Trait4 =~ Item37 + Item38 + Item39 + Item40 + Item41 + Item42 + Item43 + Item44 + Item45 + Item46 + Item47 + Item48 -' - -# then, create the list of the items by the factors -list.items <- - list( - paste0("Item", 1:12), - paste0("Item", 13:24), - paste0("Item", 25:36), - paste0("Item", 37:48) - ) -# finally, call the function with some minor changes to the default values. -abilityShortForm = - antcolony.lavaan(data = antData, - ants = 10, evaporation = 0.9, antModel = antModel, - list.items = list.items, full = 48, i.per.f = c(6,6,6,6), - lavaan.model.specs = - list(model.type = "cfa", auto.var = T, estimator = "default", - ordered = NULL, int.ov.free = TRUE, - int.lv.free = FALSE, auto.fix.first = TRUE, - auto.fix.single = TRUE, std.lv = FALSE, auto.cov.lv.x = TRUE, - auto.th = TRUE, auto.delta = TRUE, - auto.cov.y = TRUE), - factors = c("Trait1", "Trait2", "Trait3", "Trait4"), steps = 100, - max.run = 100, - parallel = T) -## Run number 1 and ant number 1. Run number 1 and ant number 2. Run number 1 and ant number 3. Run number 1 and ant number 4. Run number 1 and ant number 5. Run number 1 and ant number 6. Run number 1 and ant number 7. Run number 1 and ant number 8. Run number 1 and ant number 9. Run number 1 and ant number 10. Run number 2 and ant number 1. Run number 2 and ant number 2. Run number 2 and ant number 3. Run number 2 and ant number 4. Run number 2 and ant number 5. Run number 2 and ant number 6. Run number 2 and ant number 7. Run number 2 and ant number 8. Run number 2 and ant number 9. Run number 2 and ant number 10. Run number 3 and ant number 1. Run number 3 and ant number 2. Run number 3 and ant number 3. Run number 3 and ant number 4. Run number 3 and ant number 5. Run number 3 and ant number 6. Run number 3 and ant number 7. Run number 3 and ant number 8. Run number 3 and ant number 9. Run number 3 and ant number 10. Run number 4 and ant number 1. Run number 4 and ant number 2. Run number 4 and ant number 3. Run number 4 and ant number 4. Run number 4 and ant number 5. Run number 4 and ant number 6. Run number 4 and ant number 7. Run number 4 and ant number 8. Run number 4 and ant number 9. Run number 4 and ant number 10. Run number 5 and ant number 1. Run number 5 and ant number 2. Run number 5 and ant number 3. Run number 5 and ant number 4. Run number 5 and ant number 5. Run number 5 and ant number 6. Run number 5 and ant number 7. Run number 5 and ant number 8. Run number 5 and ant number 9. Run number 5 and ant number 10. Run number 6 and ant number 1. Run number 6 and ant number 2. Run number 6 and ant number 3. Run number 6 and ant number 4. Run number 6 and ant number 5. Run number 6 and ant number 6. Run number 6 and ant number 7. Run number 6 and ant number 8. Run number 6 and ant number 9. Run number 6 and ant number 10. Run number 7 and ant number 1. Run number 7 and ant number 2. Run number 7 and ant number 3. Run number 7 and ant number 4. Run number 7 and ant number 5. Run number 7 and ant number 6. Run number 7 and ant number 7. Run number 7 and ant number 8. Run number 7 and ant number 9. Run number 7 and ant number 10. Run number 8 and ant number 1. Run number 8 and ant number 2. Run number 8 and ant number 3. Run number 8 and ant number 4. Run number 8 and ant number 5. Run number 8 and ant number 6. Run number 8 and ant number 7. Run number 8 and ant number 8. Run number 8 and ant number 9. Run number 8 and ant number 10. Run number 9 and ant number 1. Run number 9 and ant number 2. Run number 9 and ant number 3. Run number 9 and ant number 4. Run number 9 and ant number 5. Run number 9 and ant number 6. Run number 9 and ant number 7. Run number 9 and ant number 8. Run number 9 and ant number 9. Run number 9 and ant number 10. Run number 10 and ant number 1. Run number 10 and ant number 2. Run number 10 and ant number 3. Run number 10 and ant number 4. Run number 10 and ant number 5. Run number 10 and ant number 6. Run number 10 and ant number 7. Run number 10 and ant number 8. Run number 10 and ant number 9. Run number 10 and ant number 10. Run number 11 and ant number 1. Run number 11 and ant number 2. Run number 11 and ant number 3. Run number 11 and ant number 4. Run number 11 and ant number 5. Run number 11 and ant number 6. Run number 11 and ant number 7. Run number 11 and ant number 8. Run number 11 and ant number 9. Run number 11 and ant number 10. Run number 12 and ant number 1. Run number 12 and ant number 2. Run number 12 and ant number 3. Run number 12 and ant number 4. Run number 12 and ant number 5. Run number 12 and ant number 6. Run number 12 and ant number 7. Run number 12 and ant number 8. Run number 12 and ant number 9. Run number 12 and ant number 10. Run number 13 and ant number 1. Run number 13 and ant number 2. Run number 13 and ant number 3. Run number 13 and ant number 4. Run number 13 and ant number 5. Run number 13 and ant number 6. Run number 13 and ant number 7. Run number 13 and ant number 8. Run number 13 and ant number 9. Run number 13 and ant number 10. Run number 14 and ant number 1. Run number 14 and ant number 2. Run number 14 and ant number 3. Run number 14 and ant number 4. Run number 14 and ant number 5. Run number 14 and ant number 6. Run number 14 and ant number 7. Run number 14 and ant number 8. Run number 14 and ant number 9. Run number 14 and ant number 10. Run number 15 and ant number 1. Run number 15 and ant number 2. Run number 15 and ant number 3. Run number 15 and ant number 4. Run number 15 and ant number 5. Run number 15 and ant number 6. Run number 15 and ant number 7. Run number 15 and ant number 8. Run number 15 and ant number 9. Run number 15 and ant number 10. Run number 16 and ant number 1. Run number 16 and ant number 2. Run number 16 and ant number 3. Run number 16 and ant number 4. Run number 16 and ant number 5. Run number 16 and ant number 6. Run number 16 and ant number 7. Run number 16 and ant number 8. Run number 16 and ant number 9. Run number 16 and ant number 10. Run number 17 and ant number 1. Run number 17 and ant number 2. Run number 17 and ant number 3. Run number 17 and ant number 4. Run number 17 and ant number 5. Run number 17 and ant number 6. Run number 17 and ant number 7. Run number 17 and ant number 8. Run number 17 and ant number 9. Run number 17 and ant number 10. Run number 18 and ant number 1. Run number 18 and ant number 2. Run number 18 and ant number 3. Run number 18 and ant number 4. Run number 18 and ant number 5. Run number 18 and ant number 6. Run number 18 and ant number 7. Run number 18 and ant number 8. Run number 18 and ant number 9. Run number 18 and ant number 10. Run number 19 and ant number 1. Run number 19 and ant number 2. Run number 19 and ant number 3. Run number 19 and ant number 4. Run number 19 and ant number 5. Run number 19 and ant number 6. Run number 19 and ant number 7. Run number 19 and ant number 8. Run number 19 and ant number 9. Run number 19 and ant number 10. Run number 20 and ant number 1. Run number 20 and ant number 2. Run number 20 and ant number 3. Run number 20 and ant number 4. Run number 20 and ant number 5. Run number 20 and ant number 6. Run number 20 and ant number 7. Run number 20 and ant number 8. Run number 20 and ant number 9. Run number 20 and ant number 10. Run number 21 and ant number 1. Run number 21 and ant number 2. Run number 21 and ant number 3. Run number 21 and ant number 4. Run number 21 and ant number 5. Run number 21 and ant number 6. Run number 21 and ant number 7. Run number 21 and ant number 8. Run number 21 and ant number 9. Run number 21 and ant number 10. Run number 22 and ant number 1. Run number 22 and ant number 2. Run number 22 and ant number 3. Run number 22 and ant number 4. Run number 22 and ant number 5. Run number 22 and ant number 6. Run number 22 and ant number 7. Run number 22 and ant number 8. Run number 22 and ant number 9. Run number 22 and ant number 10. Run number 23 and ant number 1. Run number 23 and ant number 2. Run number 23 and ant number 3. Run number 23 and ant number 4. Run number 23 and ant number 5. Run number 23 and ant number 6. Run number 23 and ant number 7. Run number 23 and ant number 8. Run number 23 and ant number 9. Run number 23 and ant number 10. Run number 24 and ant number 1. Run number 24 and ant number 2. Run number 24 and ant number 3. Run number 24 and ant number 4. Run number 24 and ant number 5. Run number 24 and ant number 6. Run number 24 and ant number 7. Run number 24 and ant number 8. Run number 24 and ant number 9. Run number 24 and ant number 10. Run number 25 and ant number 1. Run number 25 and ant number 2. Run number 25 and ant number 3. Run number 25 and ant number 4. Run number 25 and ant number 5. Run number 25 and ant number 6. Run number 25 and ant number 7. Run number 25 and ant number 8. Run number 25 and ant number 9. Run number 25 and ant number 10. Run number 26 and ant number 1. Run number 26 and ant number 2. Run number 26 and ant number 3. Run number 26 and ant number 4. Run number 26 and ant number 5. Run number 26 and ant number 6. Run number 26 and ant number 7. Run number 26 and ant number 8. Run number 26 and ant number 9. Run number 26 and ant number 10. Run number 27 and ant number 1. Run number 27 and ant number 2. Run number 27 and ant number 3. Run number 27 and ant number 4. Run number 27 and ant number 5. Run number 27 and ant number 6. Run number 27 and ant number 7. Run number 27 and ant number 8. Run number 27 and ant number 9. Run number 27 and ant number 10. Run number 28 and ant number 1. Run number 28 and ant number 2. Run number 28 and ant number 3. Run number 28 and ant number 4. Run number 28 and ant number 5. Run number 28 and ant number 6. Run number 28 and ant number 7. Run number 28 and ant number 8. Run number 28 and ant number 9. Run number 28 and ant number 10. Run number 29 and ant number 1. Run number 29 and ant number 2. Run number 29 and ant number 3. Run number 29 and ant number 4. Run number 29 and ant number 5. Run number 29 and ant number 6. Run number 29 and ant number 7. Run number 29 and ant number 8. Run number 29 and ant number 9. Run number 29 and ant number 10. Run number 30 and ant number 1. Run number 30 and ant number 2. Run number 30 and ant number 3. Run number 30 and ant number 4. Run number 30 and ant number 5. Run number 30 and ant number 6. Run number 30 and ant number 7. Run number 30 and ant number 8. Run number 30 and ant number 9. Run number 30 and ant number 10. Run number 31 and ant number 1. Run number 31 and ant number 2. Run number 31 and ant number 3. Run number 31 and ant number 4. Run number 31 and ant number 5. Run number 31 and ant number 6. Run number 31 and ant number 7. Run number 31 and ant number 8. Run number 31 and ant number 9. Run number 31 and ant number 10. Run number 32 and ant number 1. Run number 32 and ant number 2. Run number 32 and ant number 3. Run number 32 and ant number 4. Run number 32 and ant number 5. Run number 32 and ant number 6. Run number 32 and ant number 7. Run number 32 and ant number 8. Run number 32 and ant number 9. Run number 32 and ant number 10. Run number 33 and ant number 1. Run number 33 and ant number 2. Run number 33 and ant number 3. Run number 33 and ant number 4. Run number 33 and ant number 5. Run number 33 and ant number 6. Run number 33 and ant number 7. Run number 33 and ant number 8. Run number 33 and ant number 9. Run number 33 and ant number 10. Run number 34 and ant number 1. Run number 34 and ant number 2. Run number 34 and ant number 3. Run number 34 and ant number 4. Run number 34 and ant number 5. Run number 34 and ant number 6. Run number 34 and ant number 7. Run number 34 and ant number 8. Run number 34 and ant number 9. Run number 34 and ant number 10. Run number 35 and ant number 1. Run number 35 and ant number 2. Run number 35 and ant number 3. Run number 35 and ant number 4. Run number 35 and ant number 5. Run number 35 and ant number 6. Run number 35 and ant number 7. Run number 35 and ant number 8. Run number 35 and ant number 9. Run number 35 and ant number 10. Run number 36 and ant number 1. Run number 36 and ant number 2. Run number 36 and ant number 3. Run number 36 and ant number 4. Run number 36 and ant number 5. Run number 36 and ant number 6. Run number 36 and ant number 7. Run number 36 and ant number 8. Run number 36 and ant number 9. Run number 36 and ant number 10. Run number 37 and ant number 1. Run number 37 and ant number 2. Run number 37 and ant number 3. Run number 37 and ant number 4. Run number 37 and ant number 5. Run number 37 and ant number 6. Run number 37 and ant number 7. Run number 37 and ant number 8. Run number 37 and ant number 9. Run number 37 and ant number 10. Run number 38 and ant number 1. Run number 38 and ant number 2. Run number 38 and ant number 3. Run number 38 and ant number 4. Run number 38 and ant number 5. Run number 38 and ant number 6. Run number 38 and ant number 7. Run number 38 and ant number 8. Run number 38 and ant number 9. Run number 38 and ant number 10. Run number 39 and ant number 1. Run number 39 and ant number 2. Run number 39 and ant number 3. Run number 39 and ant number 4. Run number 39 and ant number 5. Run number 39 and ant number 6. Run number 39 and ant number 7. Run number 39 and ant number 8. Run number 39 and ant number 9. Run number 39 and ant number 10. Run number 40 and ant number 1. Run number 40 and ant number 2. Run number 40 and ant number 3. Run number 40 and ant number 4. Run number 40 and ant number 5. Run number 40 and ant number 6. Run number 40 and ant number 7. Run number 40 and ant number 8. Run number 40 and ant number 9. Run number 40 and ant number 10. Run number 41 and ant number 1. Run number 41 and ant number 2. Run number 41 and ant number 3. Run number 41 and ant number 4. Run number 41 and ant number 5. Run number 41 and ant number 6. Run number 41 and ant number 7. Run number 41 and ant number 8. Run number 41 and ant number 9. Run number 41 and ant number 10. Run number 42 and ant number 1. Run number 42 and ant number 2. Run number 42 and ant number 3. Run number 42 and ant number 4. Run number 42 and ant number 5. Run number 42 and ant number 6. Run number 42 and ant number 7. Run number 42 and ant number 8. Run number 42 and ant number 9. Run number 42 and ant number 10. Run number 43 and ant number 1. Run number 43 and ant number 2. Run number 43 and ant number 3. Run number 43 and ant number 4. Run number 43 and ant number 5. Run number 43 and ant number 6. Run number 43 and ant number 7. Run number 43 and ant number 8. Run number 43 and ant number 9. Run number 43 and ant number 10. Run number 44 and ant number 1. Run number 44 and ant number 2. Run number 44 and ant number 3. Run number 44 and ant number 4. Run number 44 and ant number 5. Run number 44 and ant number 6. Run number 44 and ant number 7. Run number 44 and ant number 8. Run number 44 and ant number 9. Run number 44 and ant number 10. Run number 45 and ant number 1. Run number 45 and ant number 2. Run number 45 and ant number 3. Run number 45 and ant number 4. Run number 45 and ant number 5. Run number 45 and ant number 6. Run number 45 and ant number 7. Run number 45 and ant number 8. Run number 45 and ant number 9. Run number 45 and ant number 10. Run number 46 and ant number 1. Run number 46 and ant number 2. Run number 46 and ant number 3. Run number 46 and ant number 4. Run number 46 and ant number 5. Run number 46 and ant number 6. Run number 46 and ant number 7. Run number 46 and ant number 8. Run number 46 and ant number 9. Run number 46 and ant number 10. Run number 47 and ant number 1. Run number 47 and ant number 2. Run number 47 and ant number 3. Run number 47 and ant number 4. Run number 47 and ant number 5. Run number 47 and ant number 6. Run number 47 and ant number 7. Run number 47 and ant number 8. Run number 47 and ant number 9. Run number 47 and ant number 10. Run number 48 and ant number 1. Run number 48 and ant number 2. Run number 48 and ant number 3. Run number 48 and ant number 4. Run number 48 and ant number 5. Run number 48 and ant number 6. Run number 48 and ant number 7. Run number 48 and ant number 8. Run number 48 and ant number 9. Run number 48 and ant number 10. [1] "Compiling results." -abilityShortForm # print the results of the final short form -## Algorithm: Ant Colony Optimization -## Total Run Time: 1.015 mins +## Model Test User Model: +## +## Test statistic 109.392 +## Degrees of freedom 104 +## P-value (Chi-square) 0.340 ## -## Function call: -## antcolony.lavaan(data = antData, ants = 10, evaporation = 0.9, antModel = -## antModel, list.items = list.items, full = 48, i.per.f = c(6, 6, 6, 6), factors -## = c("Trait1", "Trait2", "Trait3", "Trait4"), steps = 100, lavaan.model.specs -## = list(model.type = "cfa", auto.var = T, estimator = "default", ordered -## = NULL, int.ov.free = TRUE, int.lv.free = FALSE, auto.fix.first = TRUE, -## auto.fix.single = TRUE, std.lv = FALSE, auto.cov.lv.x = TRUE, auto.th = TRUE, -## auto.delta = TRUE, auto.cov.y = TRUE), max.run = 100, parallel = T) ## ## Final Model Syntax: ## -## Trait1 =~ Item9 + Item2 + Item10 + Item5 + Item11 + Item6 -## Trait2 =~ Item21 + Item14 + Item13 + Item22 + Item18 + Item17 -## Trait3 =~ Item29 + Item34 + Item25 + Item30 + Item33 + Item26 -## Trait4 =~ Item45 + Item46 + Item41 + Item38 + Item37 + Item42 -plot(abilityShortForm, type = 'pheromone') # the pheromone plot for class "antcolony" +## Ability =~ Item12 + Item54 + Item45 + Item37 + Item55 + Item39 + Item42 + Item26 +## + Item19 + Item50 + Item2 + Item44 + Item10 + Item15 + Item17 +## Outcome ~ Ability +plot(result_ACO) +## Warning: `aes_string()` was deprecated in ggplot2 3.0.0. +## ℹ Please use tidy evaluation idioms with `aes()`. +## ℹ See also `vignette("ggplot2-in-packages")` for more information. +## ℹ The deprecated feature was likely used in the ShortForm package. +## Please report the issue at +## . +## This warning is displayed once every 8 hours. +## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was +## generated. +## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0. +## ℹ Please use `linewidth` instead. +## ℹ The deprecated feature was likely used in the ShortForm package. +## Please report the issue at +## . +## This warning is displayed once every 8 hours. +## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was +## generated. +## $Pheromone ``` -![](README-ACO%20example-1.png) +![](README-quick-example-ACO-1.png) + + ## + ## $Gamma + +![](README-quick-example-ACO-2.png) -A similar example can be found in the `antcolony.mplus` function, but -requires you to have a valid Mplus installation on the computer. It took -a total of 1.06 mins to run this example. + ## + ## $Beta -### Tabu Search Algorithm +![](README-quick-example-ACO-3.png) -This example demonstrates how to use the Tabu search for model -specification searches when the original model may be misspecified in -some way. + ## + ## $Variance + +![](README-quick-example-ACO-4.png) ``` r -start.time.Tabu <- Sys.time() -library(ShortForm, quietly = T) -set.seed(2) -# create simulation data from the `psych` package -# two factors, 12 items total -# factor loading matrix - not quite simple structure -fxMatrix <- - matrix(data = c( - # first factor loadings - rep(x = c(.8, .8, .6, .6), times = 3), - # second factor loadings - rep(x = c(.2), times = 12) - ), - ncol = 2) -# factor correlation matrix - all factors uncorrelated -PhiMatrix <- - matrix(data = c(1,0, - 0,1 - ), ncol = 2) -tabuData <- - psych::sim( - fx = fxMatrix, - Phi = PhiMatrix, - n = 600, - raw = TRUE - )$observed # observed is the simulated observed data - -colnames(tabuData) = paste0("Item", 1:12) - -tabuModel <- ' -Trait1 =~ Item1 + Item2 + Item3 + Item4 + Item5 + Item6 + 0*Item7 + 0*Item8 + 0*Item9 + 0*Item10 + 0*Item11 + 0*Item12 -Trait2 =~ 0*Item1 + 0*Item2 + 0*Item3 + 0*Item4 + 0*Item5 + 0*Item6 + Item7 + Item8 + Item9 + Item10 + Item11 + Item12 -' -# fit the initial misspecified model for Tabu -init.model <- lavaan::lavaan(model = tabuModel, data = tabuData, - auto.var=TRUE, auto.fix.first=FALSE, std.lv=TRUE, - auto.cov.lv.x=FALSE) - -# use search.prep to prepare for the Tabu search -ptab <- - search.prep(fitted.model = init.model, - loadings=TRUE, - fcov=FALSE, - errors=FALSE) - -Tabu_example <- - suppressWarnings( - tabu.sem(init.model = init.model, - ptab = ptab, - obj = AIC, - niter = 20, - tabu.size = 10) - ) # the suppressWarning wrapping hides the lavaan WARNING output from improper models -## Running iteration 1 of 20. Running iteration 2 of 20. Running iteration 3 of 20. Running iteration 4 of 20. Running iteration 5 of 20. Running iteration 6 of 20. Running iteration 7 of 20. Running iteration 8 of 20. Running iteration 9 of 20. Running iteration 10 of 20. Running iteration 11 of 20. Running iteration 12 of 20. Running iteration 13 of 20. Running iteration 14 of 20. Running iteration 15 of 20. Running iteration 16 of 20. Running iteration 17 of 20. Running iteration 18 of 20. Running iteration 19 of 20. Running iteration 20 of 20. - -# check the final model -summary(Tabu_example) -## Algorithm: Tabu Search -## Total Run Time: 1.908 mins +set.seed(58310) +result_SA <- simulatedAnnealing( + initialModel = paste("Ability =~", paste0("Item", 1:56, collapse = " + ")), + originalData = simulated_test_data, + maxSteps = 20, + maxItems = 40, + items = paste0("Item", 1:56), + setChains = 4 +) +## Initializing short form creation. +## The initial short form is: +## Ability =~ Item10 + Item43 + Item35 + Item31 + Item42 + Item49 + Item48 + Item20 + Item32 + Item18 + Item36 + Item34 + Item45 + Item50 + Item3 + Item54 + Item2 + Item44 + Item24 + Item7 + Item22 + Item46 + Item53 + Item13 + Item39 + Item38 + Item51 + Item21 + Item15 + Item56 + Item8 + Item29 + Item40 + Item26 + Item23 + Item47 + Item1 + Item52 + Item27 + Item9 +## +## Using the short form randomNeighbor function. +## Finished initializing short form options. +## Current Progress: +## Chain number 1 complete. +## Chain number 2 complete. +## Chain number 3 complete. +## Chain number 4 complete. + +summary(result_SA) +## Algorithm: Simulated Annealing +## Total Run Time: 20.331 secs ## -## lavaan 0.6.17 ended normally after 32 iterations +## lavaan 0.6-20 ended normally after 34 iterations ## ## Estimator ML ## Optimization method NLMINB -## Number of model parameters 29 +## Number of model parameters 80 ## -## Number of observations 600 +## Number of observations 1000 ## ## Model Test User Model: ## -## Test statistic 42.131 -## Degrees of freedom 49 -## P-value (Chi-square) 0.746 +## Test statistic 762.752 +## Degrees of freedom 740 +## P-value (Chi-square) 0.273 ## ## ## Final Model Syntax: -## Trait1 =~ Item1 + Item2 + Item3 + Item4 + Item5 + Item6 + Item7 + Item8 + Item9 -## + Item10 + Item11 + Item12 -## Trait2 =~ Item1 + Item3 + Item5 + Item10 + Item11 - -# plot the change in the objective/criterion function over each run -plot(Tabu_example) +## Ability =~ Item33 + Item5 + Item19 + Item39 + Item42 + Item10 + Item38 + Item20 +## + Item46 + Item18 + Item36 + Item55 + Item31 + Item4 + Item35 + Item49 + +## Item40 + Item44 + Item28 + Item24 + Item22 + Item2 + Item32 + Item1 + Item16 + +## Item27 + Item51 + Item21 + Item13 + Item6 + Item8 + Item41 + Item43 + Item45 + +## Item23 + Item25 + Item7 + Item52 + Item11 + Item53 +plot(result_SA) ``` -![](README-Tabu%20example-1.png) - -It took a total of 1.92 mins to run this example. - -The next Tabu example demonstrates how to use it to find a short form of -a prespecified length with different data. +![](README-quick-example-SA-1.png) ``` r -start.time.Tabu <- Sys.time() -library(ShortForm, quietly = T) -# set the seed to reproduce this example -set.seed(3) -# create simulation data from the `psych` package -# four factors, 12 items each, 48 total items -# factor loading matrix - not quite simple structure -fxMatrix <- - matrix(data = c(rep(x = c(.8, .8, .4, .3), times = 3), - rep(0.2, times = 3*4*3), # first factor loadings - - rep(0.2, times = 3*4), - rep(x = c(.8, .8, .4, .3), times = 3), - rep(0.2, times = 3*4*2), # second factor loadings - - rep(0.2, times = 3*4*2), - rep(x = c(.8, .8, .4, .3), times = 3), - rep(0.2, times = 3*4), # third factor loadings - - rep(0.2, times = 3*4*3), - rep(x = c(.8, .8, .4, .3), times = 3) # fourth factor loadings - ), - ncol = 4) -# factor correlation matrix - all factors uncorrelated -PhiMatrix <- - matrix(data = c(1,0,0,0, - 0,1,0,0, - 0,0,1,0, - 0,0,0,1), ncol = 4) -tabuData <- - psych::sim( - fx = fxMatrix, - Phi = PhiMatrix, - n = 600, - mu = c(-2, -1, 1, 2), - raw = TRUE - )$observed # observed is the simulated observed data - -colnames(tabuData) = paste0("Item", 1:48) - -tabuModel <- ' -Trait1 =~ Item1 + Item2 + Item3 + Item4 + Item5 + Item6 + Item7 + Item8 + Item9 + Item10 + Item11 + Item12 -Trait2 =~ Item13 + Item14 + Item15 + Item16 + Item17 + Item18 + Item19 + Item20 + Item21 + Item22 + Item23 + Item24 -Trait3 =~ Item25 + Item26 + Item27 + Item28 + Item29 + Item30 + Item31 + Item32 + Item33 + Item34 + Item35 + Item36 -Trait4 =~ Item37 + Item38 + Item39 + Item40 + Item41 + Item42 + Item43 + Item44 + Item45 + Item46 + Item47 + Item48 -' - -# specify the criterion function that the Tabu Search minimizes -# wrap this in a tryCatch in case a model does not converge! -# specify an appropriate error value: since we're minimizing, error value must be large -tabuCriterion = function(x) { - tryCatch(lavaan::fitmeasures(object = x, fit.measures = 'chisq'), - error = function(e) Inf) -} - -# use the tabuShortForm function -# reduce form to the best 12 items, 3 per factor -tabuShort <- - tabuShortForm(initialModel = tabuModel, originalData = tabuData, - numItems = c(5,5,5,5), criterion = tabuCriterion, - niter = 20, tabu.size = 10, verbose = FALSE - ) -## Running iteration 1 of 20. Running iteration 2 of 20. Running iteration 3 of 20. Running iteration 4 of 20. Running iteration 5 of 20. Running iteration 6 of 20. Running iteration 7 of 20. Running iteration 8 of 20. Running iteration 9 of 20. Running iteration 10 of 20. Running iteration 11 of 20. Running iteration 12 of 20. Running iteration 13 of 20. Running iteration 14 of 20. Running iteration 15 of 20. Running iteration 16 of 20. Running iteration 17 of 20. Running iteration 18 of 20. Running iteration 19 of 20. Running iteration 20 of 20. - -# check the chosen model -summary(tabuShort) +set.seed(58310) +shortAntModel <- " +Ability =~ Item1 + Item2 + Item3 + Item4 + Item5 + Item6 + Item7 + Item8 +Ability ~ Outcome +" + +result_TS <- tabuShortForm( + initialModel = shortAntModel, + originalData = simulated_test_data, numItems = 7, + niter = 1, tabu.size = 3, parallel = FALSE +) +## Running iteration 1 of 1. +summary(result_TS) ## Algorithm: Tabu Search -## Total Run Time: 2.137 mins +## Total Run Time: 2.598 secs ## -## lavaan 0.6.17 ended normally after 32 iterations +## lavaan 0.6-20 ended normally after 29 iterations ## ## Estimator ML ## Optimization method NLMINB -## Number of model parameters 46 +## Number of model parameters 15 ## -## Number of observations 600 +## Number of observations 1000 ## ## Model Test User Model: ## -## Test statistic 129.734 -## Degrees of freedom 164 -## P-value (Chi-square) 0.978 +## Test statistic 18.858 +## Degrees of freedom 20 +## P-value (Chi-square) 0.531 ## ## ## Final Model Syntax: -## Trait1 =~ Item1 + Item2 + Item5 + Item6 + Item9 -## Trait2 =~ Item13 + Item14 + Item17 + Item18 + Item22 -## Trait3 =~ Item26 + Item29 + Item30 + Item33 + Item34 -## Trait4 =~ Item39 + Item43 + Item44 + Item47 + Item40 -# plot the changes in the objective function over each iteration -plot(tabuShort) +## Ability =~ Item1 + Item6 + Item3 + Item4 + Item5 + Item7 + Item8 +## Ability ~ Outcome ``` -![](README-Tabu%20short%20form-1.png) +## Workflow + +``` mermaid +flowchart LR + A@{ shape: lean-r, label: "Full Item Bank" } --> B[Specify Model] + B --> C[Run Optimization Algorithm(s)] + C --> D[Evaluate Candidate Forms] + D --> |One or More Forms Fit| E@{ shape: diamond, label: "Select Short Form" } + D --> |No Adequate Forms Found| C + E --> F@{ shape: lean-l, label: "Reporting & Visualization" }] + +``` -It took a total of 2.14 mins to run this example. +## Outputs -### Simulated Annealing +ShortForm produces diagnostic outputs such as: -This example demonstrates the use of simulated annealing for creating -short forms. +- Objective function convergence plots +- Algorithm-specific diagnostics +- Summary statistic s for selected item sets -``` r -start.time.SA <- Sys.time() -library(ShortForm, quietly = T) -# create simulation data from the `psych` package -# four factors, 12 items each, 48 total items -# factor loading matrix - not quite simple structure -set.seed(4) -fxMatrix <- - matrix(data = c(rep(x = c(.8, .8, .4, .3), times = 3), - rep(0.2, times = 3*4*3), # first factor loadings - - rep(0.2, times = 3*4), - rep(x = c(.8, .8, .4, .3), times = 3), - rep(0.2, times = 3*4*2), # second factor loadings - - rep(0.2, times = 3*4*2), - rep(x = c(.8, .8, .4, .3), times = 3), - rep(0.2, times = 3*4), # third factor loadings - - rep(0.2, times = 3*4*3), - rep(x = c(.8, .8, .4, .3), times = 3) # fourth factor loadings - ), - ncol = 4) -# factor correlation matrix - all factors uncorrelated -PhiMatrix <- - matrix(data = c(1,0,0,0, - 0,1,0,0, - 0,0,1,0, - 0,0,0,1), ncol = 4) -annealData <- - psych::sim( - fx = fxMatrix, - Phi = PhiMatrix, - n = 600, - mu = c(-2, -1, 1, 2), - raw = TRUE - )$observed # observed is the simulated observed data - -colnames(annealData) = paste0("Item", 1:48) - -annealModel <- ' -Trait1 =~ Item1 + Item2 + Item3 + Item4 + Item5 + Item6 + Item7 + Item8 + Item9 + Item10 + Item11 + Item12 -Trait2 =~ Item13 + Item14 + Item15 + Item16 + Item17 + Item18 + Item19 + Item20 + Item21 + Item22 + Item23 + Item24 -Trait3 =~ Item25 + Item26 + Item27 + Item28 + Item29 + Item30 + Item31 + Item32 + Item33 + Item34 + Item35 + Item36 -Trait4 =~ Item37 + Item38 + Item39 + Item40 + Item41 + Item42 + Item43 + Item44 + Item45 + Item46 + Item47 + Item48 -' - -lavaan.model.specs <- - list(model.type = "cfa", - auto.var = TRUE, estimator = "default", ordered = NULL, - int.ov.free = TRUE, int.lv.free = FALSE, std.lv = TRUE, auto.fix.first = FALSE, - auto.fix.single = TRUE, auto.cov.lv.x = TRUE, auto.th = TRUE, - auto.delta = TRUE, auto.cov.y = TRUE) - -# perform the SA algorithm -set.seed(1) -SA_example <- - simulatedAnnealing(initialModel = annealModel, originalData = annealData, maxSteps = 200, - fitStatistic = 'cfi', maximize = TRUE, - temperature = "logistic", items = paste0("Item", 1:48), - lavaan.model.specs = lavaan.model.specs, - maxChanges = 3, maxItems = c(6,6,6,6), setChains = 4) -## Initializing short form creation. -## The initial short form is: -## Trait1 =~ Item9 + Item4 + Item7 + Item1 + Item2 + Item5 -## Trait2 =~ Item19 + Item23 + Item14 + Item15 + Item13 + Item17 -## Trait3 =~ Item29 + Item34 + Item30 + Item31 + Item25 + Item33 -## Trait4 =~ Item41 + Item48 + Item45 + Item46 + Item42 + Item47 -## Using the short form randomNeighbor function. -## Finished initializing short form options. -## Current Progress: -## Chain number 1 complete. -## Chain number 2 complete. -## Chain number 3 complete. -## Chain number 4 complete. -summary(SA_example) -## Algorithm: Simulated Annealing -## Total Run Time: 41.456 secs -## -## lavaan 0.6.17 ended normally after 33 iterations -## -## Estimator ML -## Optimization method NLMINB -## Number of model parameters 54 -## -## Number of observations 600 -## -## Model Test User Model: -## -## Test statistic 367.147 -## Degrees of freedom 246 -## P-value (Chi-square) 0.000 -## -## -## Final Model Syntax: -## Trait1 =~ Item11 + Item2 + Item3 + Item6 + Item4 + Item9 -## Trait2 =~ Item17 + Item21 + Item13 + Item24 + Item16 + Item23 -## Trait3 =~ Item26 + Item35 + Item33 + Item34 + Item30 + Item25 -## Trait4 =~ Item43 + Item37 + Item42 + Item40 + Item38 + Item46 -plot(SA_example) # plot showing how the fit value changes at each step -``` +------------------------------------------------------------------------ + +## Algorithms + +### Ant Colony Optimization (ACO) + +Implementation adapted from [Leite, Huang, & Marcoulides +(2008)](https://doi.org/10.1080/00273170802285743). + +### Tabu Search (TS) + +Based on [Marcoulides & Falk +(2018)](https://doi.org/10.1080/10705511.2017.1409074), extended for +model search and short-form construction. + +### Simulated Annealing (SA) + +Provides one of the first implementations of simulated annealing for +psychometric model selection workflows. Implemented following +[Kirkpatrick et +al. (1983)](https://doi.org/10.1126/science.220.4598.671). + +------------------------------------------------------------------------ + +## Performance Notes + +Computational time depends on: + +- Number and types of items +- Dimensionality/model complexity +- Algorithm convergence settings + +Parallelization is supported for certain workflows. + +------------------------------------------------------------------------ + +## Reproducibility + +ShortForm is designed for reproducible analytical workflows: - Fully +scriptable - Compatible with R Markdown and Quarto - Supports +integration into larger modeling pipelines + +------------------------------------------------------------------------ + +## License + +LGPL (\>= 2.0, \< 3) \| Mozilla Public License + +------------------------------------------------------------------------ + +## Citation -![](README-Simulated%20Annealing%20example-1.png) +If you use this package, please cite: -It took a total of 42.09 secs to run the SA example, and a total of 5.82 -mins to run all four together. +Raborn A, Leite W (2024). *ShortForm: Automatic Short Form Creation*. +. ShortForm +, R package version +0.5.6, . From 223c217d057685186f4d7d5fa7f296ef2d6ae4cb Mon Sep 17 00:00:00 2001 From: Anthony Date: Tue, 28 Apr 2026 23:40:25 -0400 Subject: [PATCH 08/12] still need to call ggplot2 for aes --- R/ACO.R | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/R/ACO.R b/R/ACO.R index ebb4c44..b224198 100644 --- a/R/ACO.R +++ b/R/ACO.R @@ -92,7 +92,7 @@ setMethod('plot', pheromone_plot <- ggplot2::ggplot( pheromone_long, - aes( + ggplot2::aes( x = .data$run, y = .data$Pheromone, group = .data$Item, @@ -123,7 +123,7 @@ setMethod('plot', gamma_plot <- ggplot2::ggplot( summary_results, - aes(x = .data$run, y = .data$mean.gamma) + ggplot2::aes(x = .data$run, y = .data$mean.gamma) ) + ggplot2::geom_line() + ggplot2::ylab(expression("Mean " * gamma)) + @@ -148,7 +148,7 @@ setMethod('plot', beta_plot <- ggplot2::ggplot( summary_results, - aes(x = .data$run, y = .data$mean.beta) + ggplot2::aes(x = .data$run, y = .data$mean.beta) ) + ggplot2::geom_line() + ggplot2::ylab(expression("Mean " * beta)) + @@ -173,7 +173,7 @@ setMethod('plot', variance_plot <- ggplot2::ggplot( summary_results, - aes(x = .data$run, y = .data$mean.var.exp) + ggplot2::aes(x = .data$run, y = .data$mean.var.exp) ) + ggplot2::geom_line() + ggplot2::ylab(expression("Mean Variance Explained")) + From 01f7311e3757d4a9beaab19c88cab6b31ee3af66 Mon Sep 17 00:00:00 2001 From: Anthony Date: Tue, 28 Apr 2026 23:40:48 -0400 Subject: [PATCH 09/12] correcting workflow to build -> check --- .github/workflows/R-CMD-check.yaml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.github/workflows/R-CMD-check.yaml b/.github/workflows/R-CMD-check.yaml index 84b0f9a..15410fd 100644 --- a/.github/workflows/R-CMD-check.yaml +++ b/.github/workflows/R-CMD-check.yaml @@ -14,6 +14,8 @@ jobs: - uses: r-lib/actions/setup-r@v2 - uses: r-lib/actions/setup-r-dependencies@v2 + with: + extra-packages: any::rcmdcheck - - name: Check - run: R CMD check . \ No newline at end of file + - uses: r-lib/actions/check-r-package@v2 + \ No newline at end of file From 306a1bd0ca245b6160bd7eba6d152c4746112378 Mon Sep 17 00:00:00 2001 From: Anthony Date: Tue, 28 Apr 2026 23:43:56 -0400 Subject: [PATCH 10/12] adding tests for major OS --- .github/workflows/R-CMD-check.yaml | 34 ++++++++++++++++++++++++------ 1 file changed, 27 insertions(+), 7 deletions(-) diff --git a/.github/workflows/R-CMD-check.yaml b/.github/workflows/R-CMD-check.yaml index 15410fd..4cd4d78 100644 --- a/.github/workflows/R-CMD-check.yaml +++ b/.github/workflows/R-CMD-check.yaml @@ -6,16 +6,36 @@ on: jobs: R-CMD-check: - runs-on: ubuntu-latest + name: ${{ matrix.os }} / R ${{ matrix.r }} + runs-on: ${{ matrix.os }} + + strategy: + fail-fast: false + matrix: + os: [ubuntu-latest, macos-latest, windows-latest] + r: [release] steps: - - uses: actions/checkout@v3 + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Set up R + uses: r-lib/actions/setup-r@v2 + with: + r-version: ${{ matrix.r }} + use-public-rspm: true - - uses: r-lib/actions/setup-r@v2 + - name: Set up pandoc + uses: r-lib/actions/setup-pandoc@v2 - - uses: r-lib/actions/setup-r-dependencies@v2 + - name: Install system dependencies + uses: r-lib/actions/setup-r-dependencies@v2 with: - extra-packages: any::rcmdcheck + extra-packages: | + any::rcmdcheck + needs: check - - uses: r-lib/actions/check-r-package@v2 - \ No newline at end of file + - name: Check package + uses: r-lib/actions/check-r-package@v2 + with: + upload-snapshots: true From b6b55d3f48f79e224ac321c9c3dc51d2282864d5 Mon Sep 17 00:00:00 2001 From: Anthony Date: Tue, 28 Apr 2026 23:59:43 -0400 Subject: [PATCH 11/12] fixing mermaid diagram typo --- README-quick-example-ACO-1.png | Bin 13802 -> 11115 bytes README-quick-example-ACO-2.png | Bin 7878 -> 7787 bytes README-quick-example-ACO-3.png | Bin 8003 -> 7624 bytes README-quick-example-ACO-4.png | Bin 8095 -> 8180 bytes README-quick-example-SA-1.png | Bin 9389 -> 8948 bytes README.Rmd | 6 ++-- README.md | 56 ++++++++++++++------------------- 7 files changed, 27 insertions(+), 35 deletions(-) diff --git a/README-quick-example-ACO-1.png b/README-quick-example-ACO-1.png index fd88367c29cd66d09f2700d9c4695ce4d4b7eb3c..21e35f55a1e6a900396d6ead8bcdc958f3a0f496 100644 GIT binary patch literal 11115 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 literal 13802 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 XOP#CCX;kd~M`JT%OQUiF5AZ(#UjGr` literal 7878 zcmcIodpuNMwBKjOcukb@D1{#0dHgU@qc}w6Jv1oKo?{St3?gxUB1I(6kR0-u2nj2qBF%~f~+}47a7o1o!h{eXEfmj+=t}uvYVZT@wR`$mB zatgdH3b@2E1u+%{FA54id?@(9VbK7KMrOrgf7%L`g<)B}y{ujii^F*lWATE+>5V1# zvS_`m*j}s?%9me&-@73-wEN-b;hF1R7L>wW7t4kvW&yL5aU;6H{W4+q^pU-yK#`)Raj z(^me;L#Ns|AgDG(dExoLz0tyKSC{@H*Ssz+EiyQLQhv)F(bJvKg|D`~gflMdt8K}r zoqA<5_wkPOem#^sn-RIKA98502*QIt2JfxWvk_uFJ?|rG@Qg9{$LbG=aQ!yx0iBR5 z0ZT)9wIR_4PQN$KvlI ziTyuP6V=ZzrdR4&YJ@v(s+^g2pAQN$NL*s9Qa1ZTME|?Kv5fxlistVs-J7buA28a6 zBT4_6B*`{c5;eq>Irin2`IM{i;nF0!?nAevFa7_3CSlp{ML`uG?QvyEN0ih#$$MpH zzgeAwJ%#%Mva>{>z~&R_0h$^navq$@n-K;$&PPs{B!?a76j-UBja!OIe78J@JYBt*~ zZP`oif98gCNs+(bl$)#5X*Iw1NSdz)!Lb>dGA3QE*Gn6UT`1p@S4o=A)}22^yi*vm zbhIxYls(ZnY<*LXFJN^BuIeK@rJkCc@$K{YRig5xtEWj@;g&Seq#&15wcHp|yA;{k zl^I7g9kY2!Tl(rJS27jQxma5meZH}D&bNMYe3N|tvpl3|7h_1HUCzhfZL5?|R~u=^ zR(MRxW2;G@{Pvx%uNmR!`^+BvLk$Q{T_sZ6ko!tMsZbQMSUBIxCDmnoD9QRh*Kvj^ zG;$NDE<7=^=aUJ!sC>6qqNc}ZY1}7dw>E)v`(Czs&Z%+RRf%AQPzTp@qu%3<>*GLw zg$`bZIWl>7UqGhb27{tbub{d1_Nl-ewa0oY=F>A)wX{xOd0W_6Mm=y2$IjntFTK5L zVK^^YH&YwEgDYEL#l z+160%wIMz6;@(GZOfnuGkUY?O@yC+$0+m)cSsK2OF-DxW*Oyy;@c6C%;R5rZ4Sm^B z!v&)u8EXzZGOeVlz8`9xFTd{Kx_8>)4vs`F{zv=qK*R~56GJ5ffkPSH!$vudZEn_W z!!ZqrxW)3q9m@fBdi?`6e_Zf34<{tjE&TOb%CePSTUFEBXO;8yJ>ZYxrEAw+Pv*It zxGH}zd1>~@SlWY!n&_L&uV1)|-z6)4D7p1Hc|aRIj!*E9vIrq1caC?O{a`IO$+U$Z zJUo*${@r@|LE2_S~IiHM=g|Me|cjmp66BM%_@ z^$U*EG-g;|^%}vtLLwlbF4cenM$7+4l?hb^?R>q*tinE`ovt^Ky04RTFNzYdPOxq- zOo*>&PY)3MXdI&grvDDhidu^{)+@9Q_FsMF@+M>}aMmL?SmG&G=89E{P}TXuFbzdb)&$osa-4@%k8%)<>BR7-jZC3>0#=V#lQ3A#iyG?MvtK=1T z27=XR3+zG%oH|QGWwNRu^JT>TYmH^Ys5Mmxo{$_a8bEB79o7l1o4z+ZCN;H^5&A!0A;y;*s*`y_xpQT-1HTqlMK?NRO;2SH$h29*FnCx{I;SB{9oM8_DXO zVh)rt)HDAXyE9bt6U{0!%71jNjiRRt9e7;F4A~)UrC%K~Wx*K#WH(9~e zuKG8)v%4WTs#wS3kyDQd9h5Dm+*oR4fetN+G5LFw&n}zs;p*H~VKD{kF)r<8Tv-ns zK%m#3yQ4P974Ql0l9rNGc;)LN#qL_&?Z2Ko<9M9I)4z714e#wP?!_cMc>pFFMevZ~ zmL;bGzn3o4xNV2v(!Tq^t9Bz-0!enZ$oN2;5ONWA^y$Vi=1)JkkmOw~oVS$m(ry3i z!(g=E=m#s-6TUF%E<|bmu;f>zmGL+7`1U@DT@OIVqpMS&RuP5REFK27EcLF6&szRH zGx#I^?oJ9nQl(=ZOf0nzob*(|^~8k=qfvZrt&=xK+U#3y*Ef9{d=irFyu|0ksud9M z%^%Rc^*m#k`tZ!MB+(T=ZfYn%=}*f;nr8z-YAbccI_$PosFk77aoyb;-)lE93FB`O zR`$`Z(C3agc9uyr7?C$m1v|oN#}RG$W7@pwR+Tf!+@q0a8$WZy4pSW=JpG_@VCmfQ zF>&>z6qh?uZ44MdgDoi>ZM zcP!_@IGzHOrn}b{asX)^@QRg0QybG7l09&N|Gb)R5BfU!EN?T?WZWrwN95v8kff9SZB_}+0fi==VXJC}&>qBFS3I6^w$2Pyc zkocv!XhNKk1TLr@X=<_M>T+nur@)u?LpFtG`4XOxauvhi?yJR-mLSef_Z@_^LEKfY z2UVw1PdiQ~QvfxI-{3#K ziQSlfes(gx-QS;eoCYyhtEJ(~3Ot&C?c;(sp)SEw`6I3KCFjL!r*#<Ns&gXamz$bg`-FH?qgI(5x zCNX8yS$@xkPQJ2vanQ5>C{9_mp}c!%AY2syOMMf7`OaD6s7~}lBfN-qKOSDZvJ=hC z@fM+6S{24m=M)>QjqB3Uve3KlK4Wb;?|k`(_+w(eav92U{vhXmA7s0+N88RPo0OO8 zs7X>76MG+yKprIiQ&dOA2ff!kq>zt-BJ9hd9T|^rz5#F!4wZAqdrYe2nG|Lo_@Z?y z8)8%6gN}C>v*dT-I!4r-A@)(HRbadGKodzDw)M!IUR!uW4U8AILirRSKy?MA z#0f3w99dB{c1mPQ_f8CF2wZ40~VsZsJq}E zWlSC%n(78Iseoj?8IgAf6rv!J{Ug2Dkjw((2j6nnO{ebNiJbuHS%cLC;2|99WXJww z{vw8mN9{EhMV41=;9vLbYAqv9!5|6gOOuuoL|u|j`!Rd&P$TR9$jT_w=*NP9f#Ve zO5ZYW+#mX~vvl~(IZ6Nd_^Wgy{dZ?)HS|JGevb-ka^JP|B~!r$H+4*hkMX!=aj~vq ze~z7~Dt#6eR%K>J(TI{hS54O1>j@K3!1zO=NkcK?k(K=7pdwIxsfz!Ka`<2&XP^i=#Xys&d4MAy^>)_ypJADRo=a(P%=`wJncPEM6%O09m3#pC77>hp z&9d?9k$+$WF;l<@kO!oB2!@zN7|91>F37Y8L6PyPWha{*mGP3}h7?JmexRR`m!DGnbV&r?m_0u{;$!xlsOXx+PZ zO|+qo7gO&!pa*!Lkf2Q4;L*!!PoVsa)*=sWb)V>(DLzJQ^1?MyX;iIN;_hO&xn1>> zK?&^$&LIWQSJF3_6{ujb(@kxDhg}+4M}>O*oEc&+#2y`Wi@1ca{t$GlV@d^q>2ejq z%&mleeLS~7-KOLN*)F!f`0-hh$?<`J>Zfsk9lhm(vo^PJJyRJ_=W55BNBoJ1WEIJ8 z!pF6L>Bpi>f~1W;$C^ zat}D@<~jGvpCn-R!0}L3i=ROrR4V9ThbyDw-PC4}q>95P8|*zAFNBIamz4#;>i+Ay zFGL>9v4%Y6(pF(qClG9B@st}9rr0f1IPZl#dfKN5)FyvfX-!sv4{HxmaUC`fmQ{nAcqg z>#~`6k3U<26Z4lM4jqT62OmTE>!XxW?KvJaSM5(+PpWI@p_?6bq;kJ$JaxzFI}qdf ztJ{-n60}jj709GX+cf7xI?pb35chz0x*H*8Ati<0du_gi}dbxAFM`;+~2=jX^d>_0f%zs6C%bylZjqLmujUYxDzt z414ksA=>R*V2JovUbgRv4{JVU)pfZ>v92qaU>d)W@g3DL6<`~TTsweabB?ZR&<#Af z?;?)6u~-w`+q&Tf#@6h+?5EMc3N%J2$Uc>G8)BNT$dbLCQXMHn5~C)7eB`~7(Hbco zwMl*5E>x>$JsKH7uH((q+Ilr+qr__!m#F3!La1iwDTur?U4%Pm*aKnmX4JAFZ8OHk za6U~IkZqD>$PTUm%a>Lk3k=ddz+okWqz_dl~6r5PAo%KO8o2&ItCRnhZ?g?Lm=57I$4Chc#CU?%f%Kd{T z^S?pr1kt@Ap~XX5SImdDDmt~g8$@q|iKC@vBZ&AgP&7$i1H76xf}C+fUdnd>m@R79 zE)h7sb~lP0|4rM&1<^f|tKo}&0)QQJ52CdF>efSF1_0BJaDMdS18(<<#1b56{GSaV z=d&T81QS5cs3D&1l7SLXz2EZy6i_y7{}IAQ>c{8Dm2lT_F?a95)Zsywo$1(R{3o{+ zQ%p#)2j+QxzjpsCsqlLyL9yzlxt{*ZW?_CNUXN>8Q{=4tFqTc2KOw35C0&#cFxBNn zofEjbwTSsy)i3%f@*8I#$Yc5*Gi)^$VAowLrO%IC@hQ5!N8cP+IIve&US1^2>MiW@ zQ-T6Z((vTB635x}Gqa_4K9d|)QV`s{LYK0a!NFtOz-TmqU{6{<^OUCV(;Z)4qc{P)lrS z|4Y@CR7z9}qG>o}p(x6|JUr#PLap;|-UMr9AHz(*rUFqlK*FKH)pJC}ZMOYk*oFQo zP;}Y~Bq0n~Lr8GD!cDUf5J8Aic^cv-XQGOc$fY$a^b|E9D6!?I*+tp1x?v4z6h$t- z(-4X!En3uqaj73K|73upRK6l~EbQMhahRf*n5;@q+F&Sz%cS5=87zLx;W7fLL}cOf z;5IbCg+EazlY&igI1#AwVBRvZhP`$BFYa%*Qdi`h7tfrO7j1Y2sSbtx9OC1zo`*ll z>1tfX6K>!gn)$g3T9PgL!rCx`^pnn5**O7PLmU#ciU7P>5YeE^e#ZLf~y+C5wxZ4kgyDqlFQtjUve$;KTvNiP2~H3d&qa-ZMvYX(;gBe)9|YxAxQ zU11@OreD=bSNJ)xKc|l$ODPAwKfE%9tx!);+zN0jTKEzhi&T9|nw@lTg`X_sWg>$- z&8e$<9kDTWRnIj6uJb%6&J_FPq3{`Fkz*x zC~hdpe#(bDHLk0h583;Sw6x-8`yghj)QSLS;B^X^$L~mP0{J8RxMnw$V!tx&y!N{z zZ&}T(`e~|*aN@tr`Je9i%g6q^WBC8~l9jw;;7t@oarzKYB#2<40b2nD z+`vJh;LzCa-(N{36gy;CmvM8qy$s7hk2C(7DQ*06+_>vnkaPwY_{8j(@6PCt6*}pO z!45xHfHl7{N%G8^@@K$c~>i?u&tte)=?)D5c%3dEJKt< z5OhAXifTAu;ij4-f)6Y)%d)eNSfm;rezW|UDcyJl%4z+qBJ*Xxk>S-7kDgqCb%NMXB2H4u$7km@h=>R?*P_WXdeL+G$ud8@ zBQ(mG4LB69OqklutI5Y0UT`N}_}ZCUDt--&APw>+7pw)?r}%8vVl1-=kKPP4(Oc{E z2`HIM^J%bUyDE0+T8DLhT0gZ@`YevJmpfYVCGY)MG9}W#0$>*^j89Su?X#V^((&4P h>}o9de@xDgaUeF+>kQ$h)@Fb`CdQUVMTSR0{{zWx2Z{gy diff --git a/README-quick-example-ACO-3.png b/README-quick-example-ACO-3.png index 699a138f13fdb7b28705233905b7f7749ea19aa7..464a15a9f50b350ec6f0af717b3bf082e9eeaf6d 100644 GIT binary patch literal 7624 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 Qj4!fgCRWCkhJV8U3!D>2HUIzs literal 8003 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 diff --git a/README-quick-example-ACO-4.png b/README-quick-example-ACO-4.png index 91c6df643b631ca6c597918e58ebbb2353827bb6..0a64d876286f2d6358584ee1aaa66c7b8cbdc868 100644 GIT binary patch literal 8180 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 literal 8095 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 delta 8808 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 diff --git a/README.Rmd b/README.Rmd index 49063af..7f9d026 100644 --- a/README.Rmd +++ b/README.Rmd @@ -4,7 +4,7 @@ output: html_preview: TRUE --- -```{r, echo = FALSE} +```{r setup, echo = FALSE} knitr::opts_chunk$set( collapse = TRUE, comment = "## ", @@ -133,7 +133,7 @@ summary(result_TS) ```{mermaid} flowchart LR A@{ shape: lean-r, label: "Full Item Bank" } --> B[Specify Model] - B --> C[Run Optimization Algorithm(s)] + B --> C[Run Optimization Algorithm] C --> D[Evaluate Candidate Forms] D --> |One or More Forms Fit| E@{ shape: diamond, label: "Select Short Form" } D --> |No Adequate Forms Found| C @@ -147,7 +147,7 @@ ShortForm produces diagnostic outputs such as: - Objective function convergence plots - Algorithm-specific diagnostics -- Summary statistic s for selected item sets +- Summary statistics for selected item sets ------------------------------------------------------------------------ diff --git a/README.md b/README.md index fb89d51..b50d582 100644 --- a/README.md +++ b/README.md @@ -92,13 +92,13 @@ result_ACO <- antcolony.lavaan( feedbackfile = NULL, max.run = 200 ) -## Run number 1 and ant number 1. Run number 1 and ant number 2. Run number 1 and ant number 3. Run number 1 and ant number 4. Run number 1 and ant number 5. Run number 1 and ant number 6. Run number 1 and ant number 7. Run number 1 and ant number 8. Run number 1 and ant number 9. Run number 1 and ant number 10. Run number 1 and ant number 11. Run number 1 and ant number 12. Run number 1 and ant number 13. Run number 1 and ant number 14. Run number 1 and ant number 15. Run number 1 and ant number 16. Run number 1 and ant number 17. Run number 1 and ant number 18. Run number 1 and ant number 19. Run number 1 and ant number 20. Run number 2 and ant number 1. Run number 2 and ant number 2. Run number 2 and ant number 3. Run number 2 and ant number 4. Run number 2 and ant number 5. Run number 2 and ant number 6. Run number 2 and ant number 7. Run number 2 and ant number 8. Run number 2 and ant number 9. Run number 2 and ant number 10. Run number 2 and ant number 11. Run number 2 and ant number 12. Run number 2 and ant number 13. Run number 2 and ant number 14. Run number 2 and ant number 15. Run number 2 and ant number 16. Run number 2 and ant number 17. Run number 2 and ant number 18. Run number 2 and ant number 19. Run number 2 and ant number 20. Run number 3 and ant number 1. Run number 3 and ant number 2. Run number 3 and ant number 3. Run number 3 and ant number 4. Run number 3 and ant number 5. Run number 3 and ant number 6. Run number 3 and ant number 7. Run number 3 and ant number 8. Run number 3 and ant number 9. Run number 3 and ant number 10. Run number 3 and ant number 11. Run number 3 and ant number 12. Run number 3 and ant number 13. Run number 3 and ant number 14. Run number 3 and ant number 15. Run number 3 and ant number 16. Run number 3 and ant number 17. Run number 3 and ant number 18. Run number 3 and ant number 19. Run number 3 and ant number 20. Run number 4 and ant number 1. Run number 4 and ant number 2. Run number 4 and ant number 3. Run number 4 and ant number 4. Run number 4 and ant number 5. Run number 4 and ant number 6. Run number 4 and ant number 7. Run number 4 and ant number 8. Run number 4 and ant number 9. Run number 4 and ant number 10. Run number 4 and ant number 11. Run number 4 and ant number 12. Run number 4 and ant number 13. Run number 4 and ant number 14. Run number 4 and ant number 15. Run number 4 and ant number 16. Run number 4 and ant number 17. Run number 4 and ant number 18. Run number 4 and ant number 19. Run number 4 and ant number 20. Run number 5 and ant number 1. Run number 5 and ant number 2. Run number 5 and ant number 3. Run number 5 and ant number 4. Run number 5 and ant number 5. Run number 5 and ant number 6. Run number 5 and ant number 7. Run number 5 and ant number 8. Run number 5 and ant number 9. Run number 5 and ant number 10. Run number 5 and ant number 11. Run number 5 and ant number 12. Run number 5 and ant number 13. Run number 5 and ant number 14. Run number 5 and ant number 15. Run number 5 and ant number 16. Run number 5 and ant number 17. Run number 5 and ant number 18. Run number 5 and ant number 19. Run number 5 and ant number 20. Run number 6 and ant number 1. Run number 6 and ant number 2. Run number 6 and ant number 3. Run number 6 and ant number 4. Run number 6 and ant number 5. Run number 6 and ant number 6. Run number 6 and ant number 7. Run number 6 and ant number 8. Run number 6 and ant number 9. Run number 6 and ant number 10. Run number 6 and ant number 11. Run number 6 and ant number 12. Run number 6 and ant number 13. Run number 6 and ant number 14. Run number 6 and ant number 15. Run number 6 and ant number 16. Run number 6 and ant number 17. Run number 6 and ant number 18. Run number 6 and ant number 19. Run number 6 and ant number 20. Run number 7 and ant number 1. Run number 7 and ant number 2. Run number 7 and ant number 3. Run number 7 and ant number 4. Run number 7 and ant number 5. Run number 7 and ant number 6. Run number 7 and ant number 7. Run number 7 and ant number 8. Run number 7 and ant number 9. Run number 7 and ant number 10. Run number 7 and ant number 11. Run number 7 and ant number 12. Run number 7 and ant number 13. Run number 7 and ant number 14. Run number 7 and ant number 15. Run number 7 and ant number 16. Run number 7 and ant number 17. Run number 7 and ant number 18. Run number 7 and ant number 19. Run number 7 and ant number 20. Run number 8 and ant number 1. Run number 8 and ant number 2. Run number 8 and ant number 3. Run number 8 and ant number 4. Run number 8 and ant number 5. Run number 8 and ant number 6. Run number 8 and ant number 7. Run number 8 and ant number 8. Run number 8 and ant number 9. Run number 8 and ant number 10. Run number 8 and ant number 11. Run number 8 and ant number 12. Run number 8 and ant number 13. Run number 8 and ant number 14. Run number 8 and ant number 15. Run number 8 and ant number 16. Run number 8 and ant number 17. Run number 8 and ant number 18. Run number 8 and ant number 19. Run number 8 and ant number 20. Run number 9 and ant number 1. Run number 9 and ant number 2. Run number 9 and ant number 3. Run number 9 and ant number 4. Run number 9 and ant number 5. Run number 9 and ant number 6. Run number 9 and ant number 7. Run number 9 and ant number 8. Run number 9 and ant number 9. Run number 9 and ant number 10. Run number 9 and ant number 11. Run number 9 and ant number 12. Run number 9 and ant number 13. Run number 9 and ant number 14. Run number 9 and ant number 15. Run number 9 and ant number 16. Run number 9 and ant number 17. Run number 9 and ant number 18. Run number 9 and ant number 19. Run number 9 and ant number 20. Run number 10 and ant number 1. Run number 10 and ant number 2. Run number 10 and ant number 3. Run number 10 and ant number 4. Run number 10 and ant number 5. Run number 10 and ant number 6. Run number 10 and ant number 7. Run number 10 and ant number 8. Run number 10 and ant number 9. Run number 10 and ant number 10. Run number 10 and ant number 11. Run number 10 and ant number 12. Run number 10 and ant number 13. Run number 10 and ant number 14. Run number 10 and ant number 15. Run number 10 and ant number 16. Run number 10 and ant number 17. Run number 10 and ant number 18. Run number 10 and ant number 19. Run number 10 and ant number 20. Run number 11 and ant number 1. Run number 11 and ant number 2. Run number 11 and ant number 3. Run number 11 and ant number 4. Run number 11 and ant number 5. Run number 11 and ant number 6. Run number 11 and ant number 7. Run number 11 and ant number 8. Run number 11 and ant number 9. Run number 11 and ant number 10. Run number 11 and ant number 11. Run number 11 and ant number 12. Run number 11 and ant number 13. Run number 11 and ant number 14. Run number 11 and ant number 15. Run number 11 and ant number 16. Run number 11 and ant number 17. Run number 11 and ant number 18. Run number 11 and ant number 19. Run number 11 and ant number 20. Run number 12 and ant number 1. Run number 12 and ant number 2. Run number 12 and ant number 3. Run number 12 and ant number 4. Run number 12 and ant number 5. Run number 12 and ant number 6. Run number 12 and ant number 7. Run number 12 and ant number 8. Run number 12 and ant number 9. Run number 12 and ant number 10. Run number 12 and ant number 11. Run number 12 and ant number 12. Run number 12 and ant number 13. Run number 12 and ant number 14. Run number 12 and ant number 15. Run number 12 and ant number 16. Run number 12 and ant number 17. Run number 12 and ant number 18. Run number 12 and ant number 19. Run number 12 and ant number 20. Run number 13 and ant number 1. Run number 13 and ant number 2. Run number 13 and ant number 3. Run number 13 and ant number 4. Run number 13 and ant number 5. Run number 13 and ant number 6. Run number 13 and ant number 7. Run number 13 and ant number 8. Run number 13 and ant number 9. Run number 13 and ant number 10. Run number 13 and ant number 11. Run number 13 and ant number 12. Run number 13 and ant number 13. Run number 13 and ant number 14. Run number 13 and ant number 15. Run number 13 and ant number 16. Run number 13 and ant number 17. Run number 13 and ant number 18. Run number 13 and ant number 19. Run number 13 and ant number 20. Run number 14 and ant number 1. Run number 14 and ant number 2. Run number 14 and ant number 3. Run number 14 and ant number 4. Run number 14 and ant number 5. Run number 14 and ant number 6. Run number 14 and ant number 7. Run number 14 and ant number 8. Run number 14 and ant number 9. Run number 14 and ant number 10. Run number 14 and ant number 11. Run number 14 and ant number 12. Run number 14 and ant number 13. Run number 14 and ant number 14. Run number 14 and ant number 15. Run number 14 and ant number 16. Run number 14 and ant number 17. Run number 14 and ant number 18. Run number 14 and ant number 19. Run number 14 and ant number 20. Run number 15 and ant number 1. Run number 15 and ant number 2. Run number 15 and ant number 3. Run number 15 and ant number 4. Run number 15 and ant number 5. Run number 15 and ant number 6. Run number 15 and ant number 7. Run number 15 and ant number 8. Run number 15 and ant number 9. Run number 15 and ant number 10. Run number 15 and ant number 11. Run number 15 and ant number 12. Run number 15 and ant number 13. Run number 15 and ant number 14. Run number 15 and ant number 15. Run number 15 and ant number 16. Run number 15 and ant number 17. Run number 15 and ant number 18. Run number 15 and ant number 19. Run number 15 and ant number 20. Run number 16 and ant number 1. Run number 16 and ant number 2. Run number 16 and ant number 3. Run number 16 and ant number 4. Run number 16 and ant number 5. Run number 16 and ant number 6. Run number 16 and ant number 7. Run number 16 and ant number 8. Run number 16 and ant number 9. Run number 16 and ant number 10. Run number 16 and ant number 11. Run number 16 and ant number 12. Run number 16 and ant number 13. Run number 16 and ant number 14. Run number 16 and ant number 15. Run number 16 and ant number 16. Run number 16 and ant number 17. Run number 16 and ant number 18. Run number 16 and ant number 19. Run number 16 and ant number 20. Run number 17 and ant number 1. Run number 17 and ant number 2. Run number 17 and ant number 3. Run number 17 and ant number 4. Run number 17 and ant number 5. Run number 17 and ant number 6. Run number 17 and ant number 7. Run number 17 and ant number 8. Run number 17 and ant number 9. Run number 17 and ant number 10. Run number 17 and ant number 11. Run number 17 and ant number 12. Run number 17 and ant number 13. Run number 17 and ant number 14. Run number 17 and ant number 15. Run number 17 and ant number 16. Run number 17 and ant number 17. Run number 17 and ant number 18. Run number 17 and ant number 19. Run number 17 and ant number 20. Run number 18 and ant number 1. Run number 18 and ant number 2. Run number 18 and ant number 3. Run number 18 and ant number 4. Run number 18 and ant number 5. Run number 18 and ant number 6. Run number 18 and ant number 7. Run number 18 and ant number 8. Run number 18 and ant number 9. Run number 18 and ant number 10. Run number 18 and ant number 11. Run number 18 and ant number 12. Run number 18 and ant number 13. Run number 18 and ant number 14. Run number 18 and ant number 15. Run number 18 and ant number 16. Run number 18 and ant number 17. Run number 18 and ant number 18. Run number 18 and ant number 19. Run number 18 and ant number 20. Run number 19 and ant number 1. Run number 19 and ant number 2. Run number 19 and ant number 3. Run number 19 and ant number 4. Run number 19 and ant number 5. Run number 19 and ant number 6. Run number 19 and ant number 7. Run number 19 and ant number 8. Run number 19 and ant number 9. Run number 19 and ant number 10. Run number 19 and ant number 11. Run number 19 and ant number 12. Run number 19 and ant number 13. Run number 19 and ant number 14. Run number 19 and ant number 15. Run number 19 and ant number 16. Run number 19 and ant number 17. Run number 19 and ant number 18. Run number 19 and ant number 19. Run number 19 and ant number 20. Run number 20 and ant number 1. Run number 20 and ant number 2. Run number 20 and ant number 3. Run number 20 and ant number 4. Run number 20 and ant number 5. Run number 20 and ant number 6. Run number 20 and ant number 7. Run number 20 and ant number 8. Run number 20 and ant number 9. Run number 20 and ant number 10. Run number 20 and ant number 11. Run number 20 and ant number 12. Run number 20 and ant number 13. Run number 20 and ant number 14. Run number 20 and ant number 15. Run number 20 and ant number 16. Run number 20 and ant number 17. Run number 20 and ant number 18. Run number 20 and ant number 19. Run number 20 and ant number 20. Run number 21 and ant number 1. Run number 21 and ant number 2. Run number 21 and ant number 3. Run number 21 and ant number 4. Run number 21 and ant number 5. Run number 21 and ant number 6. Run number 21 and ant number 7. Run number 21 and ant number 8. Run number 21 and ant number 9. Run number 21 and ant number 10. Run number 21 and ant number 11. Run number 21 and ant number 12. Run number 21 and ant number 13. Run number 21 and ant number 14. Run number 21 and ant number 15. Run number 21 and ant number 16. Run number 21 and ant number 17. Run number 21 and ant number 18. Run number 21 and ant number 19. Run number 21 and ant number 20. Run number 22 and ant number 1. Run number 22 and ant number 2. Run number 22 and ant number 3. Run number 22 and ant number 4. Run number 22 and ant number 5. Run number 22 and ant number 6. Run number 22 and ant number 7. Run number 22 and ant number 8. Run number 22 and ant number 9. Run number 22 and ant number 10. Run number 22 and ant number 11. Run number 22 and ant number 12. Run number 22 and ant number 13. Run number 22 and ant number 14. Run number 22 and ant number 15. Run number 22 and ant number 16. Run number 22 and ant number 17. Run number 22 and ant number 18. Run number 22 and ant number 19. Run number 22 and ant number 20. Run number 23 and ant number 1. Run number 23 and ant number 2. Run number 23 and ant number 3. Run number 23 and ant number 4. Run number 23 and ant number 5. Run number 23 and ant number 6. Run number 23 and ant number 7. Run number 23 and ant number 8. Run number 23 and ant number 9. Run number 23 and ant number 10. Run number 23 and ant number 11. Run number 23 and ant number 12. Run number 23 and ant number 13. Run number 23 and ant number 14. Run number 23 and ant number 15. Run number 23 and ant number 16. Run number 23 and ant number 17. Run number 23 and ant number 18. Run number 23 and ant number 19. Run number 23 and ant number 20. Run number 24 and ant number 1. Run number 24 and ant number 2. Run number 24 and ant number 3. Run number 24 and ant number 4. Run number 24 and ant number 5. Run number 24 and ant number 6. Run number 24 and ant number 7. Run number 24 and ant number 8. Run number 24 and ant number 9. Run number 24 and ant number 10. Run number 24 and ant number 11. Run number 24 and ant number 12. Run number 24 and ant number 13. Run number 24 and ant number 14. Run number 24 and ant number 15. Run number 24 and ant number 16. Run number 24 and ant number 17. Run number 24 and ant number 18. Run number 24 and ant number 19. Run number 24 and ant number 20. Run number 25 and ant number 1. Run number 25 and ant number 2. Run number 25 and ant number 3. Run number 25 and ant number 4. Run number 25 and ant number 5. Run number 25 and ant number 6. Run number 25 and ant number 7. Run number 25 and ant number 8. Run number 25 and ant number 9. Run number 25 and ant number 10. Run number 25 and ant number 11. Run number 25 and ant number 12. Run number 25 and ant number 13. Run number 25 and ant number 14. Run number 25 and ant number 15. Run number 25 and ant number 16. Run number 25 and ant number 17. Run number 25 and ant number 18. Run number 25 and ant number 19. Run number 25 and ant number 20. Run number 26 and ant number 1. Run number 26 and ant number 2. Run number 26 and ant number 3. Run number 26 and ant number 4. Run number 26 and ant number 5. Run number 26 and ant number 6. Run number 26 and ant number 7. Run number 26 and ant number 8. Run number 26 and ant number 9. Run number 26 and ant number 10. Run number 26 and ant number 11. Run number 26 and ant number 12. Run number 26 and ant number 13. Run number 26 and ant number 14. Run number 26 and ant number 15. Run number 26 and ant number 16. Run number 26 and ant number 17. Run number 26 and ant number 18. Run number 26 and ant number 19. Run number 26 and ant number 20. Run number 27 and ant number 1. Run number 27 and ant number 2. Run number 27 and ant number 3. Run number 27 and ant number 4. Run number 27 and ant number 5. Run number 27 and ant number 6. Run number 27 and ant number 7. Run number 27 and ant number 8. Run number 27 and ant number 9. Run number 27 and ant number 10. Run number 27 and ant number 11. Run number 27 and ant number 12. Run number 27 and ant number 13. Run number 27 and ant number 14. Run number 27 and ant number 15. Run number 27 and ant number 16. Run number 27 and ant number 17. Run number 27 and ant number 18. Run number 27 and ant number 19. Run number 27 and ant number 20. Run number 28 and ant number 1. Run number 28 and ant number 2. Run number 28 and ant number 3. Run number 28 and ant number 4. Run number 28 and ant number 5. Run number 28 and ant number 6. Run number 28 and ant number 7. Run number 28 and ant number 8. Run number 28 and ant number 9. Run number 28 and ant number 10. Run number 28 and ant number 11. Run number 28 and ant number 12. Run number 28 and ant number 13. Run number 28 and ant number 14. Run number 28 and ant number 15. Run number 28 and ant number 16. Run number 28 and ant number 17. Run number 28 and ant number 18. Run number 28 and ant number 19. Run number 28 and ant number 20. [1] "Compiling results." +## Run number 1 and ant number 1. Run number 1 and ant number 2. Run number 1 and ant number 3. Run number 1 and ant number 4. Run number 1 and ant number 5. Run number 1 and ant number 6. Run number 1 and ant number 7. Run number 1 and ant number 8. Run number 1 and ant number 9. Run number 1 and ant number 10. Run number 1 and ant number 11. Run number 1 and ant number 12. Run number 1 and ant number 13. Run number 1 and ant number 14. Run number 1 and ant number 15. Run number 1 and ant number 16. Run number 1 and ant number 17. Run number 1 and ant number 18. Run number 1 and ant number 19. Run number 1 and ant number 20. Run number 2 and ant number 1. Run number 2 and ant number 2. Run number 2 and ant number 3. Run number 2 and ant number 4. Run number 2 and ant number 5. Run number 2 and ant number 6. Run number 2 and ant number 7. Run number 2 and ant number 8. Run number 2 and ant number 9. Run number 2 and ant number 10. Run number 2 and ant number 11. Run number 2 and ant number 12. Run number 2 and ant number 13. Run number 2 and ant number 14. Run number 2 and ant number 15. Run number 2 and ant number 16. Run number 2 and ant number 17. Run number 2 and ant number 18. Run number 2 and ant number 19. Run number 2 and ant number 20. Run number 3 and ant number 1. Run number 3 and ant number 2. Run number 3 and ant number 3. Run number 3 and ant number 4. Run number 3 and ant number 5. Run number 3 and ant number 6. Run number 3 and ant number 7. Run number 3 and ant number 8. Run number 3 and ant number 9. Run number 3 and ant number 10. Run number 3 and ant number 11. Run number 3 and ant number 12. Run number 3 and ant number 13. Run number 3 and ant number 14. Run number 3 and ant number 15. Run number 3 and ant number 16. Run number 3 and ant number 17. Run number 3 and ant number 18. Run number 3 and ant number 19. Run number 3 and ant number 20. Run number 4 and ant number 1. Run number 4 and ant number 2. Run number 4 and ant number 3. Run number 4 and ant number 4. Run number 4 and ant number 5. Run number 4 and ant number 6. Run number 4 and ant number 7. Run number 4 and ant number 8. Run number 4 and ant number 9. Run number 4 and ant number 10. Run number 4 and ant number 11. Run number 4 and ant number 12. Run number 4 and ant number 13. Run number 4 and ant number 14. Run number 4 and ant number 15. Run number 4 and ant number 16. Run number 4 and ant number 17. Run number 4 and ant number 18. Run number 4 and ant number 19. Run number 4 and ant number 20. Run number 5 and ant number 1. Run number 5 and ant number 2. Run number 5 and ant number 3. Run number 5 and ant number 4. Run number 5 and ant number 5. Run number 5 and ant number 6. Run number 5 and ant number 7. Run number 5 and ant number 8. Run number 5 and ant number 9. Run number 5 and ant number 10. Run number 5 and ant number 11. Run number 5 and ant number 12. Run number 5 and ant number 13. Run number 5 and ant number 14. Run number 5 and ant number 15. Run number 5 and ant number 16. Run number 5 and ant number 17. Run number 5 and ant number 18. Run number 5 and ant number 19. Run number 5 and ant number 20. Run number 6 and ant number 1. Run number 6 and ant number 2. Run number 6 and ant number 3. Run number 6 and ant number 4. Run number 6 and ant number 5. Run number 6 and ant number 6. Run number 6 and ant number 7. Run number 6 and ant number 8. Run number 6 and ant number 9. Run number 6 and ant number 10. Run number 6 and ant number 11. Run number 6 and ant number 12. Run number 6 and ant number 13. Run number 6 and ant number 14. Run number 6 and ant number 15. Run number 6 and ant number 16. Run number 6 and ant number 17. Run number 6 and ant number 18. Run number 6 and ant number 19. Run number 6 and ant number 20. Run number 7 and ant number 1. Run number 7 and ant number 2. Run number 7 and ant number 3. Run number 7 and ant number 4. Run number 7 and ant number 5. Run number 7 and ant number 6. Run number 7 and ant number 7. Run number 7 and ant number 8. Run number 7 and ant number 9. Run number 7 and ant number 10. Run number 7 and ant number 11. Run number 7 and ant number 12. Run number 7 and ant number 13. Run number 7 and ant number 14. Run number 7 and ant number 15. Run number 7 and ant number 16. Run number 7 and ant number 17. Run number 7 and ant number 18. Run number 7 and ant number 19. Run number 7 and ant number 20. Run number 8 and ant number 1. Run number 8 and ant number 2. Run number 8 and ant number 3. Run number 8 and ant number 4. Run number 8 and ant number 5. Run number 8 and ant number 6. Run number 8 and ant number 7. Run number 8 and ant number 8. Run number 8 and ant number 9. Run number 8 and ant number 10. Run number 8 and ant number 11. Run number 8 and ant number 12. Run number 8 and ant number 13. Run number 8 and ant number 14. Run number 8 and ant number 15. Run number 8 and ant number 16. Run number 8 and ant number 17. Run number 8 and ant number 18. Run number 8 and ant number 19. Run number 8 and ant number 20. Run number 9 and ant number 1. Run number 9 and ant number 2. Run number 9 and ant number 3. Run number 9 and ant number 4. Run number 9 and ant number 5. Run number 9 and ant number 6. Run number 9 and ant number 7. Run number 9 and ant number 8. Run number 9 and ant number 9. Run number 9 and ant number 10. Run number 9 and ant number 11. Run number 9 and ant number 12. Run number 9 and ant number 13. Run number 9 and ant number 14. Run number 9 and ant number 15. Run number 9 and ant number 16. Run number 9 and ant number 17. Run number 9 and ant number 18. Run number 9 and ant number 19. Run number 9 and ant number 20. Run number 10 and ant number 1. Run number 10 and ant number 2. Run number 10 and ant number 3. Run number 10 and ant number 4. Run number 10 and ant number 5. Run number 10 and ant number 6. Run number 10 and ant number 7. Run number 10 and ant number 8. Run number 10 and ant number 9. Run number 10 and ant number 10. Run number 10 and ant number 11. Run number 10 and ant number 12. Run number 10 and ant number 13. Run number 10 and ant number 14. Run number 10 and ant number 15. Run number 10 and ant number 16. Run number 10 and ant number 17. Run number 10 and ant number 18. Run number 10 and ant number 19. Run number 10 and ant number 20. Run number 11 and ant number 1. Run number 11 and ant number 2. Run number 11 and ant number 3. Run number 11 and ant number 4. Run number 11 and ant number 5. Run number 11 and ant number 6. Run number 11 and ant number 7. Run number 11 and ant number 8. Run number 11 and ant number 9. Run number 11 and ant number 10. Run number 11 and ant number 11. Run number 11 and ant number 12. Run number 11 and ant number 13. Run number 11 and ant number 14. Run number 11 and ant number 15. Run number 11 and ant number 16. Run number 11 and ant number 17. Run number 11 and ant number 18. Run number 11 and ant number 19. Run number 11 and ant number 20. [1] "Compiling results." summary(result_ACO) ## Algorithm: Ant Colony Optimization -## Total Run Time: 55.258 secs +## Total Run Time: 21.851 secs ## -## lavaan 0.6-20 ended normally after 52 iterations +## lavaan 0.6-20 ended normally after 54 iterations ## ## Estimator ML ## Optimization method NLMINB @@ -108,26 +108,16 @@ summary(result_ACO) ## ## Model Test User Model: ## -## Test statistic 109.392 +## Test statistic 135.441 ## Degrees of freedom 104 -## P-value (Chi-square) 0.340 +## P-value (Chi-square) 0.021 ## ## ## Final Model Syntax: -## -## Ability =~ Item12 + Item54 + Item45 + Item37 + Item55 + Item39 + Item42 + Item26 -## + Item19 + Item50 + Item2 + Item44 + Item10 + Item15 + Item17 +## Ability =~ Item10 + Item14 + Item19 + Item26 + Item27 + Item29 + Item34 + Item37 +## + Item39 + Item40 + Item44 + Item45 + Item53 + Item55 + Item6 ## Outcome ~ Ability plot(result_ACO) -## Warning: `aes_string()` was deprecated in ggplot2 3.0.0. -## ℹ Please use tidy evaluation idioms with `aes()`. -## ℹ See also `vignette("ggplot2-in-packages")` for more information. -## ℹ The deprecated feature was likely used in the ShortForm package. -## Please report the issue at -## . -## This warning is displayed once every 8 hours. -## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was -## generated. ## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0. ## ℹ Please use `linewidth` instead. ## ℹ The deprecated feature was likely used in the ShortForm package. @@ -180,9 +170,9 @@ result_SA <- simulatedAnnealing( summary(result_SA) ## Algorithm: Simulated Annealing -## Total Run Time: 20.331 secs +## Total Run Time: 24.475 secs ## -## lavaan 0.6-20 ended normally after 34 iterations +## lavaan 0.6-20 ended normally after 39 iterations ## ## Estimator ML ## Optimization method NLMINB @@ -192,17 +182,17 @@ summary(result_SA) ## ## Model Test User Model: ## -## Test statistic 762.752 +## Test statistic 774.402 ## Degrees of freedom 740 -## P-value (Chi-square) 0.273 +## P-value (Chi-square) 0.185 ## ## ## Final Model Syntax: -## Ability =~ Item33 + Item5 + Item19 + Item39 + Item42 + Item10 + Item38 + Item20 -## + Item46 + Item18 + Item36 + Item55 + Item31 + Item4 + Item35 + Item49 + -## Item40 + Item44 + Item28 + Item24 + Item22 + Item2 + Item32 + Item1 + Item16 + -## Item27 + Item51 + Item21 + Item13 + Item6 + Item8 + Item41 + Item43 + Item45 + -## Item23 + Item25 + Item7 + Item52 + Item11 + Item53 +## Ability =~ Item10 + Item43 + Item35 + Item19 + Item25 + Item49 + Item28 + Item5 +## + Item32 + Item14 + Item36 + Item55 + Item45 + Item50 + Item3 + Item54 + Item1 +## + Item34 + Item24 + Item33 + Item20 + Item46 + Item38 + Item13 + Item44 + +## Item52 + Item51 + Item53 + Item15 + Item56 + Item39 + Item29 + Item37 + Item22 +## + Item27 + Item21 + Item42 + Item30 + Item8 + Item40 plot(result_SA) ``` @@ -223,7 +213,7 @@ result_TS <- tabuShortForm( ## Running iteration 1 of 1. summary(result_TS) ## Algorithm: Tabu Search -## Total Run Time: 2.598 secs +## Total Run Time: 2.826 secs ## ## lavaan 0.6-20 ended normally after 29 iterations ## @@ -250,7 +240,7 @@ summary(result_TS) ``` mermaid flowchart LR A@{ shape: lean-r, label: "Full Item Bank" } --> B[Specify Model] - B --> C[Run Optimization Algorithm(s)] + B --> C[Run Optimization Algorithm] C --> D[Evaluate Candidate Forms] D --> |One or More Forms Fit| E@{ shape: diamond, label: "Select Short Form" } D --> |No Adequate Forms Found| C @@ -264,7 +254,7 @@ ShortForm produces diagnostic outputs such as: - Objective function convergence plots - Algorithm-specific diagnostics -- Summary statistic s for selected item sets +- Summary statistics for selected item sets ------------------------------------------------------------------------ @@ -304,9 +294,11 @@ Parallelization is supported for certain workflows. ## Reproducibility -ShortForm is designed for reproducible analytical workflows: - Fully -scriptable - Compatible with R Markdown and Quarto - Supports -integration into larger modeling pipelines +ShortForm is designed for reproducible analytical workflows: + +- Fully scriptable +- Compatible with R Markdown and Quarto +- Supports integration into larger modeling pipelines ------------------------------------------------------------------------ From f8a6b2950dbfe00d6a0954d23d3aae0cae580904 Mon Sep 17 00:00:00 2001 From: Anthony Date: Tue, 28 Apr 2026 23:59:43 -0400 Subject: [PATCH 12/12] fixing mermaid diagram typo --- README-quick-example-ACO-1.png | Bin 13802 -> 12687 bytes README-quick-example-ACO-2.png | Bin 7878 -> 7757 bytes README-quick-example-ACO-3.png | Bin 8003 -> 7457 bytes README-quick-example-ACO-4.png | Bin 8095 -> 7908 bytes README-quick-example-SA-1.png | Bin 9389 -> 9553 bytes README.Rmd | 8 ++--- README.md | 60 ++++++++++++++------------------- 7 files changed, 30 insertions(+), 38 deletions(-) diff --git a/README-quick-example-ACO-1.png b/README-quick-example-ACO-1.png index fd88367c29cd66d09f2700d9c4695ce4d4b7eb3c..1c2eceb7543d729324a9738c3003489c49b33437 100644 GIT binary patch delta 12262 zcmbulcQjnl_czQi1VKcJ5(FV;bWuWrQNw6sX4EJ_5ThkpgfMDEZ=<&fh8Z<#5;dYl z7e-B#5YdU=<&k{9?{BSlz0X?jv(__z&AI1ucKMur&)xgpz3LQa8-JU0ppu`K6yO@0 zBthCnUTrHropeMBM!$W`(KqrOW77JQx);Nqr14zW{F5m4^Q`(pL6A& zWCM0q5W2Z^x9Pb&R^Ou!-Cj3HKB$RKQ74T=(`RN2NmDw@g}{m2egrHqs4cz0CRm)9>x_A1J2IU-&_A+-4I`$oEdph~D14 ztw$B7re{C9tfv0#_9|s^dG7rhu|jP&E>xno#B$!dEhll8b2pwI;eHfGMZIYI8mBKU z_Iu)NYHf32GjiRfC?{Q3;)!>nTI1Y&E921S^aqk+ZuX%P@63Ru(YU`tV`m%WAFQwZ z`h^&&9o=4@L2*sU`Vt!hPc}MuR0jEDDQ*^GyRR&F7?Ms8u8!*|?B@QdKOYZZ`GdB( z7sJji)8guzC#E`m<}{3%bTjkhlP;T8Y^6`NVN5&TI-MpVrY35ccG) za?@(yg$ugJ%ljn^8k13K;Bf4M63p5ilqYm~PJPU%C%*Au}C*R9pzkE5zf zesQMZ^!OX*NWLyld z@PYDV{KQV+eCU&e-y&Fs zHboS(@AoV9ef$srIot|oY(Ew_M4yn?WEO3PHR#=3FT5LOaVlAqbKLED{p&-r;wJ3D zoZ;S#UO2@eibOs@`>o$+3k#)MTZ=%aSz3$g-EaF#pC5*J3VQYcrVO#^(fKVWn(=x8#;?<#l#&qxSo4^d+esIA>GEN1Fc}_-{9TDo|B=iEdu@b|{M_eNrBY@@B z6SifK*8J8>PmW2#%0n)mz1(IcnaT|SKx!#zfFP5c#q8YIc;%zb`#SP9oV)slRy#FhEX#Y_8)J?um z6r8lRs>%pkmtQVU#40?>t$7WM+(Q8|&2&&QTt$fceI|K1Qj1sl7fIZ?S$_Nn>QRFv zRM;rp&Gmlqa6iw@*shDCqW%`HrhNyiKf@%{rCioQpPSHTWE*j0$G0OW{!2QQ;L%;J zPjQOnV0`_qLkaga<;K1KKLevHkL))>Jv}_;TcXFw4=N_z#HQA?bI+d6BuQ8Y1vd=` zt>zZJnEpx9kt4Kv=^~Knny()^JHpKS*V{lkJC79av9UY&YQ&YY6;l8i&<{sC`r7%z zMF33(TmKg^mXO-qC?#bp%IvsF7c1`Y>${TZBim}zQ_th#>AebRr*R~JEbMX}u9+SM zfckS|zFmgM)#c6Qu4;))3r^YQ68$shlUJHZ_HL>X>+rTpr& z+Fx0v{$KC2aH9gwrV)4c%db+=F|9I_c+xKo&gE)Jk^yu7xqC%QPhdb=ZfODl)Hcxd zmeYX54P^VS$90Ky-Z^<(ppj-v?pcqL54cLQN#*3;^BjO`t}#urh-E~>HXNSYzOpFo z6zQT~p66XVJCq%Nl4%R9Ii}kg|3>rj3$8z7-Muex43k1#Be3@Wd8o!-TXrK7+avg4 zlWl*L51v^E*I72?FBYpC!?yN`C8_(FDsVzEBa+rCTsD$*{s^QDyaqg zbUTcB{6wIh>)JBq2)rfYEx3GN*Hht()-a_<9_oFWWtbUc2R#QO^ z9nKnO7?|!>5hXF$?e9W@UQ4ICMjD2Ye6JKnDa!{#W6QpT)Ptl{`CcmaS-_Bqwtw~_ zc}(h6B${w&kk8Ze^gqMBrb8t1KWk)$4x=@23Wab7Ipu{8GMAXwSPc2(&hT- z*Jf*L!grp&;(+kvU+Dk)-}nRzZF8~f=5n;vT$0CLR-J|2t_o`Il_*B9bW8q^ zMSd8AjYhPkFO%x(UpX|8Aj$gry}jmCNwdE?zmcFUSND7KhiwVfSq0mPLEwGY|Jo)w z^nTXpYW|kr-G4|sGXHPRo`&k6*N zo!M7W6DNGGU@Kb6?`iaNhk^02!C}Z#;ta>IZlC+}vT%wM`4K_4vhW0U*@A$&g3PqV zd9yf@8tD^?F8m6HN|}07^X-?p|9nt~xV>7~GcI5EmbJR)|7+^R@v*3t(arqFJRM3`yfjdUocMo+YX{D} z`q43c-=Tb3zU2?P%XnO$%;O^!YA*(7;LXM#Zx-M=s8SzcDq8MEHN-J!`EB~_AS`qC zV^za;zfeh0(8upxer)PSeg!G>n#m;p(Jc~q@aJjHaOergUaFYBS{tjE+DUUPMm{Ga z)LL{~-~8xzABpECdo(;%PD6KT|DHijJTw99!9T5rW&@Xdt!NE%pRJSz59Ct(8s_hi zD9#>NwPSi1$qZ*AJU5x8RDjzkQ z+JC-sTDChopVMKrT79eMTU@Y4zviSL{AZHEQ{&<>Rc2mhJmI+p@cg%@A1MaSxi^f9 zK;y;orQly97!9HOYsddKk^WR`823^tzjQsErB5LBF2PRM67N2rNJA5HALuf5v&ziMaRFv&uB z)ny7Nx)JgGEq|r43O>ddYK+hN@+J&xI2Ir!VzB?T{1Uz}?8jf{ut+ty4r-cUG~V67 z@ZQ*8{L5N6$w`k;f7Xhou}1&W{>JyH_<9W7r<+o?aBe9dy)PCK{`A4sApwp2sfTZe z;1&K`-HqSBxk1A^kdJm3p+Ydk!jC}rX!jmLIFzcO5I7qxl`;I+P8hZV64hjndEOI> zfiuE;onZF3z9@slh%52bOx;2ytkK|R11!dysTAWL|Cs}^nz2%!Hl}oUmFRO7`_AAP zcc;OEfL@e^vUM=o*Be14%l;bsv5)-PD2v}tG?jv#3FX>ZNNpPlDjE@%zN@&Asn|*qP`PW$JPGNwDLUq6hf4GVTfOGDyOMmMgP@$EFIk z-y80BU}E+Bv)2}YqtDP_JDysAdLD5%!{EH#vW^p{O~9ti=PEEj8JUnjuNSMKfRR5x zE@c>uBxFRaYV7BJ;Jfjv4*rH9d6$z0EHYY%-O)RCB=nk=Ug{X{bVf=Hk|hij9iDA!c)~R)$Dw~W~C8^L)OeSNW}cY+!^gfcPrg}L~?SoX2K(;xn6Gw zE-yJ6P(~FF+Crjy;@dvE#n-$U&}?E;$9RXZSrTp(niFKylSRw4qh5;$mDIQb1kE)^*+H{U zE12x5!Tc$&XmAyAh+mzaqRFPn4kLro!kABHV05&X5F}lbU&EgnVb{OsHJ69sLG3qkEAt!_wbgv-dZK&mI9ePBI2TVS4khVDhKA60yvJO%_ z{+UFrdg<1*pgzd0Tb3E&gd6E`dr|IYfs`&~c`Q+S&7`fHdG% zs928tJ>W z;FaRl%nT6RmtD>!hVbyq6udFuLcq|VRwjhJd~K-w00qft5n`%T#Prup;4KebMIvho0W1(Lecc(EUn^35;1|ME85FP`)n5XQ2WSMjDOv0EYgXDo(Hpw7@H@rj z@DbaNFP&2Zos?7Up+wIZzO<_cVqq=j0Q1~_+cV5 zOAXnG9M(74I z^YxAj!JYf>DGmvU!^3#gqj`1Gfur+Gs8Fb!-4-(D4$|Ol4|+e6>Cue^DTrS|@TjG- zCS_p_Vv_E1BYe+gwSWTR(k9}Uy~{p9D~&;}=3}<8Cg$g*(u1HKM5Ys&mgvKgU<;uhWKMjA7w^>i3a3#0aoHI3k(s zMn^*c4CT7>CdjgJ*DY86vZ@vJ!{&CxgE!~BS6Lt;W%cW*0D10!~?&Lv14-B86b4ryeog^e_ZZSc=~ld=kRZpd)*r zfJ>>=!qZ{Qw`fT#h%0;d3MLGL&`i}U!$wAe7m=~dE!dv#z@K<8PPo`x6KYJO+8{~& zR+v5U1HYYl_n{$79Uk8G17>PsKsWATF73yK{r3^Ipw_c?}1> z?O^$S?W+V9z2~JPy1&tcmN27GXUnG@5cLv*_Y^S>19M+(?W+j_i8wAT~&KtU=-$Q0ecD0CJg)aC zes@xwd?KS4B!!3ZZafVCfdNU6>3KB{!dKOp|6C>ETdVG?`i-t%O9psZ%yTd2UBgKh zBq0by&0aJ)VWNxVmMMu?w@~QJ5QI}dkt+>oP)vfu7;q3iFDh9P0>Qz;^kVvMZ-Uo= zcnN20KHLc8;wo{=D-mkovh~8aK0flSqe-Stn)z-cwsEMW`49A17uKXl27vD8n(D;Nl zNG@dUgkv8rv5YUfWhF~ex(4YCu?24U0aG)R!=$WfNIGegymf%#jX|f+tBT}TC7~};STGSfu z-!f;rc)pNnd=J7MaP;Gsok+aQ3sqyRj*hC9S10r$5XD%uv&vsr>`eA41u*Tu_o#Y$ zDaPTCUv>Me&%xB@ulHh7`i?5+5nJKthMMV0m3o;T2l>?1%vBWk+~UoWmOIkJX{3G7 zKbB`Z;lEs8Ep%us1tf0;xr3Kk)d;-FU{*q?y({bNPQ^zL<>FYEcR2PhtIP9bp}aLL z^oPa|V9UoC2+9UUFI|X?F2&# z-R3pk(H7DA)UF4>#$_bfpzjcRP>bW9qYO zKV_ROHMwKUtxPBar}&Zu?IdI7Ffy6Z!c1HX*fAW$0{v4Jgbu|s5L}5Wpj5|qVOCHX zX#=;)FcDxq-=CpMw&femLyg6>@UUC8upWE%2JCf91erE72sS?Z?kr43qu>p^51$Mt z9jU~MCaJATnOTOF3A6|nxahZ`=(tp(Cqy?4W3mY<7}IX%hwDdA zN3Oo+qx41NiKgy+J(N8vP-m?s@CN1WG{pUm=3ckw3}j6cXL7DPhf!(G!g*}cu3D8I zekt&h-6Eu3?M*+z&fM; zFrPX~iXGMcu-0C^j&{Bd*5Qur)C`1cirhGTr>&UkZ2z?O9n;dMdon}k24ot_1(9kf z8F}I30I_s=tZodP>o3P05Ki>Vi4b~4{1Z)s{F`}qixMIUZ=Ab*!YU1gfvYDRDctCF zUPvUH3s;X!1_J^#L#(o)xcBOk;EHbw_rf4OW%M7yq)Tn3t(i4i@DGy&k$w9+O(7`93GZj}XIB$_Rqt6CwCDR3_3Jhp| zNDW%#+?gEfF1#QO+Fvlo@7Q`N8TNG4rh#$!yOUIiN@A3bJl)}D-_mmWTfTw)@y-1|4Sd8{Vc2Lu2YBpZtk&;A2Jj!1OJd>mOHo9?P>6cZ=~1y z%5@T#{AY!aL1FRNx#e4-H1<>KucbYF8w&vPwmqUaad;3K9%YlkHzMj(1mr77WDzVw z24Y~S({9F3Qf(1~)y7;&q%imH)LUV)g}=v;lj31Du51tK7)bYb!|eJ5&2%IRm=L<4 z0iqsALuNnJRpfF@;~`rgmvX$h9C3Xke!-wTCYx2b4pj-k!JChY6m$8C>Tu8CHsT@& z^Q1Ul8m;tTVvv16#iTz`r zyE*5Gb1J+CXGApSsOS))PCxcd=6iaHgmH=4VEf0F#frZL1ae3LHaBWADA$ZNrzKmT9GSI$ASZ$75%q!6`8+YdnF|RHU?+Q4zW&H`$G4Ei*#OeI(eHJ zy5mHf3!oW z>rV|568cA4YRbrxmD{5k&a0+kf|6Lp3(H1H4$iD9Z=87{AF?WEr@7uuKs&Dtew+ZX z3nlkGoPP2CZktAr5Drjir1#K(f-sDhFHsVde)FA|a!Pb}41H&1Q!%oiNxhgOS-jT# zNTdMnm7;p!lg~`%f_{;9Zk5sC$50M`hq2L6*GY$c?JY8bhuO)fWrxjBnrcuJ_k}N9 z65QLiK8B;?h(9rR z439rY=Ij3Ikgw|!1+Lb&%ldc3yGJ?h-ug+-eLj^FPuOM$^GgekiFP-t#j)ZSw1z7- zMrawzi0w6gu&0Hc!6*zn>Dp^RW71DZjKt-pSfgs^DIfdJNBZ94|y7IOwyhR$QMT=>zX&N*Gk=8bhMmlbryp#_f zCIdu2=YsU>G@J^{7HZ>fA@1OvN?oE&3`md2PpWU!t&>)Aj!!@`o8gx^^1G1(u2h@I z`{&UMkc^JJmb6^4aP?L`g}huuV+<=R&rqdt-MBK^Kld$d^~f{mS9F-t96ouTdmvGtmlJDKWMJ*^n)Y>(F_CFf>g$6_p zII0Xv0&PfD5otrwkSkYL(;OAmATK3yIx-XJ^v>OM(sd%D&J4jU_PPc4RwHQlW;gHd z^_mj)O%+oKl~^uY0_Gmi=kI}Z*76<6*LB#SK%K30iVPmF5R(x0J{EjCp~`ydeV=s? z*Yt6;GjoY6y-9w^Gh!0y5Dsx2{FaE+RY)0;c=V~*R!s&SYkkJX$btVH=KdBAMTl<% z>qrDihZzBEH3XL;=xQPu2rn16w)$gMuF;LL;zqw1C^a1L_abb_&f|1DTd%Bn`XoQm zX=v|+Hsy3m$i|r^l5pOQN&5C#UtayKhTW81e_JEHiCT1(c~%5SNp;n9+n^F=G^iB&_NAOG{!s^4O< z-+EShidV+>_Nl;kG(F|&Y8gahk7|}j)+uTp`tII0HY<6B-R-;2g2TE;u0E5c_7XDT zF)SC7j=1i_E1kLtImGRDR*!qjw)nq&2}Lumx($&*tV_9QF5fZe)V9QV7F*l7l2^?= zU0-~5wwC!@cK_A){lev`ys*#hq`nIr`sNemEOeZcgcm6L@Aqgs0Nsxq`;Gm9v6-&K`j0qp?_FwtRYO zFC98ceG!LGHNVK2cGS;=UcV7Na6Zozw zrzsVLOmmTW6tkOaOd_}U<_9_n;@C$bI0Sq|zzl~WJq&P|@=gWmWL9ewIjr9O=1#9f zWzYqjeoV_!PFli_*>G1la3p~}F%H5f#sTE%R2mnXBN225M26k*3c$W1+%lZJ$s93C zv2db!`eP*Xq+`dAx%cBju<#W;toW)BXq4GW(dPUaxiVnuWdG`99$J_dZ(jVE@?9D^ zyO5jrwy9p=aCy<(Hzu~)#V5kwo@cCI4~lJ_sXEZ(S2v_c=3VPAWrV)k_@t93c&@Yc zpfU)MMBW};{Jz7g?uKx%V!Nj(347gkJF|Umu$k)uMa=Oc7eaHN16sSqXf5ksjUA{hff14ZK^^+U};PC5%3o#1NU?fAX zJ)CRK3hHb}Nl$2Tie9(XjOGii2%`wKy?CDk4+NMn>O?+|1>7kjE0BWUBn?H{kl|v9 z1CDg?_Y6EL6dDp;dyqc{^u9lB2+5@n9>kV9dUU3NU{W$B2@HDuw^9QQ16vKymaMUM zr28R;jG1V5ts0WzPo!FgH)VlLoGp>H^l!fgO7g|}LdhdhUTqmnr32dRyRFu3DO0!7 zCm=xy{Xik9BE>IeJMLTZ(hmsJm5dyhw-0LO?6DWmr+M|xX|9sHzj)rn_C8c0!Cg=^ zz4Oa@`Hp!F5$oYIX4iFtTxWRshl0x$~}p`WuLv0pdcE?=frf8%ask=<5&Dt z`7Mz-#dHiyb6-`4*=Fxd9Tk@>Lb6DkEL%08n^@Mxc8h-7L0ky?vq5;-JnXk!#5>kl zzlPEVp^$sd;bl;rZW~7?Yp0-b@{}jPPu z{!G#(WnR@)IFOERrvMAnBy<}!I+E$AUB;JH%9kfEeM;ulO;kH*#2M1b7UN^=jOg8n z2r>YpQF0d(CB{x>J&lU-(Q}I82lg}&xhEdE*HgfjaPG)iXGTGKm(|J&>z_v?=+Wxq z)#|XD4p<0y^80lT{6;63uWHn}ubtvVETvoPIX{O4j>OCOW~#IL8YmM0CUPV?msRJu zzY1K9uy7-cYj50&BO$x2(oi#b`TX+CpM`0*wyDI$FHfeXlNPnThj;im{NtWoC0l+& ziy8hxy-%T|pJK`arP?An2eK}p=L4ta`5*EqEIcsm-~!&t1oUXH6R70T)(xANscN;? z)u5{DnJVj{hKmx+cvYY3EYcd`m2G$sMO@k27_I6{YQ4BnYL`jkACtndEZYotpl|fU zwS8KK2LXQ@9rn_la3nF=C$FDH+`zscX!&rNR4_l~ia39Lg+mPD7Jy#r+3b|9xNNJM zSpY7_I8M^FWUv?r#+oc<1sPDSP(~rg{;i~ApVa5br2`id^_D!BZidS zEO^6!E->SE?b>%FR_pJe8{!nJ{6Edt|I-UHt3&=1u#{n)mX&c z-{}DOZ*&k9-t~p|uZyDjAAuYjxL*F$2Kuh)i=}a6Y%Trf(d)fKJLA?&iREhv51WzL zQ~sU370IZlWFE&fVUb!R`(OAjKZ|kv`JqBEtVv&7tau_Mu;C}P`6ZRQMmPO*=(7;| zX{HaKRglJD4EzwwjK9^-{&KB_S+-3#!_@KuT4y7{%apM2oWX{g}aH+m!|3!Q~-(nGfHX+|bq(4qCM|V1D9uf3fliu^ic6mD| zNQwFBo4!DFz+R@(g!G@ouWlFJS~!$?a^d9?uH}7&FAU4w_bWE(-2S{=El*CNmQs72 zR8ZZ(HuOUYb(;WDEhxisXFK;S*R=n^0%|pZ?7Y+0(f$U?La-7fmS=cNS#0xt7Bl`4 zc<35iMaWF;=^i2E96e(cWcF9X56O|Y@)JUaTC1~v8mNhq|N9>K|E-4uEr7$*a(2)W SzYfXePfJ}-tz6}C@c#lp1fS>t literal 13802 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 diff --git a/README-quick-example-ACO-3.png b/README-quick-example-ACO-3.png index 699a138f13fdb7b28705233905b7f7749ea19aa7..4b8b3c411f08a51e2ca55de0157255bdf9d6a99b 100644 GIT binary patch literal 7457 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 diff --git a/README-quick-example-ACO-4.png b/README-quick-example-ACO-4.png index 91c6df643b631ca6c597918e58ebbb2353827bb6..d81a266918de54dd9c445b5522efe4f2ea408c36 100644 GIT binary patch literal 7908 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 delta 8789 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 Np4NTMDvkfJ{|BT+@*n^J diff --git a/README.Rmd b/README.Rmd index 49063af..36623d1 100644 --- a/README.Rmd +++ b/README.Rmd @@ -4,7 +4,7 @@ output: html_preview: TRUE --- -```{r, echo = FALSE} +```{r setup, echo = FALSE} knitr::opts_chunk$set( collapse = TRUE, comment = "## ", @@ -133,11 +133,11 @@ summary(result_TS) ```{mermaid} flowchart LR A@{ shape: lean-r, label: "Full Item Bank" } --> B[Specify Model] - B --> C[Run Optimization Algorithm(s)] + B --> C[Run Optimization Algorithm] C --> D[Evaluate Candidate Forms] D --> |One or More Forms Fit| E@{ shape: diamond, label: "Select Short Form" } D --> |No Adequate Forms Found| C - E --> F@{ shape: lean-l, label: "Reporting & Visualization" }] + E --> F@{ shape: lean-l, label: "Reporting & Visualization" } ``` @@ -147,7 +147,7 @@ ShortForm produces diagnostic outputs such as: - Objective function convergence plots - Algorithm-specific diagnostics -- Summary statistic s for selected item sets +- Summary statistics for selected item sets ------------------------------------------------------------------------ diff --git a/README.md b/README.md index fb89d51..6ec155e 100644 --- a/README.md +++ b/README.md @@ -57,7 +57,7 @@ This package demonstrates: ------------------------------------------------------------------------ -This document was created on 2026-04-28. +This document was created on 2026-04-29. ## Installation @@ -92,13 +92,13 @@ result_ACO <- antcolony.lavaan( feedbackfile = NULL, max.run = 200 ) -## Run number 1 and ant number 1. Run number 1 and ant number 2. Run number 1 and ant number 3. Run number 1 and ant number 4. Run number 1 and ant number 5. Run number 1 and ant number 6. Run number 1 and ant number 7. Run number 1 and ant number 8. Run number 1 and ant number 9. Run number 1 and ant number 10. Run number 1 and ant number 11. Run number 1 and ant number 12. Run number 1 and ant number 13. Run number 1 and ant number 14. Run number 1 and ant number 15. Run number 1 and ant number 16. Run number 1 and ant number 17. Run number 1 and ant number 18. Run number 1 and ant number 19. Run number 1 and ant number 20. Run number 2 and ant number 1. Run number 2 and ant number 2. Run number 2 and ant number 3. Run number 2 and ant number 4. Run number 2 and ant number 5. Run number 2 and ant number 6. Run number 2 and ant number 7. Run number 2 and ant number 8. Run number 2 and ant number 9. Run number 2 and ant number 10. Run number 2 and ant number 11. Run number 2 and ant number 12. Run number 2 and ant number 13. Run number 2 and ant number 14. Run number 2 and ant number 15. Run number 2 and ant number 16. Run number 2 and ant number 17. Run number 2 and ant number 18. Run number 2 and ant number 19. Run number 2 and ant number 20. Run number 3 and ant number 1. Run number 3 and ant number 2. Run number 3 and ant number 3. Run number 3 and ant number 4. Run number 3 and ant number 5. Run number 3 and ant number 6. Run number 3 and ant number 7. Run number 3 and ant number 8. Run number 3 and ant number 9. Run number 3 and ant number 10. Run number 3 and ant number 11. Run number 3 and ant number 12. Run number 3 and ant number 13. Run number 3 and ant number 14. Run number 3 and ant number 15. Run number 3 and ant number 16. Run number 3 and ant number 17. Run number 3 and ant number 18. Run number 3 and ant number 19. Run number 3 and ant number 20. Run number 4 and ant number 1. Run number 4 and ant number 2. Run number 4 and ant number 3. Run number 4 and ant number 4. Run number 4 and ant number 5. Run number 4 and ant number 6. Run number 4 and ant number 7. Run number 4 and ant number 8. Run number 4 and ant number 9. Run number 4 and ant number 10. Run number 4 and ant number 11. Run number 4 and ant number 12. Run number 4 and ant number 13. Run number 4 and ant number 14. Run number 4 and ant number 15. Run number 4 and ant number 16. Run number 4 and ant number 17. Run number 4 and ant number 18. Run number 4 and ant number 19. Run number 4 and ant number 20. Run number 5 and ant number 1. Run number 5 and ant number 2. Run number 5 and ant number 3. Run number 5 and ant number 4. Run number 5 and ant number 5. Run number 5 and ant number 6. Run number 5 and ant number 7. Run number 5 and ant number 8. Run number 5 and ant number 9. Run number 5 and ant number 10. Run number 5 and ant number 11. Run number 5 and ant number 12. Run number 5 and ant number 13. Run number 5 and ant number 14. Run number 5 and ant number 15. Run number 5 and ant number 16. Run number 5 and ant number 17. Run number 5 and ant number 18. Run number 5 and ant number 19. Run number 5 and ant number 20. Run number 6 and ant number 1. Run number 6 and ant number 2. Run number 6 and ant number 3. Run number 6 and ant number 4. Run number 6 and ant number 5. Run number 6 and ant number 6. Run number 6 and ant number 7. Run number 6 and ant number 8. Run number 6 and ant number 9. Run number 6 and ant number 10. Run number 6 and ant number 11. Run number 6 and ant number 12. Run number 6 and ant number 13. Run number 6 and ant number 14. Run number 6 and ant number 15. Run number 6 and ant number 16. Run number 6 and ant number 17. Run number 6 and ant number 18. Run number 6 and ant number 19. Run number 6 and ant number 20. Run number 7 and ant number 1. Run number 7 and ant number 2. Run number 7 and ant number 3. Run number 7 and ant number 4. Run number 7 and ant number 5. Run number 7 and ant number 6. Run number 7 and ant number 7. Run number 7 and ant number 8. Run number 7 and ant number 9. Run number 7 and ant number 10. Run number 7 and ant number 11. Run number 7 and ant number 12. Run number 7 and ant number 13. Run number 7 and ant number 14. Run number 7 and ant number 15. Run number 7 and ant number 16. Run number 7 and ant number 17. Run number 7 and ant number 18. Run number 7 and ant number 19. Run number 7 and ant number 20. Run number 8 and ant number 1. Run number 8 and ant number 2. Run number 8 and ant number 3. Run number 8 and ant number 4. Run number 8 and ant number 5. Run number 8 and ant number 6. Run number 8 and ant number 7. Run number 8 and ant number 8. Run number 8 and ant number 9. Run number 8 and ant number 10. Run number 8 and ant number 11. Run number 8 and ant number 12. Run number 8 and ant number 13. Run number 8 and ant number 14. Run number 8 and ant number 15. Run number 8 and ant number 16. Run number 8 and ant number 17. Run number 8 and ant number 18. Run number 8 and ant number 19. Run number 8 and ant number 20. Run number 9 and ant number 1. Run number 9 and ant number 2. Run number 9 and ant number 3. Run number 9 and ant number 4. Run number 9 and ant number 5. Run number 9 and ant number 6. Run number 9 and ant number 7. Run number 9 and ant number 8. Run number 9 and ant number 9. Run number 9 and ant number 10. Run number 9 and ant number 11. Run number 9 and ant number 12. Run number 9 and ant number 13. Run number 9 and ant number 14. Run number 9 and ant number 15. Run number 9 and ant number 16. Run number 9 and ant number 17. Run number 9 and ant number 18. Run number 9 and ant number 19. Run number 9 and ant number 20. Run number 10 and ant number 1. Run number 10 and ant number 2. Run number 10 and ant number 3. Run number 10 and ant number 4. Run number 10 and ant number 5. Run number 10 and ant number 6. Run number 10 and ant number 7. Run number 10 and ant number 8. Run number 10 and ant number 9. Run number 10 and ant number 10. Run number 10 and ant number 11. Run number 10 and ant number 12. Run number 10 and ant number 13. Run number 10 and ant number 14. Run number 10 and ant number 15. Run number 10 and ant number 16. Run number 10 and ant number 17. Run number 10 and ant number 18. Run number 10 and ant number 19. Run number 10 and ant number 20. Run number 11 and ant number 1. Run number 11 and ant number 2. Run number 11 and ant number 3. Run number 11 and ant number 4. Run number 11 and ant number 5. Run number 11 and ant number 6. Run number 11 and ant number 7. Run number 11 and ant number 8. Run number 11 and ant number 9. Run number 11 and ant number 10. Run number 11 and ant number 11. Run number 11 and ant number 12. Run number 11 and ant number 13. Run number 11 and ant number 14. Run number 11 and ant number 15. Run number 11 and ant number 16. Run number 11 and ant number 17. Run number 11 and ant number 18. Run number 11 and ant number 19. Run number 11 and ant number 20. Run number 12 and ant number 1. Run number 12 and ant number 2. Run number 12 and ant number 3. Run number 12 and ant number 4. Run number 12 and ant number 5. Run number 12 and ant number 6. Run number 12 and ant number 7. Run number 12 and ant number 8. Run number 12 and ant number 9. Run number 12 and ant number 10. Run number 12 and ant number 11. Run number 12 and ant number 12. Run number 12 and ant number 13. Run number 12 and ant number 14. Run number 12 and ant number 15. Run number 12 and ant number 16. Run number 12 and ant number 17. Run number 12 and ant number 18. Run number 12 and ant number 19. Run number 12 and ant number 20. Run number 13 and ant number 1. Run number 13 and ant number 2. Run number 13 and ant number 3. Run number 13 and ant number 4. Run number 13 and ant number 5. Run number 13 and ant number 6. Run number 13 and ant number 7. Run number 13 and ant number 8. Run number 13 and ant number 9. Run number 13 and ant number 10. Run number 13 and ant number 11. Run number 13 and ant number 12. Run number 13 and ant number 13. Run number 13 and ant number 14. Run number 13 and ant number 15. Run number 13 and ant number 16. Run number 13 and ant number 17. Run number 13 and ant number 18. Run number 13 and ant number 19. Run number 13 and ant number 20. Run number 14 and ant number 1. Run number 14 and ant number 2. Run number 14 and ant number 3. Run number 14 and ant number 4. Run number 14 and ant number 5. Run number 14 and ant number 6. Run number 14 and ant number 7. Run number 14 and ant number 8. Run number 14 and ant number 9. Run number 14 and ant number 10. Run number 14 and ant number 11. Run number 14 and ant number 12. Run number 14 and ant number 13. Run number 14 and ant number 14. Run number 14 and ant number 15. Run number 14 and ant number 16. Run number 14 and ant number 17. Run number 14 and ant number 18. Run number 14 and ant number 19. Run number 14 and ant number 20. Run number 15 and ant number 1. Run number 15 and ant number 2. Run number 15 and ant number 3. Run number 15 and ant number 4. Run number 15 and ant number 5. Run number 15 and ant number 6. Run number 15 and ant number 7. Run number 15 and ant number 8. Run number 15 and ant number 9. Run number 15 and ant number 10. Run number 15 and ant number 11. Run number 15 and ant number 12. Run number 15 and ant number 13. Run number 15 and ant number 14. Run number 15 and ant number 15. Run number 15 and ant number 16. Run number 15 and ant number 17. Run number 15 and ant number 18. Run number 15 and ant number 19. Run number 15 and ant number 20. Run number 16 and ant number 1. Run number 16 and ant number 2. Run number 16 and ant number 3. Run number 16 and ant number 4. Run number 16 and ant number 5. Run number 16 and ant number 6. Run number 16 and ant number 7. Run number 16 and ant number 8. Run number 16 and ant number 9. Run number 16 and ant number 10. Run number 16 and ant number 11. Run number 16 and ant number 12. Run number 16 and ant number 13. Run number 16 and ant number 14. Run number 16 and ant number 15. Run number 16 and ant number 16. Run number 16 and ant number 17. Run number 16 and ant number 18. Run number 16 and ant number 19. Run number 16 and ant number 20. Run number 17 and ant number 1. Run number 17 and ant number 2. Run number 17 and ant number 3. Run number 17 and ant number 4. Run number 17 and ant number 5. Run number 17 and ant number 6. Run number 17 and ant number 7. Run number 17 and ant number 8. Run number 17 and ant number 9. Run number 17 and ant number 10. Run number 17 and ant number 11. Run number 17 and ant number 12. Run number 17 and ant number 13. Run number 17 and ant number 14. Run number 17 and ant number 15. Run number 17 and ant number 16. Run number 17 and ant number 17. Run number 17 and ant number 18. Run number 17 and ant number 19. Run number 17 and ant number 20. Run number 18 and ant number 1. Run number 18 and ant number 2. Run number 18 and ant number 3. Run number 18 and ant number 4. Run number 18 and ant number 5. Run number 18 and ant number 6. Run number 18 and ant number 7. Run number 18 and ant number 8. Run number 18 and ant number 9. Run number 18 and ant number 10. Run number 18 and ant number 11. Run number 18 and ant number 12. Run number 18 and ant number 13. Run number 18 and ant number 14. Run number 18 and ant number 15. Run number 18 and ant number 16. Run number 18 and ant number 17. Run number 18 and ant number 18. Run number 18 and ant number 19. Run number 18 and ant number 20. Run number 19 and ant number 1. Run number 19 and ant number 2. Run number 19 and ant number 3. Run number 19 and ant number 4. Run number 19 and ant number 5. Run number 19 and ant number 6. Run number 19 and ant number 7. Run number 19 and ant number 8. Run number 19 and ant number 9. Run number 19 and ant number 10. Run number 19 and ant number 11. Run number 19 and ant number 12. Run number 19 and ant number 13. Run number 19 and ant number 14. Run number 19 and ant number 15. Run number 19 and ant number 16. Run number 19 and ant number 17. Run number 19 and ant number 18. Run number 19 and ant number 19. Run number 19 and ant number 20. Run number 20 and ant number 1. Run number 20 and ant number 2. Run number 20 and ant number 3. Run number 20 and ant number 4. Run number 20 and ant number 5. Run number 20 and ant number 6. Run number 20 and ant number 7. Run number 20 and ant number 8. Run number 20 and ant number 9. Run number 20 and ant number 10. Run number 20 and ant number 11. Run number 20 and ant number 12. Run number 20 and ant number 13. Run number 20 and ant number 14. Run number 20 and ant number 15. Run number 20 and ant number 16. Run number 20 and ant number 17. Run number 20 and ant number 18. Run number 20 and ant number 19. Run number 20 and ant number 20. Run number 21 and ant number 1. Run number 21 and ant number 2. Run number 21 and ant number 3. Run number 21 and ant number 4. Run number 21 and ant number 5. Run number 21 and ant number 6. Run number 21 and ant number 7. Run number 21 and ant number 8. Run number 21 and ant number 9. Run number 21 and ant number 10. Run number 21 and ant number 11. Run number 21 and ant number 12. Run number 21 and ant number 13. Run number 21 and ant number 14. Run number 21 and ant number 15. Run number 21 and ant number 16. Run number 21 and ant number 17. Run number 21 and ant number 18. Run number 21 and ant number 19. Run number 21 and ant number 20. Run number 22 and ant number 1. Run number 22 and ant number 2. Run number 22 and ant number 3. Run number 22 and ant number 4. Run number 22 and ant number 5. Run number 22 and ant number 6. Run number 22 and ant number 7. Run number 22 and ant number 8. Run number 22 and ant number 9. Run number 22 and ant number 10. Run number 22 and ant number 11. Run number 22 and ant number 12. Run number 22 and ant number 13. Run number 22 and ant number 14. Run number 22 and ant number 15. Run number 22 and ant number 16. Run number 22 and ant number 17. Run number 22 and ant number 18. Run number 22 and ant number 19. Run number 22 and ant number 20. Run number 23 and ant number 1. Run number 23 and ant number 2. Run number 23 and ant number 3. Run number 23 and ant number 4. Run number 23 and ant number 5. Run number 23 and ant number 6. Run number 23 and ant number 7. Run number 23 and ant number 8. Run number 23 and ant number 9. Run number 23 and ant number 10. Run number 23 and ant number 11. Run number 23 and ant number 12. Run number 23 and ant number 13. Run number 23 and ant number 14. Run number 23 and ant number 15. Run number 23 and ant number 16. Run number 23 and ant number 17. Run number 23 and ant number 18. Run number 23 and ant number 19. Run number 23 and ant number 20. Run number 24 and ant number 1. Run number 24 and ant number 2. Run number 24 and ant number 3. Run number 24 and ant number 4. Run number 24 and ant number 5. Run number 24 and ant number 6. Run number 24 and ant number 7. Run number 24 and ant number 8. Run number 24 and ant number 9. Run number 24 and ant number 10. Run number 24 and ant number 11. Run number 24 and ant number 12. Run number 24 and ant number 13. Run number 24 and ant number 14. Run number 24 and ant number 15. Run number 24 and ant number 16. Run number 24 and ant number 17. Run number 24 and ant number 18. Run number 24 and ant number 19. Run number 24 and ant number 20. Run number 25 and ant number 1. Run number 25 and ant number 2. Run number 25 and ant number 3. Run number 25 and ant number 4. Run number 25 and ant number 5. Run number 25 and ant number 6. Run number 25 and ant number 7. Run number 25 and ant number 8. Run number 25 and ant number 9. Run number 25 and ant number 10. Run number 25 and ant number 11. Run number 25 and ant number 12. Run number 25 and ant number 13. Run number 25 and ant number 14. Run number 25 and ant number 15. Run number 25 and ant number 16. Run number 25 and ant number 17. Run number 25 and ant number 18. Run number 25 and ant number 19. Run number 25 and ant number 20. Run number 26 and ant number 1. Run number 26 and ant number 2. Run number 26 and ant number 3. Run number 26 and ant number 4. Run number 26 and ant number 5. Run number 26 and ant number 6. Run number 26 and ant number 7. Run number 26 and ant number 8. Run number 26 and ant number 9. Run number 26 and ant number 10. Run number 26 and ant number 11. Run number 26 and ant number 12. Run number 26 and ant number 13. Run number 26 and ant number 14. Run number 26 and ant number 15. Run number 26 and ant number 16. Run number 26 and ant number 17. Run number 26 and ant number 18. Run number 26 and ant number 19. Run number 26 and ant number 20. Run number 27 and ant number 1. Run number 27 and ant number 2. Run number 27 and ant number 3. Run number 27 and ant number 4. Run number 27 and ant number 5. Run number 27 and ant number 6. Run number 27 and ant number 7. Run number 27 and ant number 8. Run number 27 and ant number 9. Run number 27 and ant number 10. Run number 27 and ant number 11. Run number 27 and ant number 12. Run number 27 and ant number 13. Run number 27 and ant number 14. Run number 27 and ant number 15. Run number 27 and ant number 16. Run number 27 and ant number 17. Run number 27 and ant number 18. Run number 27 and ant number 19. Run number 27 and ant number 20. Run number 28 and ant number 1. Run number 28 and ant number 2. Run number 28 and ant number 3. Run number 28 and ant number 4. Run number 28 and ant number 5. Run number 28 and ant number 6. Run number 28 and ant number 7. Run number 28 and ant number 8. Run number 28 and ant number 9. Run number 28 and ant number 10. Run number 28 and ant number 11. Run number 28 and ant number 12. Run number 28 and ant number 13. Run number 28 and ant number 14. Run number 28 and ant number 15. Run number 28 and ant number 16. Run number 28 and ant number 17. Run number 28 and ant number 18. Run number 28 and ant number 19. Run number 28 and ant number 20. [1] "Compiling results." +## Run number 1 and ant number 1. Run number 1 and ant number 2. Run number 1 and ant number 3. Run number 1 and ant number 4. Run number 1 and ant number 5. Run number 1 and ant number 6. Run number 1 and ant number 7. Run number 1 and ant number 8. Run number 1 and ant number 9. Run number 1 and ant number 10. Run number 1 and ant number 11. Run number 1 and ant number 12. Run number 1 and ant number 13. Run number 1 and ant number 14. Run number 1 and ant number 15. Run number 1 and ant number 16. Run number 1 and ant number 17. Run number 1 and ant number 18. Run number 1 and ant number 19. Run number 1 and ant number 20. Run number 2 and ant number 1. Run number 2 and ant number 2. Run number 2 and ant number 3. Run number 2 and ant number 4. Run number 2 and ant number 5. Run number 2 and ant number 6. Run number 2 and ant number 7. Run number 2 and ant number 8. Run number 2 and ant number 9. Run number 2 and ant number 10. Run number 2 and ant number 11. Run number 2 and ant number 12. Run number 2 and ant number 13. Run number 2 and ant number 14. Run number 2 and ant number 15. Run number 2 and ant number 16. Run number 2 and ant number 17. Run number 2 and ant number 18. Run number 2 and ant number 19. Run number 2 and ant number 20. Run number 3 and ant number 1. Run number 3 and ant number 2. Run number 3 and ant number 3. Run number 3 and ant number 4. Run number 3 and ant number 5. Run number 3 and ant number 6. Run number 3 and ant number 7. Run number 3 and ant number 8. Run number 3 and ant number 9. Run number 3 and ant number 10. Run number 3 and ant number 11. Run number 3 and ant number 12. Run number 3 and ant number 13. Run number 3 and ant number 14. Run number 3 and ant number 15. Run number 3 and ant number 16. Run number 3 and ant number 17. Run number 3 and ant number 18. Run number 3 and ant number 19. Run number 3 and ant number 20. Run number 4 and ant number 1. Run number 4 and ant number 2. Run number 4 and ant number 3. Run number 4 and ant number 4. Run number 4 and ant number 5. Run number 4 and ant number 6. Run number 4 and ant number 7. Run number 4 and ant number 8. Run number 4 and ant number 9. Run number 4 and ant number 10. Run number 4 and ant number 11. Run number 4 and ant number 12. Run number 4 and ant number 13. Run number 4 and ant number 14. Run number 4 and ant number 15. Run number 4 and ant number 16. Run number 4 and ant number 17. Run number 4 and ant number 18. Run number 4 and ant number 19. Run number 4 and ant number 20. Run number 5 and ant number 1. Run number 5 and ant number 2. Run number 5 and ant number 3. Run number 5 and ant number 4. Run number 5 and ant number 5. Run number 5 and ant number 6. Run number 5 and ant number 7. Run number 5 and ant number 8. Run number 5 and ant number 9. Run number 5 and ant number 10. Run number 5 and ant number 11. Run number 5 and ant number 12. Run number 5 and ant number 13. Run number 5 and ant number 14. Run number 5 and ant number 15. Run number 5 and ant number 16. Run number 5 and ant number 17. Run number 5 and ant number 18. Run number 5 and ant number 19. Run number 5 and ant number 20. Run number 6 and ant number 1. Run number 6 and ant number 2. Run number 6 and ant number 3. Run number 6 and ant number 4. Run number 6 and ant number 5. Run number 6 and ant number 6. Run number 6 and ant number 7. Run number 6 and ant number 8. Run number 6 and ant number 9. Run number 6 and ant number 10. Run number 6 and ant number 11. Run number 6 and ant number 12. Run number 6 and ant number 13. Run number 6 and ant number 14. Run number 6 and ant number 15. Run number 6 and ant number 16. Run number 6 and ant number 17. Run number 6 and ant number 18. Run number 6 and ant number 19. Run number 6 and ant number 20. Run number 7 and ant number 1. Run number 7 and ant number 2. Run number 7 and ant number 3. Run number 7 and ant number 4. Run number 7 and ant number 5. Run number 7 and ant number 6. Run number 7 and ant number 7. Run number 7 and ant number 8. Run number 7 and ant number 9. Run number 7 and ant number 10. Run number 7 and ant number 11. Run number 7 and ant number 12. Run number 7 and ant number 13. Run number 7 and ant number 14. Run number 7 and ant number 15. Run number 7 and ant number 16. Run number 7 and ant number 17. Run number 7 and ant number 18. Run number 7 and ant number 19. Run number 7 and ant number 20. Run number 8 and ant number 1. Run number 8 and ant number 2. Run number 8 and ant number 3. Run number 8 and ant number 4. Run number 8 and ant number 5. Run number 8 and ant number 6. Run number 8 and ant number 7. Run number 8 and ant number 8. Run number 8 and ant number 9. Run number 8 and ant number 10. Run number 8 and ant number 11. Run number 8 and ant number 12. Run number 8 and ant number 13. Run number 8 and ant number 14. Run number 8 and ant number 15. Run number 8 and ant number 16. Run number 8 and ant number 17. Run number 8 and ant number 18. Run number 8 and ant number 19. Run number 8 and ant number 20. Run number 9 and ant number 1. Run number 9 and ant number 2. Run number 9 and ant number 3. Run number 9 and ant number 4. Run number 9 and ant number 5. Run number 9 and ant number 6. Run number 9 and ant number 7. Run number 9 and ant number 8. Run number 9 and ant number 9. Run number 9 and ant number 10. Run number 9 and ant number 11. Run number 9 and ant number 12. Run number 9 and ant number 13. Run number 9 and ant number 14. Run number 9 and ant number 15. Run number 9 and ant number 16. Run number 9 and ant number 17. Run number 9 and ant number 18. Run number 9 and ant number 19. Run number 9 and ant number 20. Run number 10 and ant number 1. Run number 10 and ant number 2. Run number 10 and ant number 3. Run number 10 and ant number 4. Run number 10 and ant number 5. Run number 10 and ant number 6. Run number 10 and ant number 7. Run number 10 and ant number 8. Run number 10 and ant number 9. Run number 10 and ant number 10. Run number 10 and ant number 11. Run number 10 and ant number 12. Run number 10 and ant number 13. Run number 10 and ant number 14. Run number 10 and ant number 15. Run number 10 and ant number 16. Run number 10 and ant number 17. Run number 10 and ant number 18. Run number 10 and ant number 19. Run number 10 and ant number 20. Run number 11 and ant number 1. Run number 11 and ant number 2. Run number 11 and ant number 3. Run number 11 and ant number 4. Run number 11 and ant number 5. Run number 11 and ant number 6. Run number 11 and ant number 7. Run number 11 and ant number 8. Run number 11 and ant number 9. Run number 11 and ant number 10. Run number 11 and ant number 11. Run number 11 and ant number 12. Run number 11 and ant number 13. Run number 11 and ant number 14. Run number 11 and ant number 15. Run number 11 and ant number 16. Run number 11 and ant number 17. Run number 11 and ant number 18. Run number 11 and ant number 19. Run number 11 and ant number 20. Run number 12 and ant number 1. Run number 12 and ant number 2. Run number 12 and ant number 3. Run number 12 and ant number 4. Run number 12 and ant number 5. Run number 12 and ant number 6. Run number 12 and ant number 7. Run number 12 and ant number 8. Run number 12 and ant number 9. Run number 12 and ant number 10. Run number 12 and ant number 11. Run number 12 and ant number 12. Run number 12 and ant number 13. Run number 12 and ant number 14. Run number 12 and ant number 15. Run number 12 and ant number 16. Run number 12 and ant number 17. Run number 12 and ant number 18. Run number 12 and ant number 19. Run number 12 and ant number 20. Run number 13 and ant number 1. Run number 13 and ant number 2. Run number 13 and ant number 3. Run number 13 and ant number 4. Run number 13 and ant number 5. Run number 13 and ant number 6. Run number 13 and ant number 7. Run number 13 and ant number 8. Run number 13 and ant number 9. Run number 13 and ant number 10. Run number 13 and ant number 11. Run number 13 and ant number 12. Run number 13 and ant number 13. Run number 13 and ant number 14. Run number 13 and ant number 15. Run number 13 and ant number 16. Run number 13 and ant number 17. Run number 13 and ant number 18. Run number 13 and ant number 19. Run number 13 and ant number 20. Run number 14 and ant number 1. Run number 14 and ant number 2. Run number 14 and ant number 3. Run number 14 and ant number 4. Run number 14 and ant number 5. Run number 14 and ant number 6. Run number 14 and ant number 7. Run number 14 and ant number 8. Run number 14 and ant number 9. Run number 14 and ant number 10. Run number 14 and ant number 11. Run number 14 and ant number 12. Run number 14 and ant number 13. Run number 14 and ant number 14. Run number 14 and ant number 15. Run number 14 and ant number 16. Run number 14 and ant number 17. Run number 14 and ant number 18. Run number 14 and ant number 19. Run number 14 and ant number 20. Run number 15 and ant number 1. Run number 15 and ant number 2. Run number 15 and ant number 3. Run number 15 and ant number 4. Run number 15 and ant number 5. Run number 15 and ant number 6. Run number 15 and ant number 7. Run number 15 and ant number 8. Run number 15 and ant number 9. Run number 15 and ant number 10. Run number 15 and ant number 11. Run number 15 and ant number 12. Run number 15 and ant number 13. Run number 15 and ant number 14. Run number 15 and ant number 15. Run number 15 and ant number 16. Run number 15 and ant number 17. Run number 15 and ant number 18. Run number 15 and ant number 19. Run number 15 and ant number 20. Run number 16 and ant number 1. Run number 16 and ant number 2. Run number 16 and ant number 3. Run number 16 and ant number 4. Run number 16 and ant number 5. Run number 16 and ant number 6. Run number 16 and ant number 7. Run number 16 and ant number 8. Run number 16 and ant number 9. Run number 16 and ant number 10. Run number 16 and ant number 11. Run number 16 and ant number 12. Run number 16 and ant number 13. Run number 16 and ant number 14. Run number 16 and ant number 15. Run number 16 and ant number 16. Run number 16 and ant number 17. Run number 16 and ant number 18. Run number 16 and ant number 19. Run number 16 and ant number 20. [1] "Compiling results." summary(result_ACO) ## Algorithm: Ant Colony Optimization -## Total Run Time: 55.258 secs +## Total Run Time: 29.726 secs ## -## lavaan 0.6-20 ended normally after 52 iterations +## lavaan 0.6-20 ended normally after 53 iterations ## ## Estimator ML ## Optimization method NLMINB @@ -108,26 +108,16 @@ summary(result_ACO) ## ## Model Test User Model: ## -## Test statistic 109.392 +## Test statistic 135.544 ## Degrees of freedom 104 -## P-value (Chi-square) 0.340 +## P-value (Chi-square) 0.020 ## ## ## Final Model Syntax: -## -## Ability =~ Item12 + Item54 + Item45 + Item37 + Item55 + Item39 + Item42 + Item26 -## + Item19 + Item50 + Item2 + Item44 + Item10 + Item15 + Item17 +## Ability =~ Item16 + Item19 + Item26 + Item28 + Item31 + Item32 + Item39 + Item44 +## + Item49 + Item50 + Item53 + Item54 + Item55 + Item56 + Item8 ## Outcome ~ Ability plot(result_ACO) -## Warning: `aes_string()` was deprecated in ggplot2 3.0.0. -## ℹ Please use tidy evaluation idioms with `aes()`. -## ℹ See also `vignette("ggplot2-in-packages")` for more information. -## ℹ The deprecated feature was likely used in the ShortForm package. -## Please report the issue at -## . -## This warning is displayed once every 8 hours. -## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was -## generated. ## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0. ## ℹ Please use `linewidth` instead. ## ℹ The deprecated feature was likely used in the ShortForm package. @@ -180,9 +170,9 @@ result_SA <- simulatedAnnealing( summary(result_SA) ## Algorithm: Simulated Annealing -## Total Run Time: 20.331 secs +## Total Run Time: 19.071 secs ## -## lavaan 0.6-20 ended normally after 34 iterations +## lavaan 0.6-20 ended normally after 32 iterations ## ## Estimator ML ## Optimization method NLMINB @@ -192,17 +182,17 @@ summary(result_SA) ## ## Model Test User Model: ## -## Test statistic 762.752 +## Test statistic 766.219 ## Degrees of freedom 740 -## P-value (Chi-square) 0.273 +## P-value (Chi-square) 0.245 ## ## ## Final Model Syntax: -## Ability =~ Item33 + Item5 + Item19 + Item39 + Item42 + Item10 + Item38 + Item20 -## + Item46 + Item18 + Item36 + Item55 + Item31 + Item4 + Item35 + Item49 + -## Item40 + Item44 + Item28 + Item24 + Item22 + Item2 + Item32 + Item1 + Item16 + -## Item27 + Item51 + Item21 + Item13 + Item6 + Item8 + Item41 + Item43 + Item45 + -## Item23 + Item25 + Item7 + Item52 + Item11 + Item53 +## Ability =~ Item10 + Item43 + Item35 + Item31 + Item42 + Item49 + Item48 + Item30 +## + Item32 + Item18 + Item1 + Item34 + Item45 + Item50 + Item17 + Item54 + +## Item2 + Item33 + Item24 + Item7 + Item28 + Item46 + Item39 + Item13 + Item19 + +## Item38 + Item51 + Item21 + Item25 + Item56 + Item8 + Item29 + Item40 + Item26 +## + Item55 + Item47 + Item5 + Item52 + Item27 + Item9 plot(result_SA) ``` @@ -223,7 +213,7 @@ result_TS <- tabuShortForm( ## Running iteration 1 of 1. summary(result_TS) ## Algorithm: Tabu Search -## Total Run Time: 2.598 secs +## Total Run Time: 2.179 secs ## ## lavaan 0.6-20 ended normally after 29 iterations ## @@ -250,11 +240,11 @@ summary(result_TS) ``` mermaid flowchart LR A@{ shape: lean-r, label: "Full Item Bank" } --> B[Specify Model] - B --> C[Run Optimization Algorithm(s)] + B --> C[Run Optimization Algorithm] C --> D[Evaluate Candidate Forms] D --> |One or More Forms Fit| E@{ shape: diamond, label: "Select Short Form" } D --> |No Adequate Forms Found| C - E --> F@{ shape: lean-l, label: "Reporting & Visualization" }] + E --> F@{ shape: lean-l, label: "Reporting & Visualization" } ``` @@ -264,7 +254,7 @@ ShortForm produces diagnostic outputs such as: - Objective function convergence plots - Algorithm-specific diagnostics -- Summary statistic s for selected item sets +- Summary statistics for selected item sets ------------------------------------------------------------------------ @@ -304,9 +294,11 @@ Parallelization is supported for certain workflows. ## Reproducibility -ShortForm is designed for reproducible analytical workflows: - Fully -scriptable - Compatible with R Markdown and Quarto - Supports -integration into larger modeling pipelines +ShortForm is designed for reproducible analytical workflows: + +- Fully scriptable +- Compatible with R Markdown and Quarto +- Supports integration into larger modeling pipelines ------------------------------------------------------------------------