Отредактировано: Как написать цикл для теста PostHoc Tukey и множественного сравнения

Это мой образец большой матрицы данных, и каждый столбец назван с несколькими данными и разделен подчеркиванием.

structure(list(Gene = c("AGI4120.1_UBQ", "AGI570.1_Acin"), WT_Tissue_0T_1 = c(0.886461437, 1.093164915), WT_Tissue_0T_2 = c(1.075140682, 1.229862834), WT_Tissue_0T_3 = c(0.632903012, 1.094003128), WT_Tissue_1T_1 = c(0.883151274, 1.26322126), WT_Tissue_1T_2 = c(1.005627276, 0.962729188), WT_Tissue_1T_3 = c(0.87123469, 0.968078993), WT_Tissue_3T_1 = c(0.723601456, 0.633890322), WT_Tissue_3T_2 = c(0.392585237, 0.534819363), WT_Tissue_3T_3 = c(0.640185369, 1.021934772), WT_Tissue_5T_1 = c(0.720291294, 0.589244505), WT_Tissue_5T_2 = c(0.362131744, 0.475251717), WT_Tissue_5T_3 = c(0.549486925, 0.618177919), mut1_Tissue_0T_1 = c(1.464415756, 1.130533457), mut1_Tissue_0T_2 = c(1.01489573, 1.114915728), mut1_Tissue_0T_3 = c(1.171797418, 1.399956009), mut1_Tissue_1T_1 = c(0.927507448, 1.231911575), mut1_Tissue_1T_2 = c(1.089705396, 1.256782289 ), mut1_Tissue_1T_3 = c(0.993048659, 0.999044465), mut1_Tissue_3T_1 = c(1.000993049, 1.103486794), mut1_Tissue_3T_2 = c(1.062562066, 0.883617224 ), mut1_Tissue_3T_3 = c(1.037404833, 0.851875438), mut1_Tissue_5T_1 = c(0.730883813, 0.437440083), mut1_Tissue_5T_2 = c(0.480635551, 0.298762126 ), mut1_Tissue_5T_3 = c(0.85468388, 0.614923997)), row.names = c(NA, -2L), class = c("tbl_df", "tbl", "data.frame"), spec = structure(list( cols = list(Gene = structure(list(), class = c("collector_character", "collector")), WT_Tissue_0T_1 = structure(list(), class = c("collector_double", "collector")), WT_Tissue_0T_2 = structure(list(), class = c("collector_double", "collector")), WT_Tissue_0T_3 = structure(list(), class = c("collector_double", "collector")), WT_Tissue_1T_1 = structure(list(), class = c("collector_double", "collector")), WT_Tissue_1T_2 = structure(list(), class = c("collector_double", "collector")), WT_Tissue_1T_3 = structure(list(), class = c("collector_double", "collector")), WT_Tissue_3T_1 = structure(list(), class = c("collector_double", "collector")), WT_Tissue_3T_2 = structure(list(), class = c("collector_double", "collector")), WT_Tissue_3T_3 = structure(list(), class = c("collector_double", "collector")), WT_Tissue_5T_1 = structure(list(), class = c("collector_double", "collector")), WT_Tissue_5T_2 = structure(list(), class = c("collector_double", "collector")), WT_Tissue_5T_3 = structure(list(), class = c("collector_double", "collector")), mut1_Tissue_0T_1 = structure(list(), class = c("collector_double", "collector")), mut1_Tissue_0T_2 = structure(list(), class = c("collector_double", "collector")), mut1_Tissue_0T_3 = structure(list(), class = c("collector_double", "collector")), mut1_Tissue_1T_1 = structure(list(), class = c("collector_double", "collector")), mut1_Tissue_1T_2 = structure(list(), class = c("collector_double", "collector")), mut1_Tissue_1T_3 = structure(list(), class = c("collector_double", "collector")), mut1_Tissue_3T_1 = structure(list(), class = c("collector_double", "collector")), mut1_Tissue_3T_2 = structure(list(), class = c("collector_double", "collector")), mut1_Tissue_3T_3 = structure(list(), class = c("collector_double", "collector")), mut1_Tissue_5T_1 = structure(list(), class = c("collector_double", "collector")), mut1_Tissue_5T_2 = structure(list(), class = c("collector_double", "collector")), mut1_Tissue_5T_3 = structure(list(), class = c("collector_double", "collector"))), default = structure(list(), class = c("collector_guess", "collector"))), class = "col_spec"))

Я хочу следовать тесту Тьюки и построить гистограммы для каждого гена (ответ против времени; заполненный обоими генотипами) с несколькими буквами сравнения.

Синтаксис

