R линейный график для повторных измерений с толщиной линии, отражающей количество наблюдений

#r #plot #line

Вопрос:

Вопрос 1: Давайте предположим, что я провел эксперимент «до-после» (повторные измерения с двумя точками во времени) со 100 испытуемыми. Каждый испытуемый ставит оценку по числовой шкале от 1 до 3 в состоянии » до «(при T1) и снова, после применения некоторого лечения, в состоянии «после» (при T2). Поведение каждого испытуемого в эксперименте можно описать как «переход от значения балла при T1 к значению балла при T2». Например, от 2 до 3, или от 1 до 1, или от 3 до 1 и так далее… Декартово произведение говорит нам, что теоретически возможны 9 различных типов переходов. Для каждого типа перехода я рассчитал (во внешней программе) количество наблюдений. Это дает следующий кадр данных:

 MyData1 <- data.frame(TransitionTypeID=seq(1:9), T1=c(1,1,1,2,2,2,3,3,3), T2=c(1,2,3,1,2,3,1,2,3), Count=c(2,14,0,18,12,8,23,12,11))
MyData1
 

Для каждого значения оценки (по оси y) я хотел бы построить точку и линию между T1 и T2 (по оси x), тогда как толщина линии между T1 и T2 должна (каким-то образом) соответствовать количеству, которое наблюдается. Сюжет должен просто визуализировать, какие переходы происходят чаще, чем другие. Есть какие-нибудь намеки?

Вопрос 2: Хотя некоторые предварительные шаги расчета в приведенном выше примере были выполнены за пределами R (в MS Access), я считаю, что должен существовать способ достижения желаемого результата изнутри R, т. Е. с использованием фрейма данных с отдельными записями для каждого субъекта и каждого момента времени (т. Е. с двумя строками для каждого субъекта, одна для оценки в T1 и одна для T2, следовательно, в «длинном» формате). В этом случае фрейм данных выглядит примерно так:

 MyData2 <- data.frame(SubjectID=seq(1:100), Condition = c(rep("T1",100), rep("T2",100)), Score=floor(runif(200,min=1, max=4)))

library(ggplot2)

ggplot(data = MyData2, aes(x = Condition, y = Score, group = SubjectID))    geom_line()
 

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

Ответ №1:

Вот возможное решение вопроса 1.

 MyData1 <- data.frame(TransitionTypeID=seq(1:9), 
                      T1=c(1,1,1,2,2,2,3,3,3), 
                      T2=c(1,2,3,1,2,3,1,2,3), 
                      Count=c(2,14,0,18,12,8,23,12,11))
MyData1

df <- data.frame(x=rep(c("T1","T2"), each=nrow(MyData1)),
                 y=c(MyData1$T1,MyData1$T2),
                 ID=rep(MyData1$TransitionTypeID,2),
                 cnt=rep(MyData1$Count,2)
)
df_lb <- data.frame(x=rep(c("T1","T2"), each=3),
                     y=rep(1:3,2),
                     hj=rep(c(2,-1),each=3))

library(ggplot2)
pal <- colorRampPalette(c("white","blue","red"))
ggplot(data=df, aes(x=x, y=y, group=ID, size=cnt, color=cnt))  
  geom_line()  
  geom_point(show.legend=F)  
  labs(x="", y="Score")  
  scale_color_gradientn(colours=pal(10))  
  geom_text(data=df_lb, aes(x=x, y=y, label=y), size=7, inherit.aes=F, hjust=df_lb$hj)  
  theme_void()
 

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

Ответ №2:

По вопросу № 1

Вы очень аккуратно достигаете своей цели с помощью geom_segment :

 ggplot( data=cbind( MyData1 ), 
        aes(x=1, y=T1,xend=2, yend=T2 ,size=Count))  
            geom_segment()
 

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

Я подозреваю, что вам нужно будет изменить 0 отсчетов на NA, чтобы этот переход 1->3 исчез. Я думаю, что размер 0 должен заставить сегмент исчезнуть, но, очевидно, Хэдли думает иначе.

Да:

  is.na(MyData1 ) <- MyData1==0
 ggplot( data=cbind( MyData1 ), aes(x=1, y=T1,xend=2, yend=T2 ,size=Count)) geom_segment()
 

Тот же код, что и выше, теперь обеспечивает правильный сюжет.

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