Построение среднего и st-dev из набора данных с несколькими значениями y для значения x

#r

#r

Вопрос:

Мои данные организованы как таковые:

 Distance r^2
0        1
0        0.9
0        0
0        0.8
0        1 
1        0.5 
1        0.45
1        0.56
1        1
2        0  
2        0.9
3        0
3        0.1
3        0.2
3        0.3
...
300      1 
300      0.8 
  

Я хочу построить график затухания r ^ 2 с расстоянием, то есть я хочу построить среднее значение st-dev для каждого уникального значения расстояния. Итак, у меня должна быть 1 точка при x = 0, 1 точка при x = 1… но у меня есть несколько значений x = 0.

Каков наилучший способ добиться этого, учитывая, как организованы данные? Я хотел бы сделать это в R, если это возможно.

Спасибо, Адриан

Редактировать: я пытался:

 > dd <-structure(list(Distance = dist18, r.2 = a18[,13]), Names = c("Distance",   "r^2"), class = "data.frame", row.names = c(NA, -15L))
> ggplot(dd, aes(x=Distance, y=r.2))   stat_summary(fun.data="mean_sdl")
Error in data.frame(x = c(42L, 209L, 105L, 168L, 63L, 212L, 148L, 175L,  : arguments imply differing number of rows: 126877, 15
> head(dist18)
[1]  42 209 105 168  63 212
> head(dd)
Distance  r.2
1       42 0.89
2      209 0.92
3      105 0.91
4      168 0.81
5       63 0.88
6      212 0.88
  

Это потому, что мои данные не отсортированы?

Ответ №1:

Вы также можете построить SD в виде области вокруг среднего значения, аналогичной построению CI (при temp условии, что это ваш набор данных)

 library(data.table)
library(ggplot2)
temp <- setDT(temp)[, list(Mean = mean(r.2), SD = sd(r.2)), by = Distance]
ggplot(temp)   geom_point(aes(Distance, Mean))   geom_ribbon(aes(x = Distance, y = Mean, ymin = (Mean - SD), ymax = (Mean   SD)), fill = "skyblue", alpha = 0.4)
  

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

Ответ №2:

Его использование dplyr будет выглядеть примерно так:

 df = data.frame(distance = rep(1:300, each = 10), r2 = runif(3000))

library(dplyr)
df_group = group_by(df, distance)
summarise(df_group, mn = mean(r2), s = sd(r2))Source: local data frame [300 x 3]
   distance        mn         s
1       300 0.4977758 0.3565554
2       299 0.4295891 0.3281598
3       297 0.5346428 0.3424429
4       296 0.4623368 0.3163320
5       291 0.3224376 0.2103655
6       290 0.3916658 0.2115264
7       288 0.6147680 0.2953960
8       287 0.3405524 0.2032616
9       286 0.5690844 0.2458538
10      283 0.2901744 0.2835524
..      ...       ...       ...
  

Где df находится data.frame с вашими данными distance и r2 именами двух столбцов.

Ответ №3:

это должно сработать.

 # Create a data frame like yours

df=data.frame(sample(50,size=300,replace=TRUE),runif(300))
colnames(df)=c('Distance','r^2')

#initialize empty data frame with columns x, mean and stdev

results=data.frame(x=numeric(0),mean=numeric(0),stdev=numeric(0))
count=1 
for (i in 0:max(df$Distance)){
    results[count,'x']=i
    temp_mean=mean(df[which(df$Distance==i),'r^2'])
    results[count,'mean']=temp_mean
    temp_sd=sd(df[which(df$Distance==i),'r^2'])
    results[count,'stdev']=temp_sd
    count=count 1
}
# Plot your results
plot(results$x,results$mean,xlab='distance',ylab='r^2')

epsilon=0.02 #to add the little horizontal bar to the error bars
for (i in 1:nrow(results)){
     up = results$mean[i]   results$stdev[i]
    low = results$mean[i] - results$stdev[i]
    segments(results$x[i],low , results$x[i], up)
    segments(results$x[i]-epsilon, up , results$x[i] epsilon, up)
    segments(results$x[i]-epsilon, low , results$x[i] epsilon, low)
}
  

Вот результат http://imgur.com/ED7PwD8

Ответ №4:

Если вы хотите построить среднее значение и /- 1 sd для каждой точки, ggplot function это упрощает. С помощью тестовых данных

 dd<-structure(list(Distance = c(0L, 0L, 0L, 0L, 0L, 1L, 1L, 1L, 1L, 
2L, 2L, 3L, 3L, 3L, 3L), r.2 = c(1, 0.9, 0, 0.8, 1, 0.5, 0.45, 
0.56, 1, 0, 0.9, 0, 0.1, 0.2, 0.3)), .Names = c("Distance", "r.2"
), class = "data.frame", row.names = c(NA, -15L))
  

вы можете просто запустить

 library(Hmisc)

ggplot(dd, aes(x=Distance, y=r.2))  
   stat_summary(fun.data="mean_sdl", mult=1)
  

что приводит к

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

Я попробовал с вашими реальными данными и получил

 real <- read.table("http://pelinfamily.ca/bio/GDR-18_conc.ld", header=F)
dd <- data.frame(Distance=real[,2]-real[,1], r.2=real[,13])

ggplot(dd, aes(x=Distance, y=r.2))  
   stat_summary(fun.data="mean_sdl", mult=1, geom="ribbon", alpha=.4)   
   stat_summary(fun.data="mean_sdl", mult=1, geom="line")
  

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

Комментарии:

1. Спасибо за ответ, я получил это:> ggplot(dd, aes(x = Расстояние, y = r.2)) stat_summary(fun.data =»mean_sdl») Ошибка в data.frame(x = c(42L, 209L, 105L, 168L, 63L, 212L, 148L, 175L, : аргументы подразумевают разное количество строк: 126877, 15> head(dist18) [1] 42 209 105 168 63 212

2. Это то, что вы получаете, выполняя точный код выше? Какие версии пакетов у вас есть? Я использовал Hmisc_3.14-4 и ggplot2_1.0.0.

3. обе версии идентичны моей. Должно быть что-то в данных, которые я неправильно показываю. Вы не против попробовать это на моих реальных данных? pelinfamily.ca/bio/GDR-18_conc.ld ; расстояние равно «column2-column1» (минус), а r ^ 2 равно column13.

4. @AdrianP. Я обновил свое решение, используя реальные данные. Я не уверен, что col 13 — это r^2 потому, что, если это так, это нечетный шаблон для низких значений на небольшом расстоянии.

5. Должно быть, я сделал что-то не так. Спасибо, это отлично работает!