R - ggplot2 extrapolated regression lines in linear region - r

I have the following data frame (attached). I have plotted CR vs A for various Collimator / Head combinations.
(p <- ggplot(df,aes(x=A,y=CR,col=Head))+geom_point()+geom_line() +facet_grid(Collimator~Head, scales="fixed")+scale_x_continuous("Activity [MBq]", expand = c(0,0))+ylim(0,80000)+ ylab("Count Rate [cps]") + theme_bw()+theme(legend.position = "none"))
In an ideal world the above plot would be linear. In reality CR will begin to fall off with A due to increased system deadtime. What I would like to add to each facet is a straight line fit which passes through the first 2 data points only - this is before dead time kicks in.
Is there a simple way to do this in ggplot2. Can I use geom_smooth(method = "lm") with some additional options?
structure(list(A0 = c(76L, 274L, 786L, 1060L, 1294L, 2092L, 2639L,
3437L, 4223L, 76L, 274L, 786L, 1060L, 1294L, 2092L, 2639L, 3437L,
4223L, 76L, 274L, 786L, 1060L, 1294L, 2092L, 2639L, 3437L, 4223L,
76L, 274L, 786L, 1060L, 1294L, 2092L, 2639L, 3437L, 4223L, 76L,
274L, 786L, 1060L, 1294L, 2092L, 2639L, 3437L, 4223L, 76L, 274L,
786L, 1060L, 1294L, 2092L, 2639L, 3437L, 4223L), T = c(85L, 87L,
88L, 89L, 89L, 90L, 91L, 92L, 93L, 97L, 98L, 99L, 100L, 101L,
102L, 103L, 103L, 104L, 306L, 308L, 310L, 311L, 313L, 315L, 316L,
317L, 321L, 328L, 330L, 331L, 332L, 336L, 338L, 340L, 341L, 342L,
352L, 354L, 357L, 358L, 361L, 363L, 364L, 366L, 368L, 376L, 378L,
379L, 380L, 385L, 386L, 388L, 389L, 390L), A = c(64.8860944957,
233.0628375794, 667.3247389509, 898.2821229937, 1096.5821388243,
1769.5416286837, 2228.0796200189, 2896.4301555482, 3552.1951906822,
63.4538798403, 228.3428223318, 653.8100019998, 880.0900106808,
1072.3775535078, 1730.4829756141, 2178.8997717016, 2837.7713207042,
3480.2557273313, 43.0160516527, 154.5083447781, 441.5789350636,
594.4069507774, 722.9307781622, 1164.4170158664, 1466.1502053416,
1905.9469999005, 2324.4554021136, 41.2913626085, 148.3134747414,
424.6633733747, 571.6370071823, 692.6559941892, 1115.653739112,
1402.1405840581, 1822.7365994889, 2235.4125025879, 39.4886520314,
141.8383609947, 404.6153215597, 544.6504360348, 661.1848647194,
1064.9635212237, 1340.925513839, 1739.9197611259, 2129.880289335,
37.7646447282, 135.6459396877, 388.3926422248, 522.8131775262,
632.318659446, 1020.3651426265, 1282.3829893435, 1667.0556688926,
2044.484697239), Counts = c(102830L, 328231L, 784020L, 1010212L,
1160531L, 1582051L, 1760850L, 1888034L, 1897347L, 99780L, 317952L,
749548L, 965314L, 1106831L, 1488386L, 1672990L, 1793667L, 1789803L,
129507L, 453800L, 1053106L, 1327867L, 1473197L, 1900706L, 2075742L,
1991265L, 1756820L, 121230L, 424329L, 994864L, 1237568L, 1374478L,
1734922L, 1921046L, 1878514L, 1664225L, 213389L, 712467L, 1498082L,
1777791L, 1882367L, 1824631L, 1525162L, 1250229L, 1072038L, 193591L,
651249L, 1354850L, 1594421L, 1653835L, 1669993L, 1436444L, 1144518L,
1015859L), CR = c(3428L, 10941L, 26134L, 33674L, 38684L, 52735L,
58695L, 62934L, 63245L, 3326L, 10598L, 24985L, 32177L, 36894L,
49613L, 55766L, 59789L, 59660L, 4317L, 15127L, 35104L, 44262L,
49107L, 63357L, 69191L, 66376L, 58561L, 4041L, 14144L, 33162L,
41252L, 45816L, 57831L, 64035L, 62617L, 55474L, 7113L, 23749L,
49936L, 59260L, 62746L, 60821L, 50839L, 41674L, 35735L, 6453L,
21708L, 45162L, 53147L, 55128L, 55666L, 47881L, 38151L, 33862L
), Head = structure(c(2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 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, 2L, 2L, 2L, 2L, 2L, 2L,
2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = c("H1",
"H2"), class = "factor"), Collimator = structure(c(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, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L,
3L, 3L, 3L), .Label = c("HRGP", "LEGP", "LEHS"), class = "factor")), .Names = c("A0",
"T", "A", "Counts", "CR", "Head", "Collimator"), row.names = c(NA,
-54L), class = "data.frame")

This should do it:
library(ggplot2)
(p <- ggplot(df,aes(x=A,y=CR,col=Head))+
geom_point()+geom_line() +
facet_grid(Collimator~Head, scales="fixed")+
scale_x_continuous("Activity [MBq]",
expand = c(0,0))+ylim(0,80000)+
ylab("Count Rate [cps]") + theme_bw()+theme(legend.position = "none"))
library(plyr)
subdf <- ddply(df,c("Collimator","Head"),
function(x) x[1:2,])
p + geom_smooth(method="lm",data=subdf,colour="gray",se=FALSE,
fullrange=TRUE)

One approach would be to make new data frame that contains pnly first two values for each combination of Collimator and Head. Then calulate slope and intercept values for those two values and use them in geom_abline() to draw straight lines.
library(plyr)
#subset only firt two values
df2<-ddply(df,.(Collimator,Head),function(x) head(x,2))
head(df2)
A0 T A Counts CR Head Collimator
1 76 97 63.45388 99780 3326 H1 HRGP
2 274 98 228.34282 317952 10598 H1 HRGP
3 76 85 64.88609 102830 3428 H2 HRGP
4 274 87 233.06284 328231 10941 H2 HRGP
5 76 328 41.29136 121230 4041 H1 LEGP
6 274 330 148.31347 424329 14144 H1 LEGP
#caclulate slope and intercept
df3<-ddply(df2,.(Collimator,Head),summarise, int=coefficients(lm(CR~A))[1],
slop=coefficients(lm(CR~A))[2])
df3
Collimator Head int slop
1 HRGP H1 527.5309 44.10241
2 HRGP H2 529.3279 44.67324
3 LEGP H1 143.0519 94.40105
4 LEGP H2 146.2766 96.95737
5 LEHS H1 567.3029 155.85205
6 LEHS H2 694.4843 162.54077
ggplot(df,aes(x=A,y=CR,col=Head))+geom_point()+geom_line() +
facet_grid(Collimator~Head, scales="fixed") +
scale_x_continuous("Activity [MBq]", expand = c(0,0))+ ylim(0,80000) +
ylab("Count Rate [cps]") +
theme_bw()+theme(legend.position = "none")+
geom_abline(data=df3,aes(intercept=int,slope=slop,color=Head))

Related

T-tests on specific subgroups

I'm trying to calculate mean and SD and then perform t.tests on three different measurements (height, weight, speed) between multiple subgroups.
I started with a simple dataset that only contains two groups (control vs drug) and I have it all working well enough.
simple.df<-
structure(list(trial = structure(c(1L, 1L, 1L, 1L, 2L, 2L, 2L,
2L), levels = c("control", "drug"), class = "factor"), height = c(15,
17, 25, 21, 11, 29, 18, 20), weight = c(80, 90, 81, 79, 200,
230, 215, 210), speed = c(50, 45, 60, 51, 52, 80, 41, 19)), class = "data.frame", row.names = c(NA,
-8L))
library(rstatix)
simple.df %>% group_by(trial) %>% get_summary_stats(type = "mean_sd")
testing<- data.frame(lapply(simple.df[-1], function(x) t.test(x~simple.df$trial)$p.value))
testing
Where I'm running into trouble is with the t.testing on a larger experiment similar to the dataframe below. I still have control vs drug and height, weight & speed, but now all the measurements were done at two timepoints in both males and females. I'm only concerned with comparing control versus drug for the same sex/age. I'm still ok calculating the mean and SD for each group, but have gotten stuck with figuring out the t-testing.
Specifically, I just want the t-test on each of the three measurements for drug vs control in young males, drug vs control in old males, drug vs control in young females and drug vs control in old females, so 12 p-values total with some identification for what comparison each value represents.
Thanks for your help and expertise!
big.df<- structure(list(age = structure(c(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), levels = c("old", "young"
), class = "factor"), sex = structure(c(2L, 2L, 2L, 2L, 2L, 2L,
2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L,
2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), levels = c("f", "m"), class = "factor"),
trial = structure(c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 1L, 1L,
1L, 1L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 1L,
1L, 1L, 1L, 2L, 2L, 2L, 2L), levels = c("control", "drug"
), class = "factor"), height = c(15L, 17L, 25L, 21L, 11L,
29L, 18L, 20L, 300L, 320L, 316L, 325L, 170L, 175L, 172L,
180L, 28L, 40L, 33L, 35L, 60L, 45L, 67L, 52L, 250L, 260L,
240L, 248L, 11L, 19L, 16L, 4L), weight = c(80L, 90L, 81L,
79L, 200L, 230L, 215L, 210L, 152L, 150L, 148L, 155L, 160L,
158L, 157L, 140L, 176L, 164L, 135L, 196L, 175L, 178L, 120L,
147L, 160L, 155L, 175L, 142L, 139L, 142L, 150L, 145L), speed = c(50L,
45L, 60L, 51L, 52L, 80L, 41L, 19L, 55L, 56L, 61L, 67L, 85L,
90L, 100L, 77L, 90L, 80L, 77L, 80L, 81L, 95L, 87L, 91L, 50L,
60L, 55L, 59L, 71L, 65L, 66L, 62L)), row.names = c(NA, -32L
), class = "data.frame")
big.df %>% group_by (sex, age, trial) %>%
get_summary_stats (type = "mean_sd") %>%
arrange (variable, sex, age, trial)
RYann had a good idea by defining a function to pull out subgroups and then doing all the t-tests on each subgroup. That approach was helpful.
I ended up building on his strategy and simplifing things a bit more by vectorizing the t-tests inside the function using lapply. I then stored each of the age/sex combinations in a dataframe and used mapply to pass those combinations to the t-testing function.
group<-big.df %>% filter(age == a_age & sex == a_sex)
data.frame(lapply(group[4:6], function(x) t.test(x~group$trial)$p.value))
}
combos <- data.frame(age = c("young","young","old","old"),
sex = c("m","f","m","f"))
t.test.df <- data.frame(mapply(t.script, a_age = combos$age, a_sex = combos$sex))
colnames(t.test.df) <- paste(combos$age, combos$sex, sep = " ")
young m
young f
old m
old f
height
1
1.939896e-05
0.01175771
1.630232e-08
weight
4.435875e-05
0.6368126
0.5196617
0.1299121
speed
0.80433
0.004320253
0.1526353
0.01539331
I hope this code will work out for you
big.df<- structure(list(age = structure(c(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), levels = c("old", "young"
), class = "factor"), sex = structure(c(2L, 2L, 2L, 2L, 2L, 2L,
2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L,
2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), levels = c("f", "m"), class = "factor"),
trial = structure(c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 1L, 1L,
1L, 1L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 1L,
1L, 1L, 1L, 2L, 2L, 2L, 2L), levels = c("control", "drug"
), class = "factor"), height = c(15L, 17L, 25L, 21L, 11L,
29L, 18L, 20L, 300L, 320L, 316L, 325L, 170L, 175L, 172L,
180L, 28L, 40L, 33L, 35L, 60L, 45L, 67L, 52L, 250L, 260L,
240L, 248L, 11L, 19L, 16L, 4L), weight = c(80L, 90L, 81L,
79L, 200L, 230L, 215L, 210L, 152L, 150L, 148L, 155L, 160L,
158L, 157L, 140L, 176L, 164L, 135L, 196L, 175L, 178L, 120L,
147L, 160L, 155L, 175L, 142L, 139L, 142L, 150L, 145L), speed = c(50L,
45L, 60L, 51L, 52L, 80L, 41L, 19L, 55L, 56L, 61L, 67L, 85L,
90L, 100L, 77L, 90L, 80L, 77L, 80L, 81L, 95L, 87L, 91L, 50L,
60L, 55L, 59L, 71L, 65L, 66L, 62L)), row.names = c(NA, -32L
), class = "data.frame")
# A function to extract the 3 comparrisons
multi_t <- function(a_sex,a_age){
df_func <- big.df %>% filter(sex==a_sex,age==a_age)
h <- t.test(height~trial,df_func)$p.value
w <- t.test(weight~trial,df_func)$p.value
s <- t.test(speed~trial,df_func)$p.value
# cat(
# "sex =",a_sex,"\nage =",a_age,"\n\n"
# )
return(cbind(height=h,weight=w,speed=s))
}
# Table in a long version
ptable <- data.frame(
multi_t("m","young"),
multi_t("m","old"),
multi_t("f","young"),
multi_t("f","old")
) %>% pivot_longer(cols=everything(),
names_to = "value",
values_to = "p.values") %>%
mutate(comparison = rep(c("young males","old males",
"young females","old females"),each=3),
value=str_remove_all(value,"\\.\\d"))
ptable
# Table in a wider version
ptable %>% group_by(value) %>% mutate(id=row_number()) %>%
pivot_wider(names_from = value,values_from = p.values) %>%
select(-id)
ptable %>%
mutate(sig=p.values<0.05) %>%
ggplot(aes(x=value,y=p.values,color=sig))+
geom_point(show.legend = T)+facet_wrap(~comparison,scales="free")+
theme(legend.position = "bottom")+
labs(title="P values of 3 different measurements",
subtitle = "For 4 different populations")

