如何通过因子变量绘制多列的平均值

时间:2016-07-20 03:47:10

标签: r ggplot2

我试图绘制具有2个独立变量的因变量的基本计算的平均时间序列数据。 DV =瞳孔扩张(在多个时间点“T”)响应于执行电动机任务(IV_A)并结合3个不同的噪声信号(IV_B)。

我想绘制每个时间点受试者的平均扩张(每个T列的平均值),每个条件都有单独的行。

因此,x轴将为T1至T5,并且具有用于IV_A(= 1)的单独线:IV_B(= 1),IV_A(= 1):IV_B(= 2)和IV_A(= 1):IV_B (= 3)

根据外观,我可能希望在单独的图上使用IV_A(= 2)行。但是,所有在一个图表中都可以进行简单的视觉比较。

我想知道我是否需要融化数据,使其非常长(大约有110 T列),或者如果没有重组数据框就可以完成我想要的工作。

数据看起来像这样:

Subject   IV_A    IV_B      T1     T2     T3    T4    T5
1           1      1         0.2   0.3   0.5    0.6   0.3
1           1      2         0.3   0.2   0.3    0.4   0.4 
1           1      3         0.2   0.4   0.5    0.2   0.3
1           2      1         0.3   0.2   0.3    0.4   0.4 
1           2      2         0.2   0.3   0.5    0.6   0.3
1           2      3         0.2   0.4   0.5    0.2   0.3 
2           1      1         0.2   0.3   0.5    0.6   0.3
2           1      2         0.3   0.2   0.3    0.4   0.4 
2           1      3         0.2   0.4   0.5    0.2   0.3
2           2      1         0.3   0.2   0.3    0.4   0.4 
2           2      2         0.2   0.3   0.5    0.6   0.3
2           2      3         0.2   0.4   0.5    0.2   0.3
3           1      1         0.2   0.3   0.5    0.6   0.3
3           1      2         0.3   0.2   0.3    0.4   0.4 
3           1      3         0.2   0.4   0.5    0.2   0.3
3           2      1         0.3   0.2   0.3    0.4   0.4 
3           2      2         0.2   0.3   0.5    0.6   0.3
3           2      3         0.2   0.4   0.5    0.2   0.3  

编辑:

不幸的是,我不能将@ eipi10的代码改编为我的实际数据框,如下所示:

Subject Trk_Y.N  NsCond     X.3     X.2  X.1  X0    X1    X2   X3
    1        N      Pink    0.3     0.4  0.6  0.4  0.8   0.6  0.6
    1        N      Babble  0.3     0.4  0.6  0.4  0.8   0.6  0.6
    1        N      Loss    0.3     0.4  0.6  0.4  0.8   0.6  0.6
    1        Y      Pink    0.3     0.4  0.6  0.4  0.8   0.6  0.6
    1        Y      Babble  0.3     0.4  0.6  0.4  0.8   0.6  0.6
    1        Y      Loss    0.3     0.4  0.6  0.4  0.8   0.6  0.6

Trk_Y.N表示具有或不具有辅助电机跟踪任务的块(“是”或“否”)。 NsCond是语音刺激所呈现的噪声类型。

将“Y”替换为“跟踪”,将“N”替换为“No_Tracking”可能更好。

我试过了:

test_data[test_data$Trk_Y.N == "Y",]$Trk_Y.N = "Tracking"

但得到了一个错误:

Warning message:
In `[<-.factor`(`*tmp*`, iseq, value = c("Tracking", "Tracking",  :
  invalid factor level, NA generated

1 个答案:

答案 0 :(得分:2)

我可能没有理解您的数据结构,所以如果这不是您的想法,请告诉我:

library(reshape2)
library(ggplot2)
library(dplyr)

“融化”数据到长格式。这将为每个SubjectIVTime提供一个观察点:

# Convert the two `IV` columns into a single column
df.m = df %>% mutate(IV = paste0("A",IV_A,":","B",IV_B)) %>% select(-IV_A,-IV_B)

# Melt to long format
df.m = melt(df.m, id.var=c("Subject","IV"), variable.name="Time", value.name="Pupil_Dilation")

head(df.m)
  Subject    IV Time Pupil_Dilation
1       1 A1:B1   T1            0.2
2       1 A1:B2   T1            0.3
3       1 A1:B3   T1            0.2
4       1 A2:B1   T1            0.3
5       1 A2:B2   T1            0.2
6       1 A2:B3   T1            0.2

现在,我们可以绘制一条线,为每个Pupil_Dilation级别的每个Time点提供IV的平均值,加上95%的置信区间。在您的示例数据中,每个Time级别的每个IV只有一个度量值,因此下面的示例图表中不包含95%的置信区间。但是,如果您在实际数据中有多个度量值,则可以使用下面的代码来包含置信区间:

pd=position_dodge(0.5)

ggplot(df.m, aes(Time, Pupil_Dilation, colour=IV, group=IV)) +
  stat_summary(fun.data=mean_cl_boot, geom="errorbar", width=0.1, position=pd) +
  stat_summary(fun.y=mean, geom="line", position=pd) +
  stat_summary(fun.y=mean, geom="point", position=pd) +
  scale_y_continuous(limits=c(0, max(df.m$Pupil_Dilation)))  +
  theme_bw()

enter image description here