Christoph Scherber
2007-Aug-10 09:21 UTC
[R] Combining two ANOVA outputs of different lengths
Dear R users,
I have been trying to combine two anova outputs into one single table
(for later publication). The outputs are of different length, and share
only some common explanatory variables.
Using merge() or melt() (from the reshape package) did not work out.
Here are the model outputs and what I would like to have:
anova(model1)
numDF denDF F-value p-value
(Intercept) 1 74 0.063446 0.8018
days 1 74 6.613997 0.0121
logdiv 1 74 1.587983 0.2116
leg 1 74 4.425843 0.0388
anova(model2)
numDF denDF F-value p-value
(Intercept) 1 73 165.94569 <.0001
funcgr 1 73 7.91999 0.0063
grass 1 73 42.16909 <.0001
leg 1 73 4.72108 0.0330
funcgr:grass 1 73 8.49068 0.0047
#"merge(anova(model1),anova(model2),...)"
F-value 1 p-val1 F-value 2 p-value 2
(Intercept) 0.063446 0.8018 165.94569 <.0001
days 6.613997 0.0121 NA NA
logdiv 1.587983 0.2116 NA NA
leg 4.425843 0.0388 4.72108 0.033
funcgr NA NA 7.91999 0.0063
grass NA NA 42.16909 <.0001
funcgr:grass NA NA 8.49068 0.0047
I would be glad if someone would have an idea of how to do this in
principle.
I am using R 2.5.1 on Windows XP.
Thanks very much in advance!
Best wishes
Christoph
--
Dr. Christoph Scherber
DNPW, Agroecology
University of Goettingen
Waldweg 26
D-37073 Goettingen
Germany
phone +49(0)551 39 8807
fax +49(0)551 39 8806
Christoph Scherber wrote:> Dear R users, > > I have been trying to combine two anova outputs into one single table > (for later publication). The outputs are of different length, and share > only some common explanatory variables. > > Using merge() or melt() (from the reshape package) did not work out. > > Here are the model outputs and what I would like to have: > > anova(model1) > numDF denDF F-value p-value > (Intercept) 1 74 0.063446 0.8018 > days 1 74 6.613997 0.0121 > logdiv 1 74 1.587983 0.2116 > leg 1 74 4.425843 0.0388 > > anova(model2) > numDF denDF F-value p-value > (Intercept) 1 73 165.94569 <.0001 > funcgr 1 73 7.91999 0.0063 > grass 1 73 42.16909 <.0001 > leg 1 73 4.72108 0.0330 > funcgr:grass 1 73 8.49068 0.0047 > > #"merge(anova(model1),anova(model2),...)" > > F-value 1 p-val1 F-value 2 p-value 2 > (Intercept) 0.063446 0.8018 165.94569 <.0001 > days 6.613997 0.0121 NA NA > logdiv 1.587983 0.2116 NA NA > leg 4.425843 0.0388 4.72108 0.033 > funcgr NA NA 7.91999 0.0063 > grass NA NA 42.16909 <.0001 > funcgr:grass NA NA 8.49068 0.0047 > > > I would be glad if someone would have an idea of how to do this in > principle. >The main problems are that the merge key is the rownames and that you want to keep entries that are missing in one of the analysis. There are ways to deal with that: > example(anova.lm) ..... > merge(anova(fit2), anova(fit4), by=0, all=T) Row.names Df.x Sum Sq.x Mean Sq.x F value.x Pr(>F).x Df.y Sum Sq.y 1 ddpi NA NA NA NA NA 1 63.05403 2 dpi NA NA NA NA NA 1 12.40095 3 pop15 1 204.11757 204.11757 13.211166 0.000687868 1 204.11757 4 pop75 1 53.34271 53.34271 3.452517 0.069425385 1 53.34271 5 Residuals 47 726.16797 15.45038 NA NA 45 650.71300 Mean Sq.y F value.y Pr(>F).y 1 63.05403 4.3604959 0.0424711387 2 12.40095 0.8575863 0.3593550848 3 204.11757 14.1157322 0.0004921955 4 53.34271 3.6889104 0.0611254598 5 14.46029 NA NA Presumably, you can take it from here.