/
NEWS
1802 lines (1246 loc) · 75.8 KB
/
NEWS
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
Changes in Version 2.5-69 (2020-12-22)
=====================================
o the metafor package now makes use of the 'mathjaxr' package to nicely
render equations shown in the HTML help pages
o added selmodel() for fitting a wide variety of selection models (and
added the corresponding plot.rma.uni.selmodel() function for drawing the
estimated selection function)
o added tes() function for the test of excess significance
o added rcalc(), matreg(), dfround(), and vec2mat() functions
o added aggregate.escalc() function to aggregate multiple effect sizes or
outcomes within studies/clusters
o the various cumul() functions provide I^2 and H^2 also for fixed-effects
models; accordingly, plot.cumul.rma() now also works with such models
o simulate.rma() gains 'yilim' argument
o added 'weighted' argument to fsn() (for Orwin's method)
o added some more transformation functions
o bldiag() now properly handles ?x0 or 0x? matrices
o p-values are still given to 2 digits when 'digits = 1'
o summary.escalc() also provides the p-values (of the Wald-type tests); but
when using the 'transf' argument, the sampling variances, standard
errors, test statistics, and p-values are no longer shown
o rma.uni() no longer constrains a fixed tau2 value to 0 when k=1
o started using the 'pbapply' package for showing progress bars, also when
using parallel processing
o to avoid potential confusion, all references to 'credibility intervals'
have been removed from the documentation; these intervals are now
exclusively referred to as 'prediction intervals'; in the output, the
bounds are therefore indicated now as 'pi.lb' and 'pi.ub' (instead of
'cr.lb' and 'cr.ub'); the corresponding argument names were changed in
addpoly.default(); argument 'addcred' was changed to 'addpred' in
addpoly.rma() and forest.rma(); however, code using the old arguments
names should continue to work
o vif() gains 'btt' argument and can now also compute generalized variance
inflation factors; a proper print.vif.rma() function was added
o in the various forest() functions, the right header is now suppressed
when 'annotate=FALSE' and 'header=TRUE'
o the 'forest' and 'funnel' arguments of reporter.rma.uni() can now also be
logicals to suppress the drawing of these plots
o one can now use weights(..., type="rowsum") for intercept-only 'rma.mv'
models (to obtain 'row-sum weights')
o forest.rma() gains 'colout' argument (to adjust the color of the observed
effect sizes or outcomes)
o slight speedup in functions that repeatedly fit rma.uni() models by
skipping the computation of the pseudo R^2 statistic
o funnel.default() and funnel.rma() gain 'label' and 'offset' arguments
o funnel.default() and funnel.rma() gain 'lty' argument; the reference line
is now drawn by default as a dotted line (like the line for the pseudo
confidence region)
o regtest() now shows the 'limit estimate' of the (average) true effect
when using 'sei', 'vi', 'ninv', or 'sqrtninv' as predictor (and the model
does not contain any other moderators)
o show nicer network graphs for dat.hasselblad1998 and dat.senn2013 in the
help files
o refactored various functions (for cleaner/simpler code)
o added 14 new datasets (dat.anand1999, dat.assink2016, dat.baskerville2012,
dat.cannon2006, dat.cohen1981, dat.craft2003, dat.damico2009,
dat.dorn2007, dat.hahn2001, dat.kalaian1996, dat.kearon1998, dat.lau1992,
dat.vanhowe1999, dat.viechtbauer2021)
o fixed 'level' not getting passed down to the various cumul() functions
o improved the documentation a bit
Changes in Version 2.4-0 (2020-03-19)
=====================================
o version jump to 2.4-0 for CRAN release (from now on, even minor numbers
for CRAN releases, odd numbers for development versions)
o the various forest() functions gain 'header' argument
o escalc() gains 'include' argument
o setting 'verbose=3' in model fitting functions sets 'options(warn=1)'
o forest.rma() and forest.default() now throw informative errors when
misusing 'order' and 'subset' arguments
o plot.profile.rma() now always includes the actual value of the variance
or correlation component as an additional point in the plot
o fixed failing tests due to the 'stringsAsFactors=FALSE' change in the
upcoming version of R
o print.infl.rma.uni() gains 'infonly' argument, to only show the
influential studies
o removed 'MASS' from 'Suggests' (no longer needed)
o argument 'btt' can now also take a string to grep for
o added 'optimParallel' as possible optimizer in rma.mv()
o added (for now undocumented) option to fit models in rma.glmm() via the
'GLMMadaptive' package (instead of 'lme4'); to try this, use:
'control=list(package="GLMMadaptive")'
o started to use numbering scheme for devel version (the number after the
dash indicates the devel version)
o added contrmat() function (for creating a matrix that indicates which
groups have been compared against each other in each row of a dataset)
o added to.wide() function (for restructuring long format datasets into the
wide format needed for contrast-based analyses)
o I^2 and H^2 are also shown in output for fixed-effects models
o argument 'grid' in baujat() can now also be a color name
o added (for now undocumented) 'time' argument to more functions that are
computationally expensive
o added (for now undocumented) 'textpos' argument to the various forest
functions
o added a new dataset (dat.graves2010)
o added more tests
Changes in Version 2.1-0 (2019-05-13)
=====================================
o added formula() method for objects of class 'rma'
o llplot() now also allows for measure="GEN"; also, the documentation and
y-axis label have been corrected to indicate that the function plots
likelihoods (not log likelihoods)
o confint.rma.mv() now returns an object of class 'list.confint.rma' when
obtaining CIs for all variance and correlation components of the model;
added corresponding print.list.confint.rma() function
o moved 'tol' argument in permutest() to 'control' and renamed the argument
to 'comptol'
o added 'PMM' and 'GENQM' estimators in rma.uni()
o added vif() function to get variance inflation factors
o added .glmulti object for making the interaction with glmulti easier
o added reporter() and reporter.rma.uni() for dynamically generating
analysis reports for objects of class 'rma.uni'
o output is now styled/colored when 'crayon' package is loaded (this only
works on a 'proper' terminal with color support; also works in RStudio)
o overhauled plot.gosh.rma(); when 'out' is specified, it now shows two
distributions, one for the values when the outlier is included and one
for the values when for outlier is excluded; dropped the 'hcol' argument
and added 'border' argument
o refactored influence.rma.uni() to be more consistent internally with
other functions; print.infl.rma.uni() and plot.infl.rma.uni() adjusted
accordingly; functions cooks.distance.rma.uni(), dfbetas.rma.uni(), and
rstudent.rma.uni() now call influence.rma.uni() for the computations
o rstudent.rma.uni() now computes the SE of the deleted residuals in such a
way that it will yield identical results to a mean shift outlier model
even when that model is fitted with test="knha"
o rstandard.rma.uni() gains 'type' argument, and can now also compute
conditional residuals (it still computes marginal residuals by default)
o cooks.distance.rma.mv() gains 'cluster' argument, so that the Cook's
distances can be computed for groups of estimates
o cooks.distance.rma.mv() gains 'parallel', 'ncpus', and 'cl' arguments and
can now make use of parallel processing
o cooks.distance.rma.mv() should be faster by using the estimates from the
full model as starting values when fitting the models with the ith
study/cluster deleted from the dataset
o cooks.distance.rma.mv() gains 'reestimate' argument; when set to FALSE,
variance/correlation components are not reestimated
o rstandard.rma.mv() gains 'cluster' argument for computing cluster-level
multivariate standardized residuals
o added rstudent.rma.mv() and dfbetas.rma.mv()
o smarter matching of elements in 'newmods' (when using a named vector) in
predict() that also works for models with interactions (thanks to Nicole
Erler for pointing out the problem)
o rma.uni() and rma.mv() no longer issue (obvious) warnings when user
constrains vi or V to 0 (i.e., vi=0 or V=0, respectively)
o rma.mv() does more intelligent filtering based on NAs in V matrix
o rma.mv() now ensures strict symmetry of any (var-cov or correlation)
matrices specified via the 'R' argument
o fixed rma.mv() so checks on 'R' argument run as intended; also fixed an
issue when multiple formulas with slashes are specified via 'random'
(thanks to Andrew Loignon for pointing out the problem)
o suppressed showing calls on some warnings/errors in rma.mv()
o rma.mv() now allows for a continuous-time autoregressive random effects
structure (struct="CAR") and various spatial correlation structures
(struct="SPEXP", "SPGAU", "SPLIN", "SPRAT", and "SPSPH")
o rma.mv() now allows for struct="GEN" which models correlated random
effects for any number of predictors, including continuous ones (i.e.,
this allows for 'random slopes')
o in the various forest() functions, when options(na.action="na.pass") or
options(na.action="na.exclude") and an annotation contains NA, this is
now shown as a blank (instead of NA [NA, NA])
o the various forest() and addpoly() functions gain a 'fonts' argument
o the various forest() functions gain a 'top' argument
o the various forest() functions now show correct point sizes when the
weights of the studies are exactly the same
o forest.cumul.rma() gains a 'col' argument
o funnel.default() and funnel.rma() can now take vectors as input for the
'col' and 'bg' arguments (and also for 'pch'); both functions also gain a
'legend' argument
o addpoly() functions can now also show prediction interval bounds
o removed 'formula interface' from escalc(); until this actually adds some
kind of extra functionality, this just makes escalc() more confusing to
use
o escalc() can now compute the coefficient of variation ratio and the
variability ratio for pre-post or matched designs ("CVRC", "VRC")
o escalc() does a bit more housekeeping
o added (currently undocumented) arguments 'onlyo1', 'addyi', and 'addvi'
to escalc() that allow for more flexibility when computing certain bias
corrections and when computing sampling variances for measures that make
use of the 'add' and 'to' arguments
o escalc() now sets 'add=0' for measures where the use of such a bias
correction makes little sense; this applies to the following measures:
"AS", "PHI", "RTET", "IRSD", "PAS", "PFT", "IRS", and "IRFT"; one can
still force the use of the bias correction by explicitly setting the
'add' argument to some non-zero value
o added 'clim' argument to summary.escalc()
o added 'ilim' argument to trimfill()
o labbe() gains 'lty' argument
o labbe() now (invisibly) returns a data frame with the coordinates of the
points that were drawn (which may be useful for manual labeling of points
in the plot)
o added a print method for 'profile.rma' objects
o profile.rma.mv() now check whether any of the profiled log-likelihood
values is larger than the log-likelihood of the fitted model (using
numerical tolerance given by 'lltol') and issues a warning if so
o profile.rma.uni(), profile.rma.mv(), and plot.profile.rma() gain 'cline'
argument; plot.profile.rma() gains 'xlim', 'ylab', and 'main' arguments
o fixed an issue with robust.rma.mv() when the model was fitted with
sparse=TRUE (thanks to Roger Martineau for noting the problem)
o various method functions (fitted(), resid(), predict(), etc.) behave in a
more consistent manner when model omitted studies with missings
o predict.rma() gains 'vcov' argument; when set to TRUE, the variance-
covariance matrix of the predicted values is also returned
o vcov.rma() can now also return the variance-covariance matrix of the
fitted values (type="fitted") and the residuals (type="resid")
o added `$<-` and as.matrix() methods for 'list.rma' objects
o fixed error in simulate.rma() that would generate too many samples for
'rma.mv' models
o added undocumented argument 'time' to all model fitting functions; if set
to TRUE, the model fitting time is printed
o added more tests (also for parallel operations); also, all tests updated
to use proper tolerances instead of rounding
o reorganized the documentation a bit
Changes in Version 2.0-0 (2017-06-22)
=====================================
o added simulate() method for 'rma' objects; added MASS to 'Suggests'
(since simulating for 'rma.mv' objects requires mvrnorm() from MASS)
o cooks.distance.rma.mv() now works properly even when there are missing
values in the data
o residuals() gains 'type' argument and can compute Pearson residuals
o the 'newmods' argument in predict() can now be a named vector or a
matrix/data frame with column names that get properly matched up with the
variables in the model
o added ranef.rma.mv() for extracting the BLUPs of the random effects for
'rma.mv' models
o all functions that repeatedly refit models now have the option to show a
progress bar
o added ranktest.default(), so user can now pass the outcomes and
corresponding sampling variances directly to the function
o added regtest.default(), so user can now pass the outcomes and
corresponding sampling variances directly to the function
o funnel.default() gains 'subset' argument
o funnel.default() and funnel.rma() gain 'col' and 'bg' arguments
o plot.profile.rma() gains 'ylab' argument
o more consistent handling of 'robust.rma' objects
o added location-scale model
o added a print method for 'rma.gosh' objects
o the (log) relative risk is now called the (log) risk ratio in all help
files, plots, code, and comments
o escalc() can now compute outcome measures based on paired binary data
("MPRR", "MPOR", "MPRD", "MPORC", and "MPPETO")
o escalc() can now compute (semi-)partial correlation coefficients ("PCOR",
"ZPCOR", "SPCOR")
o escalc() can now compute measures of variability for single groups
("CVLN", "SDLN") and for the difference in variability between two groups
("CVR", "VR"); also the log transformed mean ("MNLN") has been added for
consistency
o escalc() can now compute the sampling variance for measure="PHI" for
studies using stratified sampling (vtpye="ST")
o the `[` method for 'escalc' objects now properly handles the 'ni' and
'slab' attributes and does a better job of cleaning out superfluous
variable name information
o added rbind() method for 'escalc' objects
o added as.data.frame() method for 'list.rma' objects
o added a new dataset (dat.pagliaro1992) for another illustration of a
network meta-analysis
o added a new dataset (dat.laopaiboon2015) on the effectiveness of
azithromycin for treating lower respiratory tract infections
o rma.uni() and rma.mv() now check if the ratio of the largest to smallest
sampling variance is very large; results may not be stable then (and very
large ratios typically indicate wrongly coded data)
o model fitting functions now check if extra/superfluous arguments are
specified via ... and issues are warning if so
o instead of defining own generic ranef(), import ranef() from 'nlme'
o improved output formatting
o added more tests (but disabled a few tests on CRAN to avoid some issues
when R is compiled with --disable-long-double)
o some general code cleanup
o renamed diagram_metafor.pdf vignette to just diagram.pdf
o minor updates in the documentation
Changes in Version 1.9-9 (2016-09-25)
=====================================
o started to use git as version control system, GitHub to host the
repository (https://github.com/wviechtb/metafor) for the development
version of the package, Travis CI as continuous integration service
(https://travis-ci.org/wviechtb/metafor), and Codecov for automated code
coverage reporting (https://codecov.io/github/wviechtb/metafor)
o argument 'knha' in rma.uni() and argument 'tdist' in rma.glmm() and
rma.mv() are now superseded by argument 'test' in all three functions;
for backwards compatibility, the 'knha' and 'tdist' arguments still work,
but are no longer documented
o rma(yi, vi, weights=1, test="knha") now yields the same results as
rma(yi, vi, weighted=FALSE, test="knha") (but use of the Knapp and
Hartung method in the context of an unweighted analysis remains an
experimental feature)
o one can now pass an 'escalc' object directly to rma.uni(), which then
tries to automatically determine the 'yi' and 'vi' variables in the data
frame (thanks to Christian Roever for the suggestion)
o escalc() can now also be used to convert a regular data frame to an
'escalc' object
o for measure="UCOR", the exact bias-correction is now used (instead of the
approximation); when vtype="UB", the exact equation is now used to
compute the unbiased estimate of the variance of the bias-corrected
correlation coefficient; hence 'gsl' is now a suggested package (needed
to compute the hypergeometric function) and is loaded when required
o cooks.distance() now also works with 'rma.mv' objects; and since model
fitting can take some time, an option to show a progress bar has been
added
o fixed an issue with robust.rma.mv() throwing errors when the model was
fitted with sparse=TRUE
o fixed an error with robust.rma.mv() when the model was fitted with
user-defined weights (or a user-defined weight matrix)
o added ranef() for extracting the BLUPs of the random effects (only for
'rma.uni' objects at the moment)
o reverted back to the pre-1.1-0 way of computing p-values for individual
coefficients in permutest.rma.uni(), that is, the p-value is computed
with mean(abs(z_perm) >= abs(z_obs) - tol) (where 'tol' is a numerical
tolerance)
o permutest.rma.uni() gains 'permci' argument, which can be used to obtain
permutation-based CIs of the model coefficients (note that this is
computationally very demanding and may take a long time to complete)
o rma.glmm() continues to work even when the saturated model cannot be
fitted (although the tests for heterogeneity are not available then)
o rma.glmm() now allows control over the arguments used for 'method.args'
(via control=list(hessianCtrl=list(...))) passed to hessian() (from the
'numDeriv' package) when using model="CM.EL" and measure="OR"
o in rma.glmm(), default 'method.args' value for 'r' passed to hessian()
has been increased to 16 (while this slows things down a bit, this
appears to improve the accuracy of the numerical approximation to the
Hessian, especially when tau^2 is close to 0)
o the various forest() and addpoly() functions now have a new argument
called 'width', which provides manual control over the width of the
annotation columns; this is useful when creating complex forest plots
with a monospaced font and we want to ensure that all annotations are
properly lined up at the decimal point
o the annotations created by the various forest() and addpoly() functions
are now a bit more compact by default
o more flexible 'efac' argument in the various forest() functions
o trailing zeros in the axis labels are now dropped in forest and funnel
plots by default; but trailing zeros can be retained by specifying a
numeric (and not an integer) value for the 'digits' argument
o added funnel.default(), which directly takes as input a vector with the
observed effect sizes or outcomes and the corresponding sampling
variances, standard errors, and/or sample sizes
o added plot.profile.rma(), a plot method for objects returned by the
profile.rma.uni() and profile.rma.mv() functions
o simplified baujat.rma.uni(), baujat.rma.mh(), and baujat.rma.peto() to
baujat.rma(), which now handles objects of class 'rma.uni', 'rma.mh', and
'rma.peto'
o baujat.rma() gains argument 'symbol' for more control over the plotting
symbol
o labbe() gains a 'grid' argument
o more logical placement of labels in qqnorm.rma.uni(), qqnorm.rma.mh(),
and qqnorm.rma.peto() functions (and more control thereof)
o qqnorm.rma.uni() gains 'lty' argument
o added gosh.rma() and plot.gosh.rma() for creating GOSH (i.e., graphical
display of study heterogeneity) plots based on Olkin et al. (2012)
o in the (rare) case where all observed outcomes are exactly equal to each
other, test="knha" (i.e., knha=TRUE) in rma() now leads to more
appropriate results
o updated datasets so those containing precomputed effect size estimates or
observed outcomes are already declared to be 'escalc' objects
o added new datasets (dat.egger2001 and dat.li2007) on the effectiveness of
intravenous magnesium in acute myocardial infarction
o 'methods' package is now under 'Depends' (in addition to 'Matrix'), so
that rma.mv(..., sparse=TRUE) always works, even under Rscript
o some general code cleanup
o added more tests (and used a more consistent naming scheme for tests)
Changes in Version 1.9-8 (2015-09-28)
=====================================
o due to more stringent package testing, it is increasingly difficult to
ensure that the package passes all checks on older versions of R; from
now on, the package will therefore require, and be checked under, only
the current (and the development) version of R
o added graphics, grDevices, and methods to Imports (due to recent change
in how CRAN checks packages)
o the 'struct' argument for rma.mv() now also allows for "ID" and "DIAG",
which are identical to the "CS" and "HCS" structures, but with the
correlation parameter fixed to 0
o added robust() for (cluster) robust tests and confidence intervals for
'rma.uni' and 'rma.mv' models (this uses a robust sandwich-type estimator
of the variance-covariance matrix of the fixed effects along the lines of
the Eicker-Huber-White method)
o confint() now works for models fitted with the rma.mv() function; for
variance and correlation parameters, the function provides profile
likelihood confidence intervals; the output generated by the confint()
function has been adjusted in general to make the formatting more
consistent across the different model types
o for objects of class 'rma.mv', profile() now provides profile plots for
all (non-fixed) variance and correlation components of the model when no
component is specified by the user (via the sigma2, tau2, rho, gamma2, or
phi arguments)
o for measure="MD" and measure="ROM", one can now choose between vtype="LS"
(the default) and vtype="HO"; the former computes the sampling variances
without assuming homoscedasticity, while the latter assumes
homoscedasticity
o multiple model objects can now be passed to the fitstats(), AIC(), and
BIC() functions
o check for duplicates in the 'slab' argument is now done *after* any
subsetting is done (as suggested by Michael Dewey)
o rma.glmm() now again works when using add=0, in which case some of the
observed outcomes (e.g., log odds or log odds ratios) may be NA
o when using rma.glmm() with model="CM.EL", the saturated model (used to
compute the Wald-type and likelihood ratio tests for the presence of
(residual) heterogeneity) often fails to converge; the function now
continues to run (instead of stopping with an error) and simply omits the
test results from the output
o when using rma.glmm() with model="CM.EL" and inversion of the Hessian
fails via the Choleski factorization, the function now makes another
attempt via the QR decomposition (even when this works, a warning is
issued)
o for rma.glmm(), BIC and AICc values were switched around; corrected
o more use of suppressWarnings() is made when functions repeatedly need to
fit the same model, such as cumul(), influence(), and profile(); that
way, one does not get inundated with the same warning(s)
o some (overdue) updates to the documentation
Changes in Version 1.9-7 (2015-05-22)
=====================================
o default optimizer for rma.mv() changed to nlminb() (instead of optim()
with "Nelder-Mead"); extensive testing indicated that nlminb() (and also
optim() with "BFGS") is typically quicker and more robust; note that this
is in principle a non-backwards compatible change, but really a necessary
one; and you can always revert to the old behavior with
control=list(optimizer="optim", optmethod="Nelder-Mead")
o all tests have been updated in accordance with the recommended syntax of
the 'testthat' package; for example, expect_equivalent(x,y) is used
instead of test_that(x, is_equivalent_to(y))
o changed a few is_identical_to() comparisons to expect_equivalent() ones
(that failed on Sparc Solaris)
Changes in Version 1.9-6 (2015-05-07)
=====================================
o funnel() now works again for 'rma.glmm' objects (note to self: quit
breaking things that work!)
o rma.glmm() will now only issue a warning (and not an error) when the
Hessian for the saturated model cannot be inverted (which is needed to
compute the Wald-type test for heterogeneity, so the test statistic is
then simply set to NA)
o rma.mv() now allows for two terms of the form ~ inner | outer; the
variance components corresponding to such a structure are called gamma2
and correlations are called phi; other functions that work with objects
of class 'rma.mv' have been updated accordingly
o rma.mv() now provides (even) more optimizer choices: nlm() from the
'stats' package, hjk() and nmk() from the 'dfoptim' package, and ucminf()
from the 'ucminf' package; choose the desired optimizer via the control
argument (e.g., control=list(optimizer="nlm"))
o profile.rma.uni() and profile.rma.mv() now can do parallel processing
(which is especially relevant for 'rma.mv' objects, where profiling is
crucial and model fitting can be slow)
o the various confint() functions now have a 'transf' argument (to apply
some kind of transformation to the model coefficients and confidence
interval bounds); coefficients and bounds for objects of class 'rma.mh'
and 'rma.peto' are no longer automatically transformed
o the various forest() functions no longer enforce that the actual x-axis
limits ('alim') encompass the observed outcomes to be plotted; also,
outcomes below or above the actual x-axis limits are no longer shown
o the various forest() functions now provide control over the horizontal
lines (at the top/bottom) that are automatically added to the plot via
the 'lty' argument (this also allows for removing them); also, the
vertical reference line is now placed *behind* the points/CIs
o forest.default() now has argument 'col' which can be used to specify the
color(s) to be used for drawing the study labels, points, CIs, and
annotations
o the 'efac' argument for forest.rma() now also allows two values, the
first for the arrows and CI limits, the second for summary estimates
o corrected some axis labels in various plots when measure="PLO"
o axes in labbe() plots now have "(Group 1)" and "(Group 2)" added by
default
o anova.rma() gains argument 'L' for specifying linear combinations of the
coefficients in the model that should be tested to be zero
o in case removal of a row of data would lead to one or more inestimable
model coefficients, baujat(), cooks.distance(), dfbetas(), influence(),
and rstudent() could fail for 'rma.uni' objects; such cases are now
handled properly
o for models with moderators, the predict() function now shows the study
labels when they have been specified by the user (and 'newmods' is not
used)
o if there is only one fixed effect (model coefficient) in the model, the
print.infl.rma.uni() function now shows the DFBETAS values with the other
case diagnostics in a single table (for easier inspection); if there is
more than one fixed effect, a separate table is still used for the
DFBETAS values (with one column for each coefficient)
o added measure="SMCRH" to the escalc() function for the standardized mean
change using raw score standardization with heteroscedastic population
variances at the two measurement occasions
o added measure="ROMC" to the escalc() function for the (log transformed)
ratio of means (response ratio) when the means reflect two measurement
occasions (e.g., for a single group of people) and hence are correlated
o added own function for computing/estimating the tetrachoric correlation
coefficient (for measure="RTET"); package therefore no longer suggests
'polycor' but now suggest 'mvtnorm' (which is loaded as needed)
o element 'fill' returned by trimfill.rma.uni() is now a logical vector
(instead of a 0/1 dummy variable)
o print.list.rma() now also returns the printed results invisibly as a data
frame
o added a new dataset (dat.senn2013) as another illustration of a network
meta-analysis
o metafor now depends on at least version 3.1.0 of R
Changes in Version 1.9-5 (2014-11-24)
=====================================
o moved the 'stats' and 'Matrix' packages from 'Depends' to 'Imports'; as a
result, had to add 'utils' to 'Imports'; moved the 'Formula' package from
'Depends' to 'Suggests'
o added update.rma() function (for updating/refitting a model); model
objects also now store and keep the call
o the vcov() function now also extracts the marginal variance-covariance
matrix of the observed effect sizes or outcomes from a fitted model (of
class 'rma.uni' or 'rma.mv')
o rma.mv() now makes use of the Cholesky decomposition when there is a
'random = ~ inner | outer' formula and struct="UN"; this is numerically
more stable than the old approach that avoided non-positive definite
solutions by forcing the log-likelihood to be -Inf in those cases; the
old behavior can be restored with 'control = list(cholesky=FALSE)'
o rma.mv() now requires the 'inner' variable in an '~ inner | outer'
formula to be a factor or character variable (except when 'struct' is
"AR" or "HAR"); use '~ factor(inner) | outer' in case it isn't
o anova.rma.uni() function changed to anova.rma() that works now for both
'rma.uni' and 'rma.mv' objects
o the profile.rma.mv() function now omits the number of the variance or
correlation component from the plot title and x-axis label when the model
only includes one of the respective parameters
o profile() functions now pass on the ... argument also to the title()
function used to create the figure titles (esp. relevant when using the
'cex.main' argument)
o the 'drop00' argument of the rma.mh() and rma.peto() functions now also
accepts a vector with two logicals, the first applies when calculating
the observed outcomes, the second when applying the Mantel-Haenszel or
Peto's method
o weights.rma.uni() now shows the correct weights when weighted=FALSE
o argument 'showweight' renamed to 'showweights' in the forest.default()
and forest.rma() functions (more consistent with the naming of the
various weights() functions)
o added model.matrix.rma() function (to extract the model matrix from
objects of class 'rma')
o funnel() and radial() now (invisibly) return data frames with the
coordinates of the points that were drawn (may be useful for manual
labeling of points in the plots)
o permutest.rma.uni() function now uses a numerical tolerance when making
comparisons (>= or <=) between an observed test statistic and the test
statistic under the permuted data; when using random permutations, the
function now ensures that the very first permutation correspond to the
original data
o corrected some missing/redundant row/column labels in some output
o most require() calls replaced with requireNamespace() to avoid altering
the search path (hopefully this won't break stuff ...)
o some non-visible changes including more use of some (non-exported) helper
functions for common tasks
o dataset dat.collins91985a updated (including all reported outcomes and
some more information about the various trials)
o oh, and guess what? I updated the documentation ...
Changes in Version 1.9-4 (2014-07-30)
=====================================
o added method="GENQ" to rma.uni() for the generalized Q-statistic
estimator of tau^2, which allows for used-defined weights (note: the DL
and HE estimators are just special cases of this method)
o when the model was fitted with method="GENQ", then confint() will now use
the generalized Q-statistic method to construct the corresponding
confidence interval for tau^2 (thanks to Dan Jackson for the code); the
iterative method used to obtain the CI makes use of Farebrother's
algorithm as implemented in the 'CompQuadForm' package
o slight improvements in how the rma.uni() function handles non-positive
sampling variances
o rma.uni(), rma.mv(), and rma.glmm() now try to detect and remove any
redundant predictors before the model fitting; therefore, if there are
exact linear relationships among the predictor variables (i.e., perfect
multicollinearity), terms are removed to obtain a set of predictors that
is no longer perfectly multicollinear (a warning is issued when this
happens); note that the order of how the variables are specified in the
model formula can influence which terms are removed
o the last update introduced an error in how hat values were computed when
the model was fitted with the rma() function using the Knapp & Hartung
method (i.e., when knha=TRUE); this has been fixed
o regtest() no longer works (for now) with 'rma.mv' objects (it wasn't
meant to in the first place); if you want to run something along the same
lines, just consider adding some measure of the precision of the observed
outcomes (e.g., their standard errors) as a predictor to the model
o added "sqrtni" and "sqrtninv" as possible options for the 'predictor'
argument of regtest()
o more optimizers are now available for the rma.mv() function via the
'nloptr' package by setting 'control = list(optimizer="nloptr")'; when
using this optimizer, the default is to use the BOBYQA implementation
from that package with a relative convergence criterion of 1e-8 on the
function value (see documentation on how to change these defaults)
o predict.rma() function now works for 'rma.mv' objects with multiple tau^2
values even if the user specifies the 'newmods' argument but not the
'tau2.levels' argument (but a warning is issued and the prediction
intervals are not computed)
o argument 'var.names' now works properly in escalc() when the user has not
made use of the 'data' argument (thanks to Jarrett Byrnes for bringing
this to my attention)
o added plot() function for cumulative random-effects models results as
obtained with the cumul.rma.uni() function; the plot shows the model
estimate on the x-axis and the corresponding tau^2 estimate on the y-axis
in the cumulative order of the results
o fixed the omitted offset term in the underlying model fitted by the
rma.glmm() function when method="ML", measure="IRR", and model="UM.FS",
that is, when fitting a mixed-effects Poisson regression model with fixed
study effects to two-group event count data (thanks to Peter Konings for
pointing out this error)
o added two new datasets (dat.bourassa1996, dat.riley2003)
o added function replmiss() (just a useful helper function)
o package now uses LazyData: TRUE
o some improvements to the documentation (do I still need to mention this
every time?)
Changes in Version 1.9-3 (2014-05-05)
=====================================
o some minor tweaks to rma.uni() that should be user transparent
o rma.uni() now has a 'weights' argument, allowing the user to specify
arbitrary user-defined weights; all functions affected by this have been
updated accordingly
o better handling of mismatched length of yi and ni vectors in rma.uni()
and rma.mv() functions
o subsetting is now handled as early as possible within functions with
subsetting capabilities; this avoids some (rare) cases where studies
ultimately excluded by the subsetting could still affect the results
o some general tweaks to rma.mv() that should make it a bit faster
o argument 'V' of rma.mv() now also accepts a list of var-cov matrices for
the observed effects or outcomes; from the list elements, the full (block
diagonal) var-cov matrix V is then automatically constructed
o rma.mv() now has a new argument 'W' allowing the user to specify
arbitrary user-defined weights or an arbitrary weight matrix
o rma.mv() now has a new argument 'sparse'; by setting this to TRUE, the
function uses sparse matrix objects to the extent possible; this can
speed up model fitting substantially for certain models (hence, the
'metafor' package now depends on the 'Matrix' package)
o rma.mv() now allows for struct="AR" and struct="HAR", to fit models with
(heteroscedastic) autoregressive (AR1) structures among the true effects
(useful for meta-analyses of studies reporting outcomes at multiple time
points)
o rma.mv() now has a new argument 'Rscale' which can be used to control how
matrices specified via the 'R' argument are scaled (see docs for more
details)
o rma.mv() now only checks for missing values in the rows of the lower
triangular part of the V matrix (including the diagonal); this way, if Vi
= matrix(c(.5,NA,NA,NA), nrow=2, ncol=2) is the var-cov matrix of the
sampling errors for a particular study with two outcomes, then only the
second row/column needs to be removed before the model fitting (and not
the entire study)
o added five new datasets (dat.begg1989, dat.ishak2007, dat.fine1993,
dat.konstantopoulos2011, and dat.hasselblad1998) to provide further
illustrations of the use of the rma.mv() function (for meta-analyses
combining controlled and uncontrolled studies, for meta-analyses of
longitudinal studies, for multilevel meta-analyses, and for network
meta-analyses / mixed treatment comparison meta-analyses)
o added rstandard.rma.mv() function to compute standardized residuals for
models fitted with the rma.mv() function (rstudent.rma.mv() to be added
at a later point); also added hatvalues.rma.mv() for computing the hat
values and weights.rma.uni() for computing the weights (i.e., the
diagonal elements of the weight matrix)
o the various weights() functions now have a new argument 'type' to
indicate whether only the diagonal elements of the weight matrix
(default) or the entire weight matrix should be returned
o the various hatvalues() functions now have a new argument 'type' to
indicate whether only the diagonal elements of the hat matrix (default)
or the entire hat matrix should be returned
o predict.rma() function now works properly for 'rma.mv' objects (also has
a new argument 'tau2.levels' to specify, where applicable, the levels of
the inner factor when computing prediction intervals)
o forest.rma() function now provides a bit more control over the color of
the summary polygon and is now compatible with 'rma.mv' objects; also,
has a new argument 'lty', which provides more control over the line type
for the individual CIs and the prediction interval
o addpoly.default() and addpoly.rma() now have a 'border' argument (for
consistency with the forest.rma() function); addpoly.rma() now yields the
correct CI bounds when the model was fitted with knha=TRUE
o forest.cumul.rma() now provides the correct CI bounds when the models
were fitted with the Knapp & Hartung method (i.e., when knha=TRUE in the
original rma() function call)
o the various forest() functions now return information about the chosen
values for arguments xlim, alim, at, ylim, rows, cex, cex.lab, and
cex.axis invisibly (useful for tweaking the default values); thanks to
Michael Dewey for the suggestion
o the various forest() functions now have a new argument, clim, to set
limits for the confidence/prediction interval bounds
o cumul.mh() and cumul.peto() now get the order of the studies right when
there are missing values in the data
o the 'transf' argument of leave1out.rma.mh(), leave1out.rma.peto(),
cumul.rma.mh(), and cumul.rma.peto() should now be used to specify the
actual function for the transformation (the former behavior of setting
this argument to TRUE to exponentiate log RRs, log ORs, or log IRRs still
works for back-compatibility); this is more consistent with how the
cumul.rma.uni() and leave1out.rma.uni() functions work and is also more
flexible
o added bldiag() function to construct a block diagonal matrix from (a list
of) matrices (may be needed to construct the V matrix when using the
rma.mv() function); bdiag() function from the 'Matrix' package does the
same thing, but creates sparse matrix objects
o profile.rma.mv() now has a 'startmethod' argument; by setting this to
"prev", successive model fits are started at the parameter estimates from
the previous model fit; this may speed things up a bit; also, the method
for automatically choosing the xlim values has been changed
o slight improvement to profile.rma.mv() function, which would throw an
error if the last model fit did not converge
o added a new dataset (dat.linde2005) for replication of the analyses in
Viechtbauer (2007)
o added a new dataset (dat.molloy2014) for illustrating the meta-analysis
of (r-to-z transformed) correlation coefficients
o added a new dataset (dat.gibson2002) to illustrate the combined analysis
of standardized mean differences and probit transformed risk differences
o computations in weights.mh() slightly changed to prevent integer
overflows for large counts
o unnecessary warnings in transf.ipft.hm() are now suppressed (cases that
raised those warnings were already handled correctly)
o in predict(), blup(), cumul(), and leave1out(), when using the 'transf'
argument, the standard errors (which are NA) are no longer shown in the
output
o argument 'slab' in various functions will now also accept non-unique
study labels; make.unique() is used as needed to make them unique
o vignettes("metafor") and vignettes("metafor_diagram") work again (yes, I
know they are not true vignettes in the strict sense, but I think they
should show up on the CRAN website for the package and using a minimal
valid Sweave document that is recognized by the R build system makes that
happen)