#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. Должно быть, я сделал что-то не так. Спасибо, это отлично работает!