|
1 | | -using BenchmarkTools, DataFrames, MixedModels, RData, Tables |
| 1 | +using BenchmarkTools, MixedModels, StatsModels |
| 2 | +using MixedModels: dataset |
2 | 3 |
|
3 | 4 | const SUITE = BenchmarkGroup() |
4 | 5 |
|
5 | | -const dat = Dict(Symbol(k) => v for (k, v) in load(joinpath( |
6 | | - dirname(pathof(MixedModels)), |
7 | | - "..", |
8 | | - "test", |
9 | | - "dat.rda", |
10 | | -))); |
11 | | - |
12 | | -categorical!(dat[:ml1m], [:G,:H]); # forgot to convert these grouping factors |
13 | | - |
14 | | -const mods = Dict{Symbol,Vector{Expr}}( |
15 | | - :Alfalfa => [:(1 + A * B + (1 | G)), :(1 + A + B + (1 | G))], |
16 | | - :Animal => [:(1 + (1 | G) + (1 | H))], |
17 | | - :Arabidopsis => [], # glmm and rename variables |
18 | | - :Assay => [:(1+A+B*C+(1|G)+(1|H))], |
19 | | - :AvgDailyGain => [:(1 + A * U + (1 | G)), :(1 + A + U + (1 | G))], |
20 | | - :BIB => [:(1 + A * U + (1 | G)), :(1 + A + U + (1 | G))], |
21 | | - :Bond => [:(1 + A + (1 | G))], |
22 | | - :Chem97 => [:(1 + (1 | G) + (1 | H)), :(1 + U + (1 | G) + (1 | H))], |
23 | | - :Contraception => [], # glmm and rename variables |
24 | | - :Cultivation => [:(1 + A * B + (1 | G)), :(1 + A + B + (1 | G)), :(1 + A + (1 | G))], |
25 | | - :Demand => [:(1 + U + V + W + X + (1 | G) + (1 | H))], |
26 | | - :Dyestuff => [:(1 + (1 | G))], |
27 | | - :Dyestuff2 => [:(1 + (1 | G))], |
28 | | - :Early => [:(1 + U + U & A + (1 + U | G))], |
29 | | - :Exam => [:(1 + A * U + B + (1 | G)), :(1 + A + B + U + (1 | G))], |
30 | | - :Gasoline => [:(1 + U + (1 | G))], |
31 | | - :Gcsemv => [:(1 + A + (1 | G))], # variables must be renamed |
32 | | - :Genetics => [:(1 + A + (1 | G) + (1 | H))], |
33 | | - :HR => [:(1 + A * U + V + (1 + U | G))], |
34 | | - :Hsb82 => [:(1 + A + B + C + U + (1 | G))], |
35 | | - :IncBlk => [:(1 + A + U + + W + Z + (1 | G))], |
36 | | - :InstEval => [:(1 + A + (1 | G) + (1 | H) + (1 | I)), :(1 + A * I + (1 | G) + (1 | H))], |
37 | | - :KKL => [], # variables must be renamed |
38 | | - :KWDYZ => [], # variables must be renamed |
39 | | - :Mississippi => [:(1 + A + (1 | G))], |
40 | | - :Mmmec => [], # glmm (and offset) and variables renamed |
41 | | - :Multilocation => [:(1 + A + (0 + A | G) + (1 | H))], |
42 | | - :Oxboys => [:(1 + U + (1 + U | G))], |
43 | | - :PBIB => [:(1 + A + (1 | G))], |
44 | | - :Pastes => [:(1 + (1 | G) + (1 | H))], |
45 | | - :Penicillin => [:(1 + (1 | G) + (1 | H))], |
46 | | - :Pixel => [:(1 + U + V + (1 + U | G) + (1 | H))], # variables must be renamed |
47 | | - :Poems => [:(1 + U + V + W + (1 | G) + (1 | H) + (1 | I))], |
48 | | - :Rail => [:(1 + (1 | G))], |
49 | | - :SIMS => [:(1 + U + (1 + U | G))], |
50 | | - :ScotsSec => [:(1 + A + U + V + (1 | G) + (1 | H))], |
51 | | - :Semi2 => [:(1 + A + (1 | G) + (1 | H))], |
52 | | - :Semiconductor => [:(1 + A * B + (1 | G))], |
53 | | - :Socatt => [], # variables must be renamed - binomial glmm? |
54 | | - :TeachingII => [:(1 + A + T + U + V + W + X + Z + (1 | G))], |
55 | | - :VerbAgg => [:(1 + A + B + C + U + (1 | G) + (1 | H))], # Bernoulli glmm and rename variables |
56 | | - :Weights => [:(1 + A * U + (1 + U | G))], |
57 | | - :WWheat => [:(1 + U + (1 + U | G))], |
58 | | - :bdf => [], # rename variables and look up model |
59 | | - :bs10 => [:(1 + U + V + W + ((1 + U + V + W) | G) + ((1 + U + V + W) | H))], |
60 | | - :cake => [:(1 + A * B + (1 | G))], |
61 | | - :cbpp => [:(1 + A + (1 | G))], # Binomial glmm, create and rename variables |
| 6 | +const global contrasts = Dict( |
| 7 | + :mrk17_exp1 => merge(Dict(n => HelmertCoding() for n in (:F, :P, :Q, :lQ, :lT)), |
| 8 | + Dict(n => Grouping() for n in (:item, :subj))), |
| 9 | +) |
| 10 | +const global fms = Dict( |
| 11 | + :dyestuff => [ |
| 12 | + @formula(yield ~ 1 + (1|batch)), |
| 13 | + ], |
| 14 | + :dyestuff2 => [ |
| 15 | + @formula(yield ~ 1 + (1|batch)), |
| 16 | + ], |
62 | 17 | :d3 => [ |
63 | | - :(1 + U + (1 | G) + (1 | H) + (1 | I)), |
64 | | - :(1 + U + (1 + U | G) + (1 + U | H) + (1 + U | I)), |
65 | | - ], |
66 | | - :dialectNL => [:(1 + A + T + U + V + W + X + (1 | G) + (1 | H) + (1 | I))], |
67 | | - :egsingle => [:(1 + A + U + V + (1 | G) + (1 | H))], |
68 | | - :epilepsy => [], # unknown origin |
69 | | - :ergoStool => [:(1 + A + (1 | G))], |
70 | | - :gb12 => [:(1 + S + T + U + V + W + X + Z + ((1 + S + U + W) | G) + |
71 | | - ((1 + S + T + V) | H))], |
72 | | - :grouseticks => [], # rename variables, glmm needs formula |
73 | | - :guImmun => [], # rename variables, glmm needs formula |
74 | | - :guPrenat => [], # rename variables, glmm needs formula |
| 18 | + @formula(y ~ 1 + u + (1+u|g) + (1+u|h) + (1+u|i)), |
| 19 | + ], |
| 20 | + :insteval => [ |
| 21 | + @formula(y ~ 1 + service + (1|s) + (1|d) + (1|dept)), |
| 22 | + @formula(y ~ 1 + service*dept + (1|s) + (1|d)), |
| 23 | + ], |
75 | 24 | :kb07 => [ |
76 | | - :(1 + S + T + U + V + W + X + Z + ((1 + S + T + U + V + W + X + Z) | G) + |
77 | | - ((1 + S + T + U + V + W + X + Z) | H)), |
78 | | - :(1 + S + T + U + V + W + X + Z + |
79 | | - zerocorr((1 + S + T + U + V + W + X + Z) | G) + |
80 | | - zerocorr((1 + S + T + U + V + W + X + Z) | H)), |
81 | | - ], |
82 | | - :ml1m => [:(1 + (1 | G) + (1 | H))], |
83 | | - :paulsim => [:(1 + S + T + U + (1 | H) + (1 | G))], # names of H and G should be reversed |
84 | | - :sleepstudy => [:(1 + U + (1 + U | G)), :(1 + U + zerocorr(1 + U | G))], |
85 | | - :s3bbx => [], # probably drop this one |
86 | | - :star => [], # not sure it is worthwhile working with these data |
87 | | -); |
| 25 | + @formula(rt_trunc ~ 1+spkr+prec+load+(1|subj)+(1|item)), |
| 26 | + @formula(rt_trunc ~ 1+spkr*prec*load+(1|subj)+(1+prec|item)), |
| 27 | + @formula(rt_trunc ~ 1+spkr*prec*load+(1+spkr+prec+load|subj)+(1+spkr+prec+load|item)), |
| 28 | + ], |
| 29 | + :machines => [ |
| 30 | + @formula(score ~ 1 + (1|Worker) + (1|Machine)), |
| 31 | + ], |
| 32 | + :ml1m => [ |
| 33 | + @formula(y ~ 1 + (1|g) + (1|h)), |
| 34 | + ], |
| 35 | + :mrk17_exp1 => [ |
| 36 | + @formula(1000/rt ~ 1+F*P*Q*lQ*lT + (1|item) + (1|subj)), |
| 37 | + @formula(1000/rt ~ 1+F*P*Q*lQ*lT + (1+P+Q+lQ+lT|item) + (1+F+P+Q+lQ+lT|subj)), |
| 38 | + ], |
| 39 | + :pastes => [ |
| 40 | + @formula(strength ~ 1 + (1|batch&cask)), |
| 41 | + @formula(strength ~ 1 + (1|batch/cask)), |
| 42 | + ], |
| 43 | + :penicillin => [ |
| 44 | + @formula(diameter ~ 1 + (1|plate) + (1|sample)), |
| 45 | + ], |
| 46 | + :sleepstudy => [ |
| 47 | + @formula(reaction ~ 1 + days + (1|subj)), |
| 48 | + @formula(reaction ~ 1 + days + zerocorr(1+days|subj)), |
| 49 | + @formula(reaction ~ 1 + days + (1|subj) + (0+days|subj)), |
| 50 | + @formula(reaction ~ 1 + days + (1+days|subj)), |
| 51 | + ], |
| 52 | +) |
88 | 53 |
|
89 | | -fitbobyqa(rhs::Expr, dsname::Symbol) = |
90 | | - fit(MixedModel, @eval(@formula(Y ~ $rhs)), dat[dsname]) |
91 | | -compactstr(ds, rhs) = replace(string(ds, ':', rhs), ' ' => "") |
| 54 | +function fitbobyqa(dsname::Symbol, index::Integer) |
| 55 | + fit( |
| 56 | + MixedModel, |
| 57 | + fms[dsname][index], |
| 58 | + dataset(dsname), |
| 59 | + contrasts=get!(contrasts, dsname, Dict{Symbol,StatsModels.AbstractContrasts}()), |
| 60 | + ) |
| 61 | +end |
92 | 62 |
|
93 | 63 | SUITE["simplescalar"] = BenchmarkGroup(["single", "simple", "scalar"]) |
94 | | -for ds in [ |
95 | | - :Alfalfa, |
96 | | - :AvgDailyGain, |
97 | | - :BIB, |
98 | | - :Bond, |
99 | | - :cake, |
100 | | - :Cultivation, |
101 | | - :Dyestuff, |
102 | | - :Dyestuff2, |
103 | | - :ergoStool, |
104 | | - :Exam, |
105 | | - :Gasoline, |
106 | | - :Hsb82, |
107 | | - :IncBlk, |
108 | | - :Mississippi, |
109 | | - :PBIB, |
110 | | - :Rail, |
111 | | - :Semiconductor, |
112 | | - :TeachingII, |
| 64 | +for (ds, i) in [ |
| 65 | + (:dyestuff, 1,), |
| 66 | + (:dyestuff2, 1,), |
| 67 | + (:pastes, 1), |
| 68 | + (:sleepstudy, 1,), |
113 | 69 | ] |
114 | | - for rhs in mods[ds] |
115 | | - SUITE["simplescalar"][compactstr(ds, rhs)] = @benchmarkable fitbobyqa( |
116 | | - $(QuoteNode(rhs)), |
117 | | - $(QuoteNode(ds)), |
118 | | - ) |
119 | | - end |
| 70 | + SUITE["simplescalar"][string(ds, ':', i)] = @benchmarkable fitbobyqa($(QuoteNode(ds)), $(QuoteNode(i))) |
120 | 71 | end |
121 | 72 |
|
122 | 73 | SUITE["singlevector"] = BenchmarkGroup(["single", "vector"]) |
123 | | -for ds in [:Early, :HR, :Oxboys, :SIMS, :sleepstudy, :Weights, :WWheat] |
124 | | - for rhs in mods[ds] |
125 | | - SUITE["singlevector"][compactstr(ds, rhs)] = @benchmarkable fitbobyqa( |
126 | | - $(QuoteNode(rhs)), |
127 | | - $(QuoteNode(ds)), |
128 | | - ) |
129 | | - end |
| 74 | +for (ds, i) in [ |
| 75 | + (:sleepstudy, 2,), |
| 76 | + (:sleepstudy, 3,), |
| 77 | + (:sleepstudy, 4,), |
| 78 | +] |
| 79 | + SUITE["singlevector"][string(ds, ':', i)] = @benchmarkable fitbobyqa($(QuoteNode(ds)), $(QuoteNode(i))) |
130 | 80 | end |
131 | 81 |
|
132 | 82 | SUITE["nested"] = BenchmarkGroup(["multiple", "nested", "scalar"]) |
133 | | -for ds in [:Animal, :Chem97, :Genetics, :Pastes, :Semi2] |
134 | | - for rhs in mods[ds] |
135 | | - SUITE["nested"][compactstr(ds, rhs)] = @benchmarkable fitbobyqa( |
136 | | - $(QuoteNode(rhs)), |
137 | | - $(QuoteNode(ds)), |
138 | | - ) |
139 | | - end |
| 83 | +for (ds, i) in [ |
| 84 | + (:pastes, 2,), |
| 85 | +] |
| 86 | + SUITE["nested"][string(ds, ':', i)] = @benchmarkable fitbobyqa($(QuoteNode(ds)), $(QuoteNode(i))) |
140 | 87 | end |
141 | 88 |
|
142 | 89 | SUITE["crossed"] = BenchmarkGroup(["multiple", "crossed", "scalar"]) |
143 | | - |
144 | | -for ds in [ |
145 | | - :Assay, |
146 | | - :Demand, |
147 | | - :InstEval, |
148 | | - :Penicillin, |
149 | | - :ScotsSec, |
150 | | - :dialectNL, |
151 | | - :egsingle, |
152 | | - :ml1m, |
153 | | - :paulsim, |
| 90 | +for (ds, i) in [ |
| 91 | + (:insteval, 1), |
| 92 | + (:insteval, 2), |
| 93 | + (:kb07, 1), |
| 94 | + (:machines, 1), |
| 95 | + (:ml1m, 1), |
| 96 | + (:mrk17_exp1, 1), |
| 97 | + (:penicillin, 1), |
154 | 98 | ] |
155 | | - for rhs in mods[ds] |
156 | | - SUITE["crossed"][compactstr(ds, rhs)] = @benchmarkable fitbobyqa( |
157 | | - $(QuoteNode(rhs)), |
158 | | - $(QuoteNode(ds)), |
159 | | - ) |
160 | | - end |
| 99 | + SUITE["crossed"][string(ds, ':', i)] = @benchmarkable fitbobyqa($(QuoteNode(ds)), $(QuoteNode(i))) |
161 | 100 | end |
162 | 101 |
|
163 | 102 | SUITE["crossedvector"] = BenchmarkGroup(["multiple", "crossed", "vector"]) |
164 | | -for ds in [:bs10, :d3, :gb12, :kb07] |
165 | | - for rhs in mods[ds] |
166 | | - SUITE["crossedvector"][compactstr(ds, rhs)] = @benchmarkable fitbobyqa( |
167 | | - $(QuoteNode(rhs)), |
168 | | - $(QuoteNode(ds)), |
169 | | - ) |
170 | | - end |
| 103 | +for (ds, i) in [ |
| 104 | + (:d3, 1), |
| 105 | + (:kb07, 2), |
| 106 | + (:kb07, 3), |
| 107 | + (:mrk17_exp1, 2), |
| 108 | +] |
| 109 | + SUITE["crossedvector"][string(ds, ':', i)] = @benchmarkable fitbobyqa($(QuoteNode(ds)), $(QuoteNode(i))) |
171 | 110 | end |
0 commit comments