R скользящее среднее для вневременных данных

Это сюжет, который у меня сейчас есть. введите описание изображения здесь

Он генерируется из этого кода:

ggplot(data1, aes(x=POS,y=DIFF,colour=GT)) + 
  geom_point() +
  facet_grid(~ CHROM,scales="free_x",space="free_x") + 
  theme(strip.text.x = element_text(size=40),
        strip.background = element_rect(color='lightblue',fill='lightblue'),
        legend.position="top",
        legend.title = element_text(size=40,colour="lightblue"),
        legend.text = element_text(size=40),
        legend.key.size = unit(2.5, "cm")) +
  guides(fill = guide_legend(title.position="top",
                             title = "Legend:GT='REF'+'ALT'"),
         shape = guide_legend(override.aes=list(size=10))) +
  scale_y_log10(breaks=trans_breaks("log10", function(x) 10^x, n=10)) + 
  scale_x_continuous(breaks = pretty_breaks(n=3)) +
  geom_line(stat = "hline",
            yintercept = "mean",
            size = 1)

Последняя строка geom_line создает среднюю линию для каждой панели.

Но теперь я хочу, чтобы на каждой панели было более конкретное скользящее среднее.

т.е. если panel1('chr01') имеет диапазон оси x от 0 до 100000000, я хотел бы иметь среднее значение для каждого диапазона 1000000.

mean1 = mean(x=0 to x=1,000,000)

mean2 = mean(x=1,000,001 to x=2,000,000)

person TYZ    schedule 31.01.2014    source источник


Ответы (1)


Один из способов получить текущее среднее - это geom_smooth() использовать loess метод локальной регрессии. Чтобы продемонстрировать предлагаемое мной решение, я создал поддельный набор геномных данных, используя R-функции. Вы можете настроить параметр span для geom_smooth, чтобы сделать скользящее среднее более плавным (ближе к 1,0) или более грубым (ближе к 1 / количество точек данных).

# Create example data.
set.seed(27182)

y1 = rnorm(10000) + 
     c(rep(0, 1000), dnorm(seq(-2, 5, length.out=8000)) * 3, rep(0, 1000))
y2 = c(rnorm(2000), rnorm(1000, mean=1.5), rnorm(1000, mean=-1, sd=2), 
       rnorm(2000, sd=2))
y3 = rnorm(4000)
pos = c(sort(runif(10000, min=0, max=1e8)),
        sort(runif(6000,  min=0, max=6e7)),
        sort(runif(4000,  min=0, max=4e7)))
chr = rep(c("chr01", "chr02", "chr03"), c(10000, 6000, 4000))

data1 = data.frame(CHROM=chr, POS=pos, DIFF=c(y1, y2, y3))

# Plot.
p = ggplot(data1, aes(x=POS, y=DIFF)) +
    geom_point(alpha=0.1, size=1.5) +
    geom_smooth(colour="darkgoldenrod1", size=1.5, method="loess", degree=0, 
        span=0.1, se=FALSE) +
    scale_x_continuous(breaks=seq(1e7, 3e8, 1e7), 
        labels=paste(seq(10, 300, 10)), expand=c(0, 0)) +
    xlab("Position, Megabases") +
    theme(axis.text.x=element_text(size=8)) +
    facet_grid(. ~ CHROM, scales="free", space="free")

ggsave(filename="plot_1.png", plot=p, width=10, height=5, dpi=150)

введите описание изображения здесь

person bdemarest    schedule 01.02.2014
comment
Проведенная золотая линия - это среднее значение, верно? Возможно ли иметь среднее значение для каждого типа мутации. То есть это похоже на то, что несколько из вышеприведенных графиков, которые вы создали, перекрываются вместе, поэтому для каждого типа мутации я использовал разные цвета для представления. Спасибо! - person TYZ; 03.02.2014
comment
Вы можете видеть из моего графика, что для каждой панели есть несколько средних линий, я хотел бы иметь текущее среднее значение для всех из них. Но не знаю, как это сделать. - person TYZ; 03.02.2014
comment
Попробуйте добавить aes(colour=MUTATION_TYPE, group=MUTATION_TYPE) к вызову ggplot() и удалить colour= изнутри geom_smooth(). Невозможно протестировать без данных нового примера. - person bdemarest; 03.02.2014