Контрольная диаграмма R с несколькими линиями

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

Я хочу создать P-диаграмму с тремя ограничительными линиями (соответствующими 1, 2 и 3 SD) выше и ниже центральной линии. Я не нашел способ сделать это. Я также хотел бы, чтобы на графике было несколько разрывов, которые разделяют данные на несколько периодов времени, что я могу сделать в пакете qicharts, но не в других пакетах.

Существует несколько пакетов R для создания P-диаграмм. Мне больше всего нравится qicharts. Стандартный P-Chart из qicharts и все другие пакеты, которые я видел, генерируют график с центральной линией и верхним контрольным пределом и нижним контрольным пределом на +3 и -3 SD от центральной линии.

Я хотел бы выяснить, как создать дополнительные контрольные линии +1, +2 и -1, -2 SD на одном графике. Какой-то вариант, например

LimitLines = c(1, 2, 3) where the default is LimitlLines = 3

Вот код, измененный с r-projects, чтобы сгенерировать данные, создать диаграмму и включить два разрыва:

# Setup parameters
m.beds       <- 300
m.stay       <- 4
m.days       <- m.beds * 7
m.discharges <- m.days / m.stay
p.pu         <- 0.08

# Simulate data
discharges  <- rpois(24, lambda = m.discharges)
patientdays <- round(rnorm(24, mean = m.days, sd = 100))
n.pu        <- rpois(24, lambda = m.discharges * p.pu * 1.5)
n.pat.pu    <- rbinom(24, size = discharges, prob = p.pu)
week        <- seq(as.Date('2014-1-1'),
               length.out = 24, 
               by         = 'week') 

# Combine data into a data frame
d <- data.frame(week, discharges, patientdays,n.pu, n.pat.pu)

# Create a P-chart to measure the number of patients with pressure ulcers (n.pat.pu) each week (week) as a proportion of all discharges (discharges) with breaks one third (8) and two thirds (16) of the way through the data

qic(n.pat.pu,
n        = discharges,
x        = week,
data     = d,
chart    = 'p',
multiply = 100,
breaks   = c(8,16),
main     = 'Hospital acquired pressure ulcers (P chart)',
ylab     = 'Percent patients',
xlab     = 'Week')

person user3072084    schedule 02.08.2016    source источник
comment
Я подозреваю, что для этого вам потребуется изменить исходный код пакета. В qic.R доступно на qiccharts_0.5.1.tar.gz по адресу cran.r-project.org/web/packages/qicharts/index.html, строки 776-780, вероятно, являются хорошим местом для начала — пакет вычисляет пределы здесь.   -  person tluh    schedule 02.08.2016
comment
Спасибо, но я надеялся, что есть более простой способ - возможно, с другим пакетом или обходным путем.   -  person user3072084    schedule 03.08.2016


Ответы (1)


Если вам просто нужно представить данные, диаграмму легко создать самостоятельно. Не стесняйтесь изменять функцию в соответствии с вашими потребностями, чтобы сделать ее проще.

Данные:

Groups <- c(120, 110, 150, 110, 140, 160, 100, 150, 100, 130, 130, 100, 120, 110, 130, 110, 150, 110, 110)
Errors <- c(4, 3, 3, 3, 0, 6, 2, 2, 1, 5, 1, 5, 1, 1, 0, 1, 4, 0, 0)
Week <- length(Groups) #optional: input vector of week numbers
PchartData <- data.frame(Week,Groups,Errors)

Функция:

Shewhart.P.Chart <- function(Groups, Errors, Week)
{
## Create from scratch
# p value
p <- Errors/Groups
# pbar
pbar <- mean(p)
# calculate control limits
UCL3 <- pbar+3*sqrt((pbar * ( 1 - pbar))/Groups)
UCL2 <- pbar+2*sqrt((pbar * ( 1 - pbar))/Groups)
UCL1 <- pbar+1*sqrt((pbar * ( 1 - pbar))/Groups)
LCL1 <- pbar-1*sqrt((pbar * ( 1 - pbar))/Groups)
LCL2 <- pbar-2*sqrt((pbar * ( 1 - pbar))/Groups)
LCL3 <- pbar-3*sqrt((pbar * ( 1 - pbar))/Groups)
## adjust the minimal value of the LCL to 0
LCL3[LCL3 < 0] <- 0
LCL2[LCL2 < 0] <- 0
LCL1[LCL1 < 0] <- 0
# plot pvalues
plot(c(1:length(Groups)),p, ylim = c(min(LCL3,p),max(UCL3,p)),
    main = "p Chart \n for Prescription Errors", xlab = "weeks", 
    ylab = 'Proportion nonconforming', col = "green", pch = 20,
    lty = 1, type = "b")
# add centerline reference
abline(h = pbar, col = "red")
# plot control limits at ±1s, 2s, and 3s
lines(c(1:length(Groups)),UCL1, col = "blue", lty = 2)
lines(c(1:length(Groups)),UCL2, col = "blue", lty = 2)
lines(c(1:length(Groups)),UCL3, col = "blue", lty = 2)
lines(c(1:length(Groups)),LCL3, col = "blue", lty = 2)
lines(c(1:length(Groups)),LCL2, col = "blue", lty = 2)
lines(c(1:length(Groups)),LCL1, col = "blue", lty = 2)
}

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

person Tavrock    schedule 05.12.2016