Search code examples
ranovalsmeans

Evaluating pairwise comparisons of nested effects


I have a model which I'm attempting to investigate some pairwise comparisons of nested effects. I'm not sure if I've written the model correctly, and I'm not understanding how to actually evaluate the nested term.

My data frame has one response variable called 'quality' and three predictor variables called "site" "month" and "day". In my experimental setup I measured quality on each individual. There were two sites. I sampled each site over 4 months. Each month had 4 consecutive days of sampling. I would like to know if individuals on one day are of significantly different quality to individuals from other days within the same month. I'm not interested in comparing days to one month to days from another month.

My data frame is as follows

   test<- structure(list(Site = structure(c(2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = c("H", "W"), class = "factor"), 
Day = structure(c(19L, 19L, 19L, 19L, 19L, 19L, 19L, 19L, 
4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 
4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 5L, 5L, 5L, 5L, 5L, 
5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 
18L, 18L, 18L, 18L, 18L, 18L, 18L, 18L, 18L, 15L, 15L, 15L, 
15L, 15L, 15L, 15L, 15L, 15L, 15L, 15L, 15L, 15L, 15L, 15L, 
15L, 15L, 15L, 15L, 15L, 15L, 15L, 15L, 26L, 26L, 26L, 26L, 
26L, 26L, 26L, 26L, 26L, 26L, 26L, 26L, 26L, 26L, 26L, 26L, 
26L, 26L, 8L, 8L, 8L, 8L, 8L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
3L, 3L, 3L, 3L, 3L, 17L, 17L, 17L, 17L, 17L, 17L, 17L, 17L, 
17L, 17L, 17L, 17L, 17L, 17L, 17L, 17L, 17L, 17L, 17L, 17L, 
17L, 17L, 17L, 17L, 14L, 14L, 14L, 14L, 14L, 14L, 14L, 14L, 
14L, 14L, 14L, 14L, 14L, 25L, 25L, 25L, 11L, 11L, 11L, 11L, 
11L, 11L, 11L, 11L, 11L, 11L, 11L, 11L, 11L, 11L, 11L, 11L, 
11L, 11L, 11L, 11L, 11L, 11L, 11L, 11L, 11L, 11L, 11L, 22L, 
22L, 7L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 16L, 16L, 16L, 16L, 16L, 16L, 16L, 16L, 16L, 16L, 16L, 
16L, 16L, 16L, 16L, 16L, 16L, 16L, 16L, 16L, 16L, 16L, 16L, 
16L, 16L, 16L, 16L, 16L, 16L, 13L, 13L, 13L, 13L, 13L, 13L, 
13L, 13L, 13L, 13L, 13L, 13L, 13L, 13L, 13L, 13L, 13L, 13L, 
13L, 13L, 13L, 13L, 13L, 13L, 13L, 13L, 13L, 24L, 24L, 24L, 
24L, 24L, 24L, 24L, 24L, 24L, 24L, 24L, 24L, 24L, 24L, 10L, 
10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 
10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 
10L, 10L, 10L, 21L, 21L, 21L, 21L, 21L, 21L, 21L, 21L, 21L, 
21L, 21L, 21L, 21L, 21L, 21L, 21L, 21L, 21L, 21L, 21L, 21L, 
21L, 21L, 21L, 21L, 21L, 21L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 
6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 12L, 
12L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 
12L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 
23L, 23L, 23L, 23L, 23L, 23L, 23L, 23L, 23L, 23L, 23L, 23L, 
23L, 23L, 23L, 23L, 23L, 23L, 23L, 23L, 23L, 23L, 23L, 23L, 
23L, 23L, 23L, 23L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 
9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 
9L, 9L, 9L, 20L, 20L, 20L, 20L, 20L, 20L, 20L, 20L, 20L, 
20L, 20L, 20L, 20L, 20L, 20L, 20L, 20L, 20L, 20L, 20L, 20L, 
20L, 20L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L), .Label = c("H1", "H10", "H11", "H12", "H13", "H14", 
"H15", "H16", "H2", "H3", "H4", "H6", "H7", "H8", "H9", "W10", 
"W11", "W12", "W13", "W2", "W3", "W4", "W6", "W7", "W8", 
"W9"), class = "factor"), Month = structure(c(3L, 3L, 3L, 
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 4L, 
4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 
4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 
4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 2L, 2L, 2L, 2L, 2L, 
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
3L, 3L, 3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 
4L, 4L, 4L, 4L, 4L, 4L, 4L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 2L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 
4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 
4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 
4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 
4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 
4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = c("August", 
"November", "October", "September"), class = "factor"), Quality = c(42.535, 
46.651, 45.466, 43.483, 44.896, 46.581, 47.494, 47.529, 46.562, 
45.111, 45.982, 48.367, 47.39, 45.388, 46.313, 44.732, 48.641, 
46.614, 45.234, 45.96, 44.795, 44.333, 46.559, 46.826, 44.166, 
45.19, 46.661, 45.481, 46.828, 43.487, 49.505, 48.558, 45.218, 
44.802, 43.975, 47.23, 44.85, 46.213, 44.726, 43.036, 47.211, 
45.536, 44.62, 44.297, 36.115, 39.314, 42.349, 44.919, 46.296, 
46.317, 45.858, 45.036, 45.861, 48.85, 45.337, 45.03, 47.4, 
48.78, 49.829, 45.12, 45.599, 43.235, 44.735, 44.889, 45.666, 
46.475, 44.888, 46.215, 42.242, 46.341, 45.992, 43.549, 46.612, 
44.232, 42.706, 42.064, 43.837, 43.351, 41.064, 44.364, 42.597, 
45.561, 44.51, 45.184, 44.896, 45.772, 47.43, 44.08, 44.697, 
45.141, 43.776, 47.175, 46.115, 43.39, 47.426, 47.636, 43.672, 
45.987, 45.338, 46.644, 42.192, 47.011, 45.856, 44.764, 36.285, 
33.741, 34.324, 35.101, 46.844, 42.52, 48.649, 44.364, 44.688, 
45.822, 44.945, 44.311, 44.684, 42.787, 45.516, 46.16, 46.289, 
45.661, 45.772, 43.845, 48.717, 46.567, 44.719, 46.585, 45.33, 
45.995, 48.053, 44.734, 51.233, 44.597, 45.742, 46.567, 46.478, 
44.382, 47.316, 46.205, 45.111, 47.575, 46.014, 44.533, 45.347, 
45.983, 47.053, 44.855, 48.021, 45.155, 49.248, 45.634, 48.815, 
45.413, 43.091, 47.854, 45.19, 47.495, 47.323, 48.076, 44.183, 
43.182, 46.267, 41.58, 44.237, 45.607, 48.517, 44.639, 44.773, 
42.787, 43.965, 46.629, 46.256, 47.688, 44.126, 44.712, 47.097, 
44.561, 47.306, 45.323, 46.328, 45.832, 46.075, 46.778, 47.445, 
45.582, 47.691, 45.193, 48.453, 46.301, 44.847, 43.675, 46.066, 
47.896, 45.2, 44.959, 47.401, 46.267, 45.743, 47.411, 46.926, 
46.24, 46.212, 44.988, 36.552, 38.027, 47.355, 40.147, 38.094, 
39.043, 37.589, 46.491, 46.413, 43.92, 45.228, 46.319, 44.764, 
47.376, 43.924, 45.203, 45.418, 45.684, 46.34, 43.655, 44.365, 
46.927, 48.269, 45.473, 46.451, 42.752, 48.346, 47.832, 46.534, 
46.47, 43.282, 47.749, 44.856, 46.551, 45.925, 45.669, 47.263, 
44.367, 47.017, 42.922, 44.904, 48.85, 45.535, 48.512, 46.154, 
47.306, 46.571, 46.619, 46.092, 43.808, 47.7, 48.482, 44.407, 
45.442, 44.771, 46.373, 47.777, 43.012, 46.154, 45.203, 46.443, 
43.461, 45.714, 40.776, 48.949, 45.72, 48.269, 45.782, 43.945, 
45.382, 43.729, 44.187, 45.267, 46.012, 42.234, 43.431, 41.973, 
45.597, 45.993, 46.303, 44.493, 44.981, 46.487, 45.01, 47.009, 
46.904, 48.277, 48.585, 48.625, 47.511, 44.011, 42.21, 47.124, 
44.244, 47.76, 47.299, 45.278, 45.564, 44.621, 46.75, 45.396, 
44.947, 46.185, 45.399, 46.095, 49.545, 47.211, 43.613, 48.494, 
44.102, 45.888, 45.473, 47.222, 46.681, 45.863, 47.834, 48.386, 
46.979, 46.318, 46.061, 46.347, 47.976, 47.079, 48.254, 47.643, 
46.244, 46.717, 44.574, 45.177, 44.879, 46.485, 47.416, 50.235, 
45.626, 48.117, 44.529, 44.281, 47.087, 47.356, 43.234, 45.841, 
43.487, 42.997, 35.322, 45.554, 44.973, 43.396, 43.023, 44.65, 
47.088, 41.934, 45.704, 44.559, 37.969, 42.687, 42.995, 45.287, 
45.21, 43.335, 46.892, 45.534, 44.19, 43.606, 44.173, 49.334, 
44.888, 47.477, 47.054, 41.041, 46.629, 45.049, 44.478, 40.278, 
43.044, 43.575, 46.194, 42.688, 41.361, 46.828, 45.534, 47.395, 
45.431, 45.433, 45.331, 43.947, 47.371, 48.308, 45.726, 41.833, 
45.782, 44.756, 45.406, 45.661, 43.447, 46.932, 45.495, 44.349, 
40.493, 43.603, 48.151, 44.037, 44.379, 45.934, 44.854, 42.321, 
46.198, 44.622, 46.077, 45.306, 48.951, 47.972, 42.581, 43.608, 
45.988, 44.955, 45.097, 46.768, 44.722, 45.971, 46.612, 48.956, 
47.669, 47.757, 47.189, 44.184, 48.464, 49.546, 48.021, 45.448, 
45.573, 46.778, 45.769, 45.419, 45.277, 47.489, 46.762, 46.238, 
47.509, 47.249, 46.243, 46.124, 46.801, 47.385, 43.614, 44.661, 
45.96, 48.791, 47.872, 42.402, 45.651, 45.927, 43.781, 49.923, 
47.153, 46.87, 43.767, 47.3, 46.897, 44.932, 45.135, 50.124, 
45.366, 45.063, 45.958, 46.731, 43.863, 45.095, 47.755, 45.446, 
45.145, 45.998, 46.377, 44.369, 46.485, 48.852, 45.365, 45.934, 
44.856, 48.195, 45.424, 49.05, 46.115, 43.077, 48.305, 44.784, 
44.934, 46.253, 46.203, 48.36, 47.36, 48.872, 44.803)), .Names = c("Site", 
"Day", "Month", "Quality"), class = "data.frame", row.names = c(NA, 
-496L)) 

I've written the model like this

    library(lsmeans)
fit1<-aov(Quality~Site*Month + (Site*Month)/Day, data=test)

That model seems to work for me. I understand how to evaluate the interaction term and main effects of site and month, but I'm struggling to evaluate day for some reason. I've tried

dayeffects<-lsmeans(fit1, pairwise~Site*Month/Day, adjust="bonferroni")
results <- dayeffects[[2]]
summary(results)[!is.na(summary(results)[,4]),] 

But this appears to test every pairwise comparison, rather than following the nesting structure. Like I said above, I only want to compare days that occur within the same month and site.

While I know that I could just take the comparisons I want from above, I feel like I'm probably doing something wrong. Also it makes the bonferroni adjustment overcorrect.

Any help would be great. Thanks


Solution

  • OK, I cleared my thoughts. You can compare them within Site and Month by lsmeans(model, pairwise ~ Day | Site * Month ). (I used ~ (Site*Month)/Day as model, but in this topic, ~ Site + Month + Site:Month:Day or ~ Site * Month * Day return the same results because your Day is unique).

    fit <-aov(Quality ~ (Site*Month)/Day, data=test)      # this model is equivalent to OP's one.
    res <- lsmeans(fit, pairwise ~ Day | Site * Month, adjust="bonferroni")
    results <- summary(res[[2]])[!is.na(summary(res[[2]])[,4]),]
    
    > results[25:30,]
    Site = H, Month = September:
     contrast   estimate        SE  df t.ratio p.value
     H6 - H7  -1.0626904 0.5348000 470  -1.987  0.2850
     H6 - H8  -0.1373969 0.6588578 470  -0.209  1.0000
     H6 - H9   0.3862017 0.5567090 470   0.694  1.0000
     H7 - H8   0.9252934 0.6504561 470   1.423  0.9332
     H7 - H9   1.4488921 0.5467399 470   2.650  0.0499
     H8 - H9   0.5235987 0.6685859 470   0.783  1.0000
    
    check p.adjustment
    res0 <- lsmeans(fit, pairwise ~ Day | Site * Month, adjust="none")
    results0 <- summary(res0[[2]])[!is.na(summary(res0[[2]])[,4]),]  # get non-adjusted p.value
    res0.p <- p.adjust(results0$p.value[25:30], "bonferroni")    # semi-manually p.adjustment
    identical(results$p.value[25:30], res0.p)                    # [1] TRUE