#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()
Тот же код, что и выше, теперь обеспечивает правильный сюжет.