Хобрук: Ваш путь к мастерству в программировании

R: Как визуализировать изменение двоичных / категориальных данных с течением времени

>dput(data)
structure(list(ID = c(1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 
3, 3), Dx = c(1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1), Month = c(0, 
6, 12, 18, 24, 0, 6, 12, 18, 24, 0, 6, 12, 18, 24), score = c(0, 
0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0)), .Names = c("ID", 
"Dx", "Month", "score"), row.names = c(NA, -15L), class = "data.frame")

>data
    ID Dx Month score
1   1  1     0     0
2   1  1     6     0
3   1  1    12     0
4   1  1    18     1
5   1  1    24     1
6   2  1     0     1
7   2  1     6     1
8   2  2    12     1
9   2  2    18     0
10  2  2    24     1
11  3  1     0     0
12  3  1     6     0
13  3  1    12     0
14  3  1    18     0
15  3  1    24     0

Предположим, у меня есть указанный выше data.frame. У меня 3 пациента (ID = 1, 2 или 3). Dx - диагноз (Dx = 1 - в норме, = 2 - болен). Есть переменная месяца. И, наконец, что не менее важно, это переменная результатов теста. Оценка участников является двоичной, и она может изменяться от 0 до 1 или возвращаться с 1 до 0. У меня возникли проблемы с тем, как визуализировать эти данные. Мне нужен информативный график, который смотрит на:

  1. Динамика результатов тестирования участников с течением времени.
  2. Как эта тенденция соотносится с диагнозом участников с течением времени

В моем реальном наборе данных у меня более 800 участников, поэтому я не хочу строить 800 отдельных графиков ... Я думаю, что двоичная переменная оценки теста действительно поставила меня в тупик. Любая помощь будет оценена.

04.05.2015

  • Было бы беспорядочно иметь 800 трендов на одном графике, разве вы не можете их агрегировать или что-то в этом роде? 04.05.2015
  • Оценка пациента с течением времени может быть отслежена в таблице Шухарта, см. Пакет qcc. Вы можете выбрать EWMA, CUSUM или Shewhart, которые подходят для вашей ситуации, например диаграмму C [количество месяцев] или диаграмму U [месячные ставки]. 04.05.2015

Ответы:


1

Примечание. Для части 2 необходимо выполнить множество следующих операций с данными. Часть 1 менее сложна, и вы можете увидеть, как она подходит ниже.

Использует

library(data.table)
library(ggplot2)
library(reshape2)

Для сравнения

Сначала измените Dx с 1 на 2, с 0 на 1 (предполагая, что 0 в оценке соответствует 1 в Dx)

data$Dx <- data$Dx - 1

Теперь создайте матрицу, которая возвращает 1 для 1 диагноза с 0 тестом и -1 для 1 теста с 0 диагнозом.

compare <- matrix(c(0,1,-1,0),ncol = 2,dimnames = list(c(0,1),c(0,1)))
> compare
  0  1
0 0 -1
1 1  0

Теперь давайте оценим каждое событие. Это просто ищет приведенную выше матрицу для каждой записи в вашей матрице:

data$calc <- diag(compare[as.character(data$Dx),as.character(data$score)])

* Примечание: это можно ускорить для больших матриц, используя сопоставление, но это быстрое решение для меньших наборов, таких как ваш.

Чтобы мы могли использовать агрегирование data.table:

data <- data.table(data)

Теперь нам нужно создать наши переменные:

tograph <- melt(data[, list(ScoreTrend = sum(score)/.N, 
                            Type = sum(calc)/length(calc[calc != 0]), 
                            Measure = sum(abs(calc))), 
                     by = Month],
                id.vars = c("Month"))
  • ScoreTrend: вычисляет долю положительных оценок за каждый месяц. Показывает динамику оценок во времени
  • Тип: показывает соотношение -1 и 1 с течением времени. Если это возвращает -1, все события имели рейтинг = 1, diag = 0. Если он возвращает 1, все события были diag = 1, score = 0. Ноль будет означать баланс между двумя.
  • Мера: исходное количество неверных событий.

Мы растапливаем этот фрейм данных по месяцам, чтобы создать фасетный график.

Если нет неправильных событий, мы получим NaN для Type. Чтобы установить значение 0:

tograph[value == NaN, value := 0]

Наконец, мы можем построить

ggplot(tograph, aes(x = Month, y = value)) + geom_line() + facet_wrap(~variable, ncol = 1)

Теперь мы можем увидеть на одном сюжете:

  • Количество положительных оценок по месяцам
  • Пропорция недостаточного и избыточного диагноза
  • Количество неверных диагнозов.
04.05.2015

2

С ggplot2 вы можете создавать фасеточные графики с подзаголовками для каждого пациента (см. Мое решение для работы с большим количеством графиков ниже). Пример визуализации:

library(ggplot2)
ggplot(data, aes(x=Month, y=score, color=factor(Dx))) +
  geom_point(size=5) +
  scale_x_continuous(breaks=c(0,6,12,18,24)) +
  scale_color_discrete("Diagnosis",labels=c("normal","diseased")) +
  facet_grid(.~ID) +
  theme_bw()

который дает:

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


Включение 800 пациентов в один участок может быть многовато, как уже упоминалось в комментариях к вопросу. Есть несколько вариантов решения этой проблемы:

  1. Сгруппируйте данные.
  2. Создайте подгруппы пациентов и составьте график для каждой подгруппы.
  3. Отфильтруйте всех пациентов, которые никогда не болели.

Что касается последнего предложения, вы можете сделать это с помощью следующего кода (который я адаптировал из ответа на один из моих собственные вопросы):

deleteable <- with(data, ave(Dx, ID, FUN=function(x) all(x==1)))
data2 <- data[deleteable==0,]

Вы также можете использовать это для создания новой переменной, идентифицирующей пациента, который был болен:

data$neverill <- with(data, ave(Dx, ID, FUN=function(x) all(x==1)))

Затем вы можете, например, агрегировать данные с несколькими группирующими переменными (например, Month, neverill).

04.05.2015
Новые материалы

Решения DBA Metrix
DBA Metrix Solutions предоставляет удаленного администратора базы данных (DBA), который несет ответственность за внедрение, обслуживание, настройку, восстановление базы данных, а также другие..

Начало работы с Блум
Обзор и Codelab для генерации текста с помощью Bloom Оглавление Что такое Блум? Некоторые предостережения Настройка среды Скачивание предварительно обученного токенизатора и модели..

Создание кнопочного меню с использованием HTML, CSS и JavaScript
Вы будете создавать кнопочное меню, которое имеет состояние наведения, а также позволяет вам выбирать кнопку при нажатии на нее. Финальный проект можно увидеть в этом Codepen . Шаг 1..

Внедрите OAuth в свои веб-приложения для повышения безопасности
OAuth — это широко распространенный стандарт авторизации, который позволяет приложениям получать доступ к ресурсам от имени пользователя, не раскрывая его пароль. Это позволяет пользователям..

Классы в JavaScript
class является образцом java Script Object. Конструкция «class» позволяет определять классы на основе прототипов с чистым, красивым синтаксисом. // define class Human class Human {..

Как свинг-трейдеры могут использовать ИИ для больших выигрышей
По мере того как все больше и больше профессиональных трейдеров и активных розничных трейдеров узнают о возможностях, которые предоставляет искусственный интеллект и машинное обучение для улучшения..

Как построить любой стол
Я разработчик программного обеспечения. Я люблю делать вещи и всегда любил. Для меня программирование всегда было способом создавать вещи, используя только компьютер и мое воображение...