df1 <- df %>% 
         gather(var, response, WT_Tissue_0T_1:mut1_Tissue_5T_3) %>% 
         separate(var, c("Genotype", "Tissue", "Time"), sep = "_") %>% 
         arrange(desc(Gene))
df2 <- df1 %>% 
         group_by(`Gene`,Genotype,Tissue,Time) %>% 
         mutate(Response=mean(response),n=n(),se=sd(response)/sqrt(n))

Двухсторонний ANOVA

fit1 <- aov(Response ~ Genotype*Time, df2) 

Далее я хочу перейти к тесту Тьюки (множественное сравнение), например, для гена "AGI4120.1_UBQ", построить график зависимости ответа от времени и посмотреть, как ведет себя каждый генотип (WT & mut1) в каждой временной точке (0T, 1T, 3T). и 5т)? если ответ существенно отличается или нет и обозначается буквами на графике.

Как показано ниже, синтаксис lsmeans объединяет все гены в один и дает вывод, как я могу сделать так, чтобы он зацикливался для каждого гена отдельно (то есть "AGI4120.1_UBQ", "AGI570.1_Acin") и получал буквы, чтобы показать статистически различные группы (иначе) компактный буквенный дисплей ")

 lsmeans(fit1, pairwise ~ Genotype | Time) 

Моя конечная цель состоит в том, чтобы построить каждый ген, как на графике ниже, и обозначить значимые буквы.

df2$genotype <- factor(df2$genotype, levels = c("WT","mut1")) colours <- c('#336600','#ffcc00')library(ggplot2)ggplot(df2,aes( x=Time, y=Response, fill=Genotype))+geom_bar(stat='identity', position='dodge')+scale_fill_manual(values=colours)+geom_errorbar(aes(ymin=average_measure-se, ymax=average_measure+se)+facet_wrap(~`Gene`)+labs(x='Time', y='Response')

Ожидается График для обозначения компактного отображения букв

Буду признателен за помощь, если это возможно.

1 ответ

Есть несколько проблем с вашим кодом. Я бы сказал, что это не совсем подходящая статья для Stackru, поскольку проблемы здесь разнообразны и не могут быть расширены за пределы этого специфического сочетания ошибок и синтаксических проблем. Но я отправлю несколько предложений в качестве ответа, чтобы вы начали - надеюсь, они помогут.

1. lsmeans() :
Эта функция ожидает подгонки модели (например, из lm()) или ref.grid объект. Но вы передаете ему фрейм данных без каких-либо свойств регрессии, необходимых для вычисления наименьших квадратов. (Подумай: как lsmeans() знать, какой должна быть зависимая переменная, когда вы запрашиваете парное сравнение с Genes в качестве независимой переменной?) Проверьте использование lsmeans документация для более подробной информации.

Исходя из ваших данных, я бы сказал, что вы, вероятно, хотите запустить многоуровневую регрессию, используя что-то вроде lme4 пакет, с Gene а также Genotype и возможно Time как вложенные уровни группировки.

Но для демонстрации я буду держать это просто с lm(), Передача подогнанного объекта регрессии lsmeans() работает как задумано:

fit <- lm(Response ~ Gene + Genotype + Time, data=df2)

lsmeans(fit, pairwise ~ Gene)[[2]] 

# Output
contrast                        estimate        SE df t.ratio p.value
AGI4120.1_UBQ - AGI570.1_Acin -0.0515123 0.0299492 42   -1.72  0.0928

Results are averaged over the levels of: Genotype, Time 

2. ggplot() :
Вы не определили colours или же average_measure в коде, который вы предоставили; вызов этих необъявленных переменных приведет к сбою.

Конструктивно я бы предложил вам использовать df1 и разрешить ggplot делать группировку, а не group_by в df2, Тогда используйте stat="summary" а также fun.y="mean" для достижения summarise() вычисления, которые вы сделали в df2, Это также позволяет вам использовать mean_se Функция для ваших ошибок. Как это:

ggplot(df1,aes( x=Time, y=response, fill=Genotype))+ 
  geom_bar(stat='summary', fun.y='mean', position=position_dodge(0.9))+
    stat_summary(fun.data = mean_se, geom = "errorbar", 
                 color="gray60", width=.1, position=position_dodge(0.9)) +
  scale_fill_manual(values=c("steelblue","orange"))+
  facet_wrap(~`Gene`)+ 
  labs(x='Time', y='Response')

фацетный сюжет

Наконец, обратите внимание, что ваше использование separate() в df1 выдаст предупреждение, хотя и не будет ошибкой, так как при разбиении на sep="_", Вы можете избежать этого (если это вызывает путаницу), добавив уровень для захвата окончательного значения (которое выглядит как временной индекс):

separate(var, c("Genotype", "Tissue", "Time", "Index"), sep = "_")
Другие вопросы по тегам