summarise_each() with across() for dplyr package

I have this script, I want to know how I can replace summarise_each() with the across() function?
common_bw_elements = df %>%
group_by(range_of_commons = cut(common_IDs,
breaks= c(-Inf,0, 5, 10, 20, 30, 60, 100, 200, 300, 600, 1200, 1800, Inf))) %>%
summarise_each(funs(sum), sum_of_instances = frequent)
I am asking this, as I get the following message:
Warning message: summarise_each() is deprecated as of dplyr 0.7.0. Please use across() instead.
My code is very similar to the following post: summarize groups into intervals using dplyr
Any leads on this would be greatly appreciated.
For reference, you can use the following dput()
dput(df)
structure(list(common_IDs = c(0L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 17L, 18L, 25L, 26L, 27L, 37L, 51L, 55L, 56L, 63L, 68L, 69L, 70L, 71L, 74L, 76L, 81L, 84L, 86L, 87L, 89L, 90L, 91L, 92L, 101L,
103L, 108L, 109L, 110L, 113L, 114L, 115L, 116L, 129L, 130L, 131L, 133L, 135L, 136L, 137L, 138L, 139L, 141L, 152L, 153L, 154L, 177L, 178L, 190L, 191L, 196L, 199L, 202L, 203L, 208L, 209L, 210L, 211L, 213L, 214L, 215L, 216L, 218L, 219L, 222L, 223L, 229L, 230L, 231L,
232L, 239L, 251L, 252L, 254L, 257L, 264L, 265L, 271L, 272L, 273L, 275L, 276L, 277L, 280L, 293L, 294L, 297L, 298L, 299L, 300L, 301L, 304L, 317L, 320L, 337L, 346L, 347L, 364L, 371L, 373L, 386L, 387L, 389L, 412L, 417L, 419L, 420L, 432L, 440L, 441L, 442L, 443L, 451L,
452L, 453L, 455L, 456L, 457L, 458L, 462L, 463L, 464L, 469L, 470L, 474L, 476L, 477L, 478L, 487L, 488L, 492L, 1484L, 1534L, 1546L, 1561L, 1629L, 1642L, 1670L, 1672L, 1681L, 1698L, 1723L, 1725L,
1736L, 1738L, 1745L, 1753L, 1759L, 1764L, 1766L, 1767L, 1770L, 1772L, 1775L, 1776L, 1781L, 1784L, 1787L, 1791L, 1802L, 1807L, 1813L, 1815L, 1817L, 1821L, 1823L, 1825L, 1846L, 1850L, 1852L,
1853L, 1854L, 1857L, 1858L, 1859L, 1868L, 1899L, 1904L, 1911L, 1913L, 1977L, 1997L, 1999L, 2023L, 2079L),
frequent = c(81L, 75L, 10L, 17L, 4L, 4L, 33L, 13L, 31L, 3L, 19L, 22L, 6L, 1L, 11L, 2L,
1L, 1L, 3L, 14L, 1L, 2L, 1L, 14L, 1L, 9L, 6L, 9L, 2L, 5L, 13L, 4L, 4L, 1L, 4L, 1L, 3L, 1L, 6L, 2L, 1L, 3L, 2L, 5L, 2L, 1L, 17L, 5L, 4L, 4L, 1L, 4L, 7L, 3L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 6L,
16L, 3L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 5L, 13L, 6L, 2L, 1L, 1L, 2L, 1L, 1L, 1L, 1L, 1L, 4L, 2L, 1L, 2L, 1L, 1L, 2L, 1L, 1L, 1L, 1L, 2L, 1L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
1L, 1L, 1L, 1L, 1L, 1L, 3L, 5L, 1L, 3L, 1L, 3L, 4L, 1L, 1L, 2L, 3L, 4L, 3L, 3L, 1L, 3L, 2L, 2L, 1L, 6L, 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, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L)),
class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, -193L))
You can use summarise since you are only summing one variable by group.
library(tidyverse)
common_bw_elements = df %>%
group_by(range_of_commons = cut(common_IDs,
breaks= c(-Inf,0, 5, 10, 20, 30, 60, 100, 200, 300, 600, 1200, 1800, Inf))) %>%
summarise(sum_of_instances = sum(frequent))
Output
range_of_commons sum_of_instances
<fct> <int>
1 (-Inf,0] 81
2 (0,5] 110
3 (5,10] 46
4 (10,20] 34
5 (20,30] 47
6 (30,60] 15
7 (60,100] 85
8 (100,200] 87
9 (200,300] 92
10 (300,600] 75
11 (1.2e+03,1.8e+03] 29
12 (1.8e+03, Inf] 28
If you had multiple columns to sum, then we would use across (or if you only had a few columns, then instead of everything(), you can provide a vector of column names (e.g., c(common_IDs, frequent)):
df %>%
group_by(range_of_commons = cut(common_IDs,
breaks= c(-Inf,0, 5, 10, 20, 30, 60, 100, 200, 300, 600, 1200, 1800, Inf))) %>%
summarise(across(everything(), ~ sum(.x))) %>%
rename(sum_of_instances = frequent)
Output
range_of_commons common_IDs sum_of_instances
<fct> <int> <int>
1 (-Inf,0] 0 81
2 (0,5] 15 110
3 (5,10] 13 46
4 (10,20] 35 34
5 (20,30] 78 47
6 (30,60] 199 15
7 (60,100] 1191 85
8 (100,200] 3928 87
9 (200,300] 9392 92
10 (300,600] 17290 75
11 (1.2e+03,1.8e+03] 47829 29
12 (1.8e+03, Inf] 48922 28

Is there a way to provide n counts for a ggplot bar graph that uses a factor variable with the fill aesthetic?

I am working with a set of data that uses a factor variable that has "Yes" and "No" as levels of response. I've figured out how to create a bar graph based on this data, but I can't seem to get an n/count of each bar to work with the graph.
While the y-axis is "count", it's showing the proportion of yes and no as I intend it to. However, when I try to add a line to label the count, it goes far above the bars at the actual "count" on the y-axis.
The figure above is created with the code:
gun_oppo_plot <- ggplot(data = gun_survey_oppo, aes(x = condition, fill = gun_DV)) +
geom_bar(position = "fill", na.rm = TRUE) + theme_bw()
When I try to add a line such as geom_text(aes(label=..count..),stat="count"), I get the following figure:
Is there a way to get the same counts as in the lower figure, while maintaing the first one's focus on y from (0:1) and having the counts be on the bars themselves?
Thanks in advance for the help!
Data for replication:
structure(list(condition = structure(c(4L, 1L, 5L, 4L, 2L, 4L,
5L, 4L, 3L, 4L, 4L, 3L, 2L, 3L, 3L, 1L, 5L, 3L, 3L, 1L, 2L, 2L,
3L, 1L, 3L, 3L, 4L, 3L, 1L, 5L, 1L, 3L, 2L, 5L, 3L, 4L, 3L, 5L,
4L, 5L, 5L, 4L, 1L, 3L, 1L, 1L, 3L, 5L, 5L, 3L, 5L, 3L, 5L, 5L,
4L, 5L, 5L, 2L, 5L, 1L, 3L, 1L, 2L, 5L, 5L, 1L, 1L, 2L, 4L, 2L,
3L, 5L, 4L, 5L, 4L, 4L, 1L, 1L, 5L, 5L, 3L, 5L, 5L, 3L, 2L, 3L,
2L, 5L, 1L, 4L, 2L, 5L, 1L, 3L, 2L, 3L, 2L, 3L, 2L, 5L, 4L, 3L,
1L, 4L, 1L, 2L, 1L, 5L, 3L, 4L, 2L, 4L, 1L, 2L, 1L, 3L, 2L, 4L,
5L, 3L, 1L, 5L, 1L, 2L, 3L, 1L, 4L, 5L, 2L, 5L, 4L, 5L, 4L, 3L,
2L, 4L, 5L, 3L, 1L, 1L, 4L, 5L, 2L, 4L, 1L, 3L, 1L, 5L, 5L, 3L,
1L, 5L, 2L, 2L, 2L, 1L, 5L, 3L, 4L, 2L, 3L, 5L, 4L, 3L, 4L, 2L,
5L, 2L, 4L, 2L, 2L, 4L, 2L, 5L, 1L, 4L, 3L, 2L, 1L, 3L, 2L, 2L,
4L, 5L, 2L, 5L, 4L, 5L, 1L, 4L, 4L, 2L, 3L, 5L, 2L, 3L, 1L, 2L,
1L, 5L, 2L, 2L, 4L, 1L, 1L, 4L, 3L, 5L, 1L, 1L, 5L, 4L, 4L, 4L,
2L, 4L, 1L, 2L, 2L, 3L, 5L, 1L, 5L, 2L, 4L, 4L, 4L, 1L, 2L, 4L,
2L, 3L, 5L, 3L, 2L, 3L, 3L, 2L, 5L, 3L, 5L, 3L, 3L, 2L, 1L, 5L,
4L, 4L, 1L, 5L, 4L, 3L, 2L, 4L, 1L, 5L, 3L, 5L, 4L, 5L, 3L, 4L,
1L, 5L, 2L, 3L, 4L, 5L, 4L, 3L, 3L, 2L, 5L, 1L, 4L, 3L, 3L, 5L,
2L, 4L, 5L), .Label = c("0", "1", "2", "3", "4"), class = "factor"),
gun_DV = structure(c(2L, 2L, 1L, 2L, 2L, 2L, 2L, 2L, 2L,
2L, 1L, 1L, 1L, 1L, 2L, 2L, 1L, 2L, 2L, 2L, 2L, 1L, 2L, 2L,
2L, 1L, 2L, 2L, 1L, 1L, 2L, 2L, 1L, 1L, 1L, 2L, 1L, 2L, 2L,
2L, 1L, 2L, 2L, 1L, 2L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 2L, 1L,
1L, 1L, 1L, 2L, 2L, 1L, 1L, 1L, 1L, 2L, 1L, 2L, 1L, 2L, 2L,
1L, 1L, 1L, 2L, 2L, 1L, 1L, 1L, 2L, 2L, 1L, 1L, 1L, 1L, 2L,
1L, 1L, 1L, 2L, 2L, 1L, 1L, 1L, 1L, 2L, 1L, 2L, 1L, 1L, 1L,
1L, 1L, 2L, 1L, 1L, 2L, 1L, 1L, 1L, 2L, 1L, 1L, 1L, 2L, 1L,
2L, 2L, 2L, 2L, 1L, 1L, 2L, 1L, 1L, 2L, 1L, 2L, 1L, 1L, 1L,
1L, 2L, 1L, 1L, 1L, 2L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 1L, 2L,
1L, 1L, 2L, 2L, 2L, 1L, 1L, 2L, 2L, 1L, 1L, 2L, 2L, 1L, 1L,
1L, 2L, 1L, 1L, 2L, 1L, 2L, 1L, 1L, 1L, 2L, 1L, 2L, 1L, 1L,
2L, 2L, 2L, 2L, 1L, 2L, 1L, 1L, 2L, 2L, 1L, 1L, 1L, 1L, 1L,
2L, 1L, 2L, 2L, 2L, 1L, 1L, 1L, 2L, 1L, 1L, 2L, 1L, 2L, 1L,
2L, 1L, 2L, 1L, 2L, 1L, 1L, 1L, 2L, 2L, 2L, 1L, 2L, 1L, 2L,
1L, 1L, 2L, 1L, 1L, 2L, 1L, 1L, 2L, 2L, 2L, 1L, 1L, 1L, 1L,
1L, 2L, 2L, 1L, 1L, 1L, 1L, 2L, 1L, 2L, 1L, 1L, 2L, 1L, 1L,
1L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 2L, 1L, 2L, 1L, 2L, 1L,
1L, 1L, 1L, 1L, 1L, 2L, 1L, 1L, 2L, 2L, 1L, 2L, 2L, 1L, 1L,
1L, 1L), .Label = c("No", "Yes"), class = "factor")), class = "data.frame", row.names = c(2L,
4L, 8L, 9L, 12L, 13L, 17L, 21L, 25L, 26L, 28L, 31L, 35L, 37L,
44L, 46L, 47L, 49L, 52L, 53L, 56L, 59L, 66L, 71L, 74L, 76L, 79L,
81L, 83L, 85L, 94L, 97L, 98L, 104L, 109L, 110L, 114L, 116L, 117L,
120L, 122L, 124L, 129L, 130L, 133L, 136L, 138L, 144L, 147L, 152L,
157L, 158L, 162L, 167L, 169L, 171L, 178L, 188L, 195L, 198L, 203L,
206L, 209L, 211L, 213L, 217L, 219L, 222L, 225L, 228L, 230L, 231L,
235L, 237L, 240L, 256L, 257L, 259L, 260L, 262L, 267L, 269L, 271L,
272L, 278L, 279L, 285L, 289L, 294L, 295L, 297L, 299L, 300L, 302L,
304L, 310L, 311L, 314L, 318L, 319L, 321L, 323L, 326L, 328L, 333L,
341L, 342L, 343L, 348L, 357L, 359L, 360L, 363L, 364L, 372L, 375L,
377L, 379L, 387L, 391L, 392L, 394L, 397L, 399L, 401L, 404L, 405L,
411L, 416L, 418L, 421L, 423L, 427L, 428L, 430L, 434L, 438L, 446L,
454L, 456L, 458L, 460L, 463L, 465L, 477L, 479L, 482L, 485L, 490L,
493L, 497L, 500L, 501L, 503L, 507L, 512L, 514L, 516L, 519L, 522L,
525L, 531L, 533L, 539L, 541L, 543L, 552L, 555L, 556L, 559L, 563L,
566L, 569L, 570L, 572L, 574L, 576L, 579L, 581L, 584L, 589L, 590L,
596L, 598L, 599L, 603L, 607L, 609L, 611L, 613L, 618L, 620L, 621L,
624L, 625L, 628L, 629L, 638L, 641L, 644L, 645L, 647L, 651L, 653L,
658L, 663L, 665L, 666L, 675L, 677L, 678L, 680L, 686L, 693L, 697L,
699L, 700L, 704L, 705L, 708L, 709L, 713L, 715L, 717L, 718L, 721L,
724L, 726L, 728L, 735L, 739L, 741L, 748L, 750L, 753L, 756L, 758L,
759L, 762L, 769L, 772L, 780L, 782L, 786L, 788L, 790L, 793L, 796L,
799L, 801L, 804L, 806L, 808L, 809L, 818L, 820L, 823L, 825L, 832L,
835L, 836L, 842L, 844L, 846L, 847L, 855L, 856L, 858L, 860L, 861L,
865L, 867L, 872L, 875L, 876L, 878L, 884L, 887L, 891L, 893L, 896L
))
There might be some way to do this within ggplot itself but here is another way where we "prepare" the data first before plotting.
library(dplyr)
library(ggplot2)
gun_survey_oppo %>%
count(condition, gun_DV) %>%
group_by(condition) %>%
mutate(prop = prop.table(n)) %>%
ggplot(aes(condition, prop, fill = gun_DV, label = n)) +
geom_col(position = "fill", na.rm = TRUE) +
geom_text(position = position_stack(vjust = .5)) +
theme_bw()

Categorical covariate with two way anova in R

This is a random sample of my data set:
structure(list(DTI_ID = structure(c(31L, 241L, 84L, 298L, 185L,
269L, 198L, 24L, 286L, 177L, 228L, 158L, 57L, 293L, 218L, 8L,
180L, 39L, 211L, 134L, 291L, 309L, 99L, 70L, 154L, 138L, 250L,
41L, 276L, 262L, 96L, 139L, 232L, 12L, 294L, 38L, 244L, 289L,
280L, 196L, 58L, 44L, 188L, 152L, 143L, 302L, 201L, 27L, 24L,
67L, 247L, 223L, 74L, 32L, 110L, 98L, 303L, 256L, 71L, 30L, 236L,
266L, 307L, 224L, 100L, 73L, 288L, 230L, 182L, 159L, 190L, 123L,
241L, 169L, 103L, 40L, 248L, 293L, 60L, 260L, 168L, 267L, 144L,
89L, 139L, 231L, 204L, 130L, 278L, 227L, 205L, 268L, 88L, 221L,
208L, 306L, 242L, 145L, 21L, 165L, 217L, 159L, 206L, 70L, 121L,
181L, 95L, 279L, 265L, 4L, 122L, 177L, 234L, 34L, 261L, 86L,
2L, 296L, 39L, 283L, 251L, 126L, 188L, 176L, 220L, 77L, 225L,
73L, 48L, 107L, 280L, 118L, 38L, 310L, 297L, 258L, 89L, 205L,
4L, 54L, 16L, 95L, 119L, 40L, 9L, 66L, 64L, 55L, 131L, 290L,
166L, 170L, 182L, 139L, 125L, 201L, 302L, 137L, 8L, 81L, 61L,
119L, 278L, 135L, 117L, 65L, 21L, 200L, 150L, 146L, 54L, 262L,
152L, 224L, 162L, 111L, 251L, 130L, 41L, 271L, 33L, 86L, 32L,
199L, 49L, 180L, 101L, 271L, 80L, 84L, 293L, 5L, 170L, 74L, 279L,
281L, 255L, 210L, 52L, 248L, 53L, 121L, 190L, 141L, 213L, 138L,
112L, 234L, 235L, 40L, 233L, 115L, 154L, 11L, 76L, 29L, 19L,
249L, 1L, 207L), .Label = c("5356", "5357", "5358", "5359", "5360",
"5363", "5373", "5381", "5383", "5386", "5395", "5397", "5400",
"5401", "5444", "5445", "5446", "5448", "5450", "5451", "5454",
"5472", "5473", "5475", "5476", "5477", "5478", "5480", "5481",
"5483", "5487", "5494", "5495", "5504", "5505", "5506", "5507",
"5508", "5509", "5513", "5514", "5515", "5516", "5517", "5518",
"5519", "5521", "5523", "5524", "5526", "5527", "5528", "5544",
"5545", "5546", "5547", "5551", "5552", "5553", "5554", "5555",
"5558", "5559", "5560", "5562", "5564", "5566", "5573", "5574",
"5575", "5576", "5577", "5578", "5579", "5584", "5585", "5587",
"5588", "5589", "5591", "5594", "5595", "5604", "5611", "5612",
"5613", "5615", "5616", "5619", "5620", "5621", "5622", "5626",
"5627", "5628", "5631", "5632", "5634", "5635", "5643", "5652",
"5653", "5654", "5655", "5656", "5657", "5659", "5660", "5661",
"5664", "5665", "5666", "5669", "5671", "5672", "5673", "5678",
"5680", "5688", "5689", "5690", "5691", "5692", "5698", "5699",
"5700", "5702", "5703", "5704", "5706", "5708", "5709", "5710",
"5730", "5731", "5732", "5733", "5734", "5735", "5739", "5740",
"5741", "5742", "5743", "5744", "5745", "5746", "5747", "5748",
"5749", "5750", "5753", "5754", "5755", "5766", "5767", "5776",
"5777", "5778", "5779", "5780", "5781", "5787", "5788", "5789",
"5790", "5791", "5792", "5793", "5797", "5798", "5799", "5800",
"5801", "5810", "5811", "5812", "5813", "5814", "5819", "5820",
"5821", "5822", "5823", "5824", "5825", "5827", "5828", "5829",
"5830", "5857", "5859", "5874", "5875", "5876", "5877", "5878",
"5879", "5883", "5884", "5886", "5887", "5888", "5889", "5890",
"5892", "5893", "5896", "5899", "5900", "5909", "5910", "5918",
"5919", "5920", "5921", "5922", "5923", "5927", "5929", "5931",
"5932", "5933", "5934", "5936", "5937", "5941", "5943", "5944",
"5949", "5950", "5951", "5952", "5956", "5957", "5958", "5959",
"5971", "5972", "5973", "5976", "5979", "5980", "5981", "6001",
"6002", "6003", "6004", "6005", "6009", "6027", "6028", "6033",
"6042", "6054", "6063", "6067", "6073", "6076", "6077", "6078",
"6079", "6080", "6081", "6082", "6083", "6098", "6102", "6103",
"6104", "6105", "6106", "6107", "6111", "6119", "6133", "6146",
"6147", "6157", "6158", "6160", "6161", "6162", "6163", "6164",
"6165", "6166", "6167", "6168", "6169", "6170", "6171", "6172",
"6173", "6174", "6175", "6190", "6193", "6195", "6196", "6197",
"6208", "6228", "6229", "6232", "6255", "6268", "6269", "6270",
"6275"), class = "factor"), Gender = structure(c(2L, 2L, 1L,
2L, 2L, 1L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 2L, 2L, 2L, 2L,
2L, 2L, 2L, 2L, 1L, 1L, 2L, 1L, 2L, 2L, 2L, 2L, 2L, 1L, 2L, 1L,
1L, 2L, 2L, 2L, 1L, 2L, 2L, 2L, 1L, 2L, 2L, 1L, 2L, 1L, 2L, 1L,
2L, 2L, 2L, 1L, 2L, 1L, 2L, 2L, 2L, 1L, 2L, 2L, 2L, 2L, 1L, 1L,
2L, 2L, 2L, 1L, 2L, 2L, 2L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 1L, 1L,
2L, 2L, 2L, 2L, 1L, 2L, 1L, 1L, 1L, 2L, 2L, 1L, 1L, 2L, 2L, 2L,
1L, 1L, 2L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, 2L, 1L,
2L, 2L, 2L, 2L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 2L, 2L, 2L,
2L, 1L, 1L, 2L, 2L, 2L, 1L, 2L, 1L, 2L, 2L, 2L, 1L, 2L, 2L, 1L,
1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L,
2L, 2L, 1L, 2L, 2L, 2L, 2L, 1L, 2L, 1L, 2L, 2L, 2L, 2L, 1L, 2L,
2L, 2L, 2L, 2L, 2L, 1L, 2L, 1L, 2L, 1L, 1L, 2L, 2L, 2L, 2L, 2L,
2L, 1L, 2L, 2L, 1L, 2L, 2L, 1L, 1L, 2L, 2L, 2L, 1L, 2L, 1L, 2L,
1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 1L), .Label = c("Female", "Male"
), class = "factor"), Age = structure(c(2L, 1L, 2L, 2L, 2L, 2L,
1L, 2L, 2L, 2L, 1L, 2L, 2L, 2L, 1L, 2L, 2L, 2L, 2L, 1L, 1L, 2L,
2L, 2L, 2L, 2L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 2L,
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 2L, 2L, 2L,
2L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 2L, 2L, 2L, 2L, 2L, 1L, 2L, 2L,
1L, 1L, 1L, 2L, 2L, 2L, 1L, 2L, 1L, 2L, 2L, 2L, 1L, 1L, 2L, 1L,
2L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 2L, 2L, 2L, 2L, 1L, 2L, 2L, 2L,
2L, 2L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L,
2L, 2L, 1L, 1L, 2L, 2L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L,
2L, 2L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 2L, 2L, 2L,
2L, 1L, 2L, 2L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L,
1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 2L, 2L, 2L, 2L, 2L,
2L, 2L, 2L, 2L, 1L, 2L, 2L, 2L, 2L, 2L, 1L, 2L, 2L, 2L, 2L, 2L,
2L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 1L, 2L, 2L, 2L, 2L, 2L,
2L, 2L, 2L, 1L, 2L, 2L), .Label = c("Young", "Old"), class = "factor"),
ROI = structure(c(4L, 4L, 1L, 2L, 3L, 3L, 3L, 2L, 2L, 1L,
3L, 2L, 4L, 1L, 1L, 2L, 4L, 4L, 1L, 4L, 4L, 4L, 1L, 1L, 4L,
2L, 1L, 2L, 2L, 2L, 4L, 1L, 1L, 3L, 3L, 3L, 4L, 3L, 1L, 4L,
2L, 2L, 3L, 4L, 2L, 2L, 1L, 2L, 3L, 1L, 4L, 4L, 3L, 4L, 4L,
1L, 3L, 4L, 3L, 3L, 1L, 3L, 1L, 1L, 1L, 4L, 2L, 1L, 4L, 3L,
2L, 2L, 3L, 4L, 1L, 2L, 1L, 4L, 2L, 1L, 3L, 1L, 2L, 2L, 4L,
1L, 1L, 4L, 4L, 3L, 1L, 2L, 1L, 1L, 2L, 2L, 1L, 4L, 4L, 1L,
2L, 4L, 1L, 2L, 2L, 3L, 4L, 1L, 2L, 3L, 4L, 4L, 3L, 2L, 4L,
1L, 1L, 3L, 3L, 3L, 1L, 2L, 4L, 3L, 4L, 1L, 4L, 3L, 2L, 1L,
4L, 4L, 4L, 2L, 4L, 1L, 4L, 2L, 1L, 3L, 1L, 2L, 3L, 3L, 3L,
1L, 1L, 2L, 4L, 4L, 1L, 4L, 1L, 3L, 3L, 4L, 1L, 3L, 4L, 2L,
2L, 1L, 1L, 1L, 1L, 4L, 1L, 4L, 1L, 4L, 2L, 4L, 3L, 3L, 3L,
2L, 2L, 2L, 1L, 4L, 4L, 3L, 3L, 4L, 3L, 1L, 4L, 2L, 2L, 3L,
2L, 3L, 1L, 2L, 3L, 2L, 1L, 3L, 3L, 2L, 4L, 1L, 1L, 2L, 1L,
4L, 4L, 1L, 2L, 1L, 2L, 4L, 2L, 4L, 1L, 4L, 2L, 4L, 3L, 2L
), .Label = c("A", "B","C", "D"), class = "factor"),
value = c(0.326713741, 0.349206239, 0.365954667,
0.313958377, 0.480487555, 0.431199849, 0.446729183, 0.337009728,
0.331222087, 0.386937141, 0.372758657, 0.305083066, 0.504718482,
0.414191663, 0.40949735, 0.271525055, 0.30009532, 0.50117749,
0.387669057, 0.330797315, 0.390679717, 0.452181876, 0.423188657,
0.396808296, 0.388510793, 0.298505336, 0.412985921, 0.327000797,
0.304242313, 0.277513236, 0.394773901, 0.4322685, 0.440891623,
0.439061254, 0.453015536, 0.385896087, 0.452299237, 0.296923041,
0.443324417, 0.420699686, 0.282610774, 0.303566545, 0.535346806,
0.393591255, 0.32561186, 0.309230596, 0.417596817, 0.281766504,
0.445347071, 0.353419632, 0.354420125, 0.429613769, 0.385733992,
0.155136898, 0.485385537, 0.439544022, 0.436584443, 0.458706915,
0.600399196, 0.440390527, 0.362952292, 0.37253055, 0.37306264,
0.371298164, 0.469741255, 0.573943496, 0.283266962, 0.391182601,
0.663566113, 0.517713368, 0.327498972, 0.353969425, 0.443648636,
0.449972481, 0.434426159, 0.305042148, 0.422493547, 0.194572225,
0.331083208, 0.418288261, 0.447215647, 0.429001331, 0.339149892,
0.336879104, 0.471237898, 0.408330619, 0.393405557, 0.486086488,
0.427713692, 0.379242182, 0.40456596, 0.326695889, 0.393235713,
0.452374548, 0.332855165, 0.323469192, 0.396484613, 0.372199923,
0.257353246, 0.405249774, 0.326494843, 0.420468688, 0.335335255,
0.267627925, 0.379383296, 0.338241786, 0.416064918, 0.381003618,
0.284006208, 0.442705005, 0.494199812, 0.464447916, 0.370418996,
0.293953657, 0.34482345, 0.47208631, 0.378798842, 0.407261223,
0.34767586, 0.424341202, 0.434532404, 0.342623293, 0.628901243,
0.381492049, 0.540111601, 0.392371207, 0.459349483, 0.373172134,
0.270272404, 0.413454324, 0.375994682, 0.470298111, 0.340463549,
0.31613645, 0.470312864, 0.410651028, 0.276164204, 0.341546267,
0.402167588, 0.465735435, 0.434102625, 0.328114063, 0.394582212,
0.331681252, 0.387562275, 0.3989245, 0.44939962, 0.29586333,
0.398924828, 0.559520543, 0.392099082, 0.589552164, 0.397368163,
0.375135392, 0.348508835, 0.447002649, 0.407775551, 0.404435992,
0.666776299, 0.265039146, 0.25311482, 0.354386091, 0.44051528,
0.416727781, 0.460624784, 0.455415428, 0.445090771, 0.502343714,
0.393426061, 0.463244319, 0.345586747, 0.291874498, 0.564393103,
0.400276631, 0.41512531, 0.308440536, 0.373545259, 0.272377819,
0.434890926, 0.358394623, 0.414819628, 0.761894882, 0.409700364,
0.403811544, 0.469092041, 0.397044837, 0.312479883, 0.294876397,
0.314414322, 0.428720832, 0.329074681, 0.311423391, 0.444689006,
0.254723012, 0.248710752, 0.270434052, 0.416304022, 0.38875562,
0.396840513, 0.296386898, 0.454476953, 0.474986047, 0.427072734,
0.270839244, 0.426266223, 0.586857438, 0.348018169, 0.386638522,
0.349321723, 0.418692261, 0.295630395, 0.463439822, 0.286190838,
0.336389571, 0.422766507, 0.231764346, 0.358636618, 0.562871873,
0.381515294, 0.28637746)), row.names = c(961L, 1171L, 84L,
608L, 805L, 889L, 818L, 334L, 596L, 177L, 848L, 468L, 987L, 293L,
218L, 318L, 1110L, 969L, 211L, 1064L, 1221L, 1239L, 99L, 70L,
1084L, 448L, 250L, 351L, 586L, 572L, 1026L, 139L, 232L, 632L,
914L, 658L, 1174L, 909L, 280L, 1126L, 368L, 354L, 808L, 1082L,
453L, 612L, 201L, 337L, 644L, 67L, 1177L, 1153L, 694L, 962L,
1040L, 98L, 923L, 1186L, 691L, 650L, 236L, 886L, 307L, 224L,
100L, 1003L, 598L, 230L, 1112L, 779L, 500L, 433L, 861L, 1099L,
103L, 350L, 248L, 1223L, 370L, 260L, 788L, 267L, 454L, 399L,
1069L, 231L, 204L, 1060L, 1208L, 847L, 205L, 578L, 88L, 221L,
518L, 616L, 242L, 1075L, 951L, 165L, 527L, 1089L, 206L, 380L,
431L, 801L, 1025L, 279L, 575L, 624L, 1052L, 1107L, 854L, 344L,
1191L, 86L, 2L, 916L, 659L, 903L, 251L, 436L, 1118L, 796L, 1150L,
77L, 1155L, 693L, 358L, 107L, 1210L, 1048L, 968L, 620L, 1227L,
258L, 1019L, 515L, 4L, 674L, 16L, 405L, 739L, 660L, 629L, 66L,
64L, 365L, 1061L, 1220L, 166L, 1100L, 182L, 759L, 745L, 1131L,
302L, 757L, 938L, 391L, 371L, 119L, 278L, 135L, 117L, 995L, 21L,
1130L, 150L, 1076L, 364L, 1192L, 772L, 844L, 782L, 421L, 561L,
440L, 41L, 1201L, 963L, 706L, 652L, 1129L, 669L, 180L, 1031L,
581L, 390L, 704L, 603L, 625L, 170L, 384L, 899L, 591L, 255L, 830L,
672L, 558L, 983L, 121L, 190L, 451L, 213L, 1068L, 1042L, 234L,
545L, 40L, 543L, 1045L, 464L, 941L, 76L, 959L, 329L, 1179L, 621L,
517L), class = "data.frame")
Which looks like:
# A tibble: 10 x 5
DTI_ID Gender Age ROI value
<fct> <fct> <fct> <fct> <dbl>
1 5927 Male Old A 0.395
2 5634 Male Old C 0.433
3 5547 Female Old B 0.257
4 5979 Male Old C 0.404
5 5660 Male Old A 0.398
6 5876 Female Old D 0.426
7 5518 Male Old A 0.404
8 6001 Female Old D 0.392
9 6042 Male Old A 0.388
10 5821 Male Old A 0.344
ROI is a region of interest within each subject, so all subjects have all 4 ROIs.
I would like to calculate a 2-way ANCOVA 4(ROIs [a/b/c/d] - within) x 2 (Age [young/old] - between) + Gender [covariate] to determine the interaction effects of age and ROI on value, controlling for Gender.
To do that, I calculated:
#2-way ANOVA
res.aov2 <- df %>%
anova_test(value ~ Gender + Age*ROI, within = ROI, wid= DTI_ID)
get_anova_table(res.aov2)
which works fine and outputs:
ANOVA Table (type II tests)
Effect DFn DFd F p p<.05 ges
1 Gender 1 1227 5.196 2.30e-02 * 0.004000
2 Age 1 1227 0.732 3.92e-01 0.000596
3 ROI 3 1227 228.933 6.13e-118 * 0.359000
4 Age:ROI 3 1227 22.258 4.90e-14 * 0.052000
I then want to run a multiple comparisons to generate p values that I can graph over boxplots for visualization of the analyses.
I am using emmeans_test:
# Pairwise comparisons
pwc2 <- df %>%
group_by(ROI) %>%
emmeans_test(value ~ Age, covariate = Gender,
p.adjust.method = "bonferroni")
but receive the error:
Error in contrast.emmGrid(res.emmeans, by = grouping.vars, method = method, : Nonconforming number of contrast coefficients
I cannot figure out why, as the pairwise comparison works fine when I remove the covariate. Does it have to do with a categorical variable being used as a covariate? I am stuck and want to make sure I am reporting the appropriate p-values in my chart.
Adding Gender to group_by as well, allowed the code to run properly.

Add duplicate xyplot in lattice

This is my first post so I'm not sure if I've done this correctly. I'd like to add a second xyplot to plot1 so that it represents the same data as the bubble plot (Percent~Distance and grouped by Forest_type), but without the size of the bubble based on dat$Pixels. IE: a dot within the bubble. All dots should be black and very small. I tried as.layer with LatticeExtra, but couldn't get it to work with my limited panel and function experience. I obtained this original code from someone much more experienced and have only been able to modify it slightly.
Thanks for any suggestions.
library(lattice)
mykey <- list(x = .7, y = .7, corner = c(0,1), text = list(lab = c("D", "C", "M")),
points = list(col = c(2,3,4), pch = 1) )
fontsize <- trellis.par.get("par.main.text")
fontsize$font <- 1
trellis.par.set("par.main.text", fontsize)
trellis.par.get()
plot1<-xyplot(Percent ~ Distance, key = mykey, cex = dat$Pixels / 15000000,
col = dat$Forest_type+1,
xlab="Distance", ylab="Percent of pixels",
data = dat, panel = function(...){
panel.xyplot(...)
})
print(plot1, position=c(0, .5, 1, 1))
Data to reproduce/use are below:
dat <- structure(list(Pixels = c(51442200L, 16201800L, 9679500L, 8954100L,
4332600L, 4024800L, 2843100L, 2707200L, 2635200L, 1754100L, 1865700L,
1467000L, 1575900L, 1253700L, 1061100L, 1205100L, 1045800L, 909000L,
822600L, 732600L, 837900L, 676800L, 600300L, 538200L, 504900L,
414000L, 316800L, 318600L, 260100L, 261900L, 214200L, 189900L,
182700L, 178200L, 150300L, 135000L, 117000L, 103500L, 90000L,
95400L, 68400L, 79200L, 69300L, 54900L, 72000L, 60300L, 55800L,
41400L, 41400L, 37800L, 24300L, 25200L, 32400L, 36000L, 28800L,
19800L, 18900L, 16200L, 16200L, 60586200L, 25074900L, 18993600L,
21714300L, 13090500L, 13913100L, 10777500L, 11007900L, 11732400L,
8385300L, 9188100L, 7379100L, 8556300L, 7248600L, 6276600L, 7616700L,
6766200L, 6323400L, 5963400L, 5404500L, 6618600L, 5781600L, 5630400L,
5091300L, 5515200L, 4810500L, 4392900L, 4674600L, 4113900L, 4517100L,
3974400L, 3650400L, 3759300L, 3761100L, 3456000L, 3180600L, 2963700L,
2999700L, 2619000L, 2723400L, 2321100L, 2286000L, 2167200L, 1925100L,
1906200L, 1649700L, 1658700L, 1561500L, 1567800L, 1494900L, 1378800L,
1384200L, 1219500L, 1257300L, 1220400L, 1098000L, 1133100L, 959400L,
1044900L, 3713400L, 1295100L, 827100L, 892800L, 549000L, 561600L,
440100L, 432900L, 461700L, 319500L, 344700L, 248400L, 277200L,
221400L, 185400L, 227700L, 222300L, 206100L, 189900L, 177300L,
209700L, 189900L, 170100L, 156600L, 170100L, 163800L, 153900L,
169200L, 148500L, 185400L, 162000L, 165600L, 176400L, 149400L,
128700L, 111600L, 99000L, 83700L, 60300L, 48600L, 32400L, 27000L,
12600L, 6300L, 5400L, 8100L, 9000L, 11700L, 15300L, 16200L, 11700L,
10800L, 6300L, 5400L, 6300L, 9900L, 14400L, 15300L, 15300L),
Forest_type = c(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, 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, 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, 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, 3L, 3L, 3L, 3L, 3L, 3L, 3L,
3L), Distance = c(30L, 60L, 90L, 120L, 150L, 180L, 210L,
240L, 270L, 300L, 330L, 360L, 390L, 420L, 450L, 480L, 510L,
540L, 570L, 600L, 630L, 660L, 690L, 720L, 750L, 780L, 810L,
840L, 870L, 900L, 930L, 960L, 990L, 1020L, 1050L, 1080L,
1110L, 1140L, 1170L, 1200L, 1230L, 1260L, 1290L, 1320L, 1350L,
1380L, 1410L, 1440L, 1470L, 1500L, 1530L, 1560L, 1590L, 1620L,
1650L, 1680L, 1710L, 1740L, 1770L, 30L, 60L, 90L, 120L, 150L,
180L, 210L, 240L, 270L, 300L, 330L, 360L, 390L, 420L, 450L,
480L, 510L, 540L, 570L, 600L, 630L, 660L, 690L, 720L, 750L,
780L, 810L, 840L, 870L, 900L, 930L, 960L, 990L, 1020L, 1050L,
1080L, 1110L, 1140L, 1170L, 1200L, 1230L, 1260L, 1290L, 1320L,
1350L, 1380L, 1410L, 1440L, 1470L, 1500L, 1530L, 1560L, 1590L,
1620L, 1650L, 1680L, 1710L, 1740L, 1770L, 30L, 60L, 90L,
120L, 150L, 180L, 210L, 240L, 270L, 300L, 330L, 360L, 390L,
420L, 450L, 480L, 510L, 540L, 570L, 600L, 630L, 660L, 690L,
720L, 750L, 780L, 810L, 840L, 870L, 900L, 930L, 960L, 990L,
1020L, 1050L, 1080L, 1110L, 1140L, 1170L, 1200L, 1230L, 1260L,
1290L, 1320L, 1350L, 1380L, 1410L, 1440L, 1470L, 1500L, 1530L,
1560L, 1590L, 1620L, 1650L, 1680L, 1710L, 1740L, 1770L),
Percent = c(44.44565403, 38.05758742, 32.81164195, 28.37059427,
24.10736642, 21.75626368, 20.22018818, 19.13486005, 17.77022516,
16.77136219, 16.36794315, 16.1306284, 15.13920111, 14.37119571,
14.10455796, 13.31675783, 13.01669094, 12.22020569, 11.79202684,
11.60205245, 10.92979573, 10.18004603, 9.378515186, 9.301602115,
8.156440826, 7.683313847, 6.51369356, 6.171548117, 5.751243781,
5.275562001, 4.923458833, 4.740507751, 4.436188811, 4.358353511,
4.024096386, 3.93907563, 3.679592414, 3.24767015, 3.249918752,
3.327055869, 2.824228911, 3.31075997, 3.081232493, 2.763932941,
3.629764065, 3.509690938, 3.237597911, 2.564102564, 2.548476454,
2.440441604, 1.717557252, 1.774397972, 2.575107296, 2.772002772,
2.29390681, 1.755786113, 1.62037037, 1.634877384, 1.505016722,
52.34599773, 58.90025792, 64.38464824, 68.80061595, 72.83789874,
75.20797859, 76.64981118, 77.80534351, 79.11634399, 80.17382325,
80.60797473, 81.13805047, 82.1978212, 83.09089033, 83.43103242,
84.16708105, 84.21642209, 85.00907441, 85.48574377, 85.59007982,
86.33482038, 86.96358468, 87.9640045, 87.99191165, 89.09566735,
89.27676633, 90.32198372, 90.55090656, 90.96517413, 90.98984772,
91.35291684, 91.12558976, 91.28059441, 91.98767334, 92.53012048,
92.80462185, 93.20690631, 94.12595312, 94.57263568, 94.97802888,
95.83797845, 95.56057186, 96.35854342, 96.91889443, 96.09800363,
96.01885804, 96.24020888, 96.71125975, 96.50969529, 96.51365485,
97.45547074, 97.46514575, 96.9241774, 96.81219681, 97.20430108,
97.36632083, 97.14506173, 96.82107175, 97.0735786, 3.208348237,
3.042154666, 2.803709805, 2.82878978, 3.054734839, 3.035757723,
3.13000064, 3.059796438, 3.113430843, 3.05481456, 3.024082116,
2.731321128, 2.662977693, 2.537913959, 2.464409618, 2.516161114,
2.766886972, 2.770719903, 2.72222939, 2.807867731, 2.735383893,
2.856369297, 2.657480315, 2.706486234, 2.747891829, 3.039919826,
3.164322724, 3.277545328, 3.28358209, 3.734590283, 3.723624328,
4.133902494, 4.283216783, 3.653973145, 3.445783133, 3.256302521,
3.113501274, 2.62637673, 2.177445564, 1.694915254, 1.337792642,
1.128668172, 0.56022409, 0.317172633, 0.272232305, 0.471451021,
0.522193211, 0.724637681, 0.941828255, 1.045903544, 0.82697201,
0.760456274, 0.500715308, 0.415800416, 0.501792115, 0.877893057,
1.234567901, 1.544050863, 1.421404682), div2erroftot = c(4.966434556,
1.564186201, 0.934497422, 0.864464421, 0.418286433, 0.388570197,
0.27448418, 0.261363854, 0.254412687, 0.169347789, 0.180122097,
0.141630014, 0.152143653, 0.121037184, 0.102442814, 0.116345146,
0.100965691, 0.087758475, 0.079417075, 0.070728117, 0.080894198,
0.065340963, 0.057955349, 0.051959968, 0.048745054, 0.039969206,
0.030585132, 0.030758911, 0.025111088, 0.025284867, 0.02067972,
0.018333701, 0.017638585, 0.017204137, 0.01451056, 0.013033437,
0.011295645, 0.009992302, 0.008688958, 0.009210295, 0.006603608,
0.007646283, 0.006690498, 0.005300264, 0.006951166, 0.005821602,
0.005387154, 0.003996921, 0.003996921, 0.003649362, 0.002346019,
0.002432908, 0.003128025, 0.003475583, 0.002780467, 0.001911571,
0.001824681, 0.001564012, 0.001564012, 5.849232678, 2.42083056,
1.833717675, 2.096384872, 1.263808926, 1.343226002, 1.040502708,
1.062746441, 1.132692552, 0.809550207, 0.887055712, 0.712407658,
0.826059227, 0.699808669, 0.605967924, 0.735346507, 0.653235855,
0.610486182, 0.57573035, 0.521771922, 0.638985964, 0.558178655,
0.543581206, 0.491534348, 0.53245934, 0.4644248, 0.424108035,
0.451304473, 0.397172266, 0.436098797, 0.383704381, 0.352424132,
0.362937771, 0.363111551, 0.333655983, 0.307067772, 0.286127384,
0.289602967, 0.252848675, 0.262927866, 0.224088224, 0.220699531,
0.209230106, 0.185856809, 0.184032128, 0.159268598, 0.160137494,
0.15075342, 0.151361647, 0.144323591, 0.133114835, 0.133636172,
0.11773538, 0.121384742, 0.117822269, 0.106005286, 0.10939398,
0.092624291, 0.100878801, 0.358506403, 0.125034104, 0.079851523,
0.086194462, 0.053002643, 0.054219097, 0.042489004, 0.041793887,
0.044574354, 0.030845801, 0.033278709, 0.023981524, 0.02676199,
0.021374836, 0.017899253, 0.021983063, 0.021461726, 0.019897714,
0.018333701, 0.017117247, 0.020245272, 0.018333701, 0.01642213,
0.015118787, 0.01642213, 0.015813903, 0.014858118, 0.016335241,
0.014336781, 0.017899253, 0.015640124, 0.015987683, 0.017030357,
0.01442367, 0.01242521, 0.010774308, 0.009557854, 0.008080731,
0.005821602, 0.004692037, 0.003128025, 0.002606687, 0.001216454,
0.000608227, 0.000521337, 0.000782006, 0.000868896, 0.001129565,
0.001477123, 0.001564012, 0.001129565, 0.001042675, 0.000608227,
0.000521337, 0.000608227, 0.000955785, 0.001390233, 0.001477123,
0.001477123)), .Names = c("Pixels", "Forest_type", "Distance",
"Percent", "div2erroftot"), class = "data.frame", row.names = c(NA,
-177L))
If I understand you correctly, this is simple enough that it can be handled with a slightly modified panel function.
The panel function below first runs panel.xyplot(x,y,...) to get the plot you already have, and then adds small black points to it using the function lpoints(), which is just lattice's grid-based version of the base graphics function points().
Try this:
plot1<-xyplot(Percent ~ Distance, key = mykey, cex = dat$Pixels / 15000000,
col = dat$Forest_type+1,
xlab="Distance", ylab="Percent of pixels",
data = dat,
panel = function(x,y,...){
panel.xyplot(x,y,...)
lpoints(x, y, col="black", pch=16, cex=0.01)
})
print(plot1, position=c(0, .5, 1, 1))

Resources