Новая сложность цветового кодирования на основе процентиля и другого фактора в ggplot.

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

Вот мой код, который у меня есть после всех полезных предложений, которые я получил из моего первого сообщения Точки цветового кода на основе процентиля в ggplot (примечание: это некоторые выдуманные данные, хотя у меня есть реальные данные, в которых гораздо больше записей:

dat <- data.frame(key = c("a1-a3", "a1-a2"), position = 1:100, fst = rlnorm(200, 0, 1), fet = rnorm(200, 0.24, 0.54))

#Get quantiles
quants <- quantile(dat$fst, c(0.95, 0.99))

dat$quant  <- with(dat, factor(ifelse(fst < quants[1], 0,
                                  ifelse(fst < quants[2], 1, 2))))

dat$fisher <- with(dat, factor(ifelse(fet > 1.30102999566398, 0, 1)))

dat$col <- with(dat, factor(ifelse(fet < 1.30102999566398, 3, quant)))

########theme set
theme_set(theme_bw(base_size = 10))

p1 <- ggplot(dat, aes(x=position, y=fst)) +
  geom_point(aes(colour = col, size=0.2)) +
  facet_wrap(~key, nrow = 1) +
  scale_colour_manual(values = c("black", "blue", "red", "grey"), labels = c("0-95", "95-99", "99-100", "fail")) +
  ylab(expression(F[ST])) +
  xlab("Genomic Position (Mb)") +
  scale_x_continuous(breaks=c(0, 1e+06, 2e+06, 3e+06, 4e+06), labels=c("0", "1", "2", "3", "4")) +
  scale_y_continuous(limits=c(0,1)) +
  theme(plot.background = element_blank(),
    panel.background = element_blank(),
    panel.border = element_blank(),
    legend.position="none",
    legend.title = element_blank()
    )

tiff(Fstvalues_colourcode3.tiff", height=2.5, width=6.5, units="in", res = 300, pointsize="10")
p1
dev.off()

Моя проблема в строке: dat$col ‹- with(dat, factor(ifelse(fet ‹ 1.30102999566398, 3, квант))). Я хочу, чтобы он использовал значение из $quant, если оно имеет значение $fet выше указанного выше значения (или fisher == 0), и если оно имеет значение $fet ниже, я хотел бы, чтобы он создал новый фактор (3). Когда я смотрю на фрейм данных, он делает что-то другое. Любые комментарии/предложения очень ценятся! (Я новичок в кодировании, и я обнаружил, что с факторами нелегко работать!!)


person ONeillMB1    schedule 12.10.2013    source источник


Ответы (1)


Да, вы правы, with(dat, factor(ifelse(fet < 1.30102999566398, 3, quant))) дает "неожиданный" результат. Ваше возвращаемое значение no в ifelse, квант factor, приводится к тому же классу, что и возвращаемое значение yes (3), numeric. Посмотрите на tail(dat[order(dat$fet), c("fet", "quant", "col")]):

#          fet quant col
# 6   1.202582     0   3
# 40  1.318997     0   1
# 74  1.324552     0   1
# 24  1.415189     1   2
# 38  1.418230     0   1
# 123 1.531584     0   1 

Для fet > 1,301 (test в ifelse) "col" стало 1, 1, 2, 1, 1 вместо 0, 0, 1, 0, 0. Произошло нечто подобное:

# original factor version of quant
quant <- as.factor(0:2)
quant
# [1] 0 1 2
# Levels: 0 1 2

# coerce quant to numeric
as.numeric(quant)
# [1] 1 2 3

Сравните эти два:

set.seed(1)
df <- data.frame(fet = rnorm(9), quant = factor(0:2))
str(df)
df$col <- with(df, ifelse(fet < 0, 3, quant))
df

set.seed(1)
df <- data.frame(fet = rnorm(9), quant = 0:2)
str(df)
df$col <- with(df, ifelse(fet < 0, 3, quant))
df

Таким образом, попробуйте удалить factor из вызова ifelse, где вы создаете 'quant', и посмотрите, решит ли это проблему.

См. также 8.2.1 здесь: http://www.burns-stat.com/pages/Tutor/R_inferno.pdf‎.

PS. Как вы формулируете свой вопрос, единственная ifelse строка - это ваша настоящая проблема (а не часть графика). Если это так, вы можете изолировать эту проблему и сжать свой вопрос.

person Henrik    schedule 12.10.2013
comment
Это очень полезно, но ведет себя непредсказуемо. Преподавательские обязанности, работа в лаборатории и приложения для стипендий какое-то время не давали мне поиграть с кодом, но я еще раз взгляну на него на этой неделе, напишу обновление и попытаюсь докопаться до сути. Кажется, я могу заставить работать только одну цветовую схему или другую одновременно с реальными данными. - person ONeillMB1; 11.11.2013