|
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