Несколько ящиков с предопределенной статистикой с использованием решетчатых графов в r

У меня есть набор данных, который выглядит так

 VegType    87MIN   87MAX   87Q25   87Q50   87Q75   96MIN   96MAX   96Q25   96Q50     96Q75 00MIN   00MAX   00Q25   00Q50   00Q75
 1          0.02    0.32    0.11    0.12    0.13    0.02    0.26    0.08    0.09    0.10    0.02    0.28    0.10    0.11    0.12
 2          0.02    0.45    0.12    0.13    0.13    0.02    0.20    0.09    0.10    0.11    0.02    0.26    0.11    0.12    0.12
 3          0.02    0.29    0.13    0.14    0.14    0.02    0.27    0.11    0.11    0.12    0.02    0.26    0.12    0.13    0.13
 4          0.02    0.41    0.13    0.13    0.14    0.02    0.58    0.10    0.11    0.12    0.02    0.34    0.12    0.13    0.13
 5          0.02    0.42    0.12    0.13    0.14    0.02    0.46    0.10    0.11    0.11    0.02    0.28    0.12    0.12    0.13
 6          0.02    0.32    0.13    0.14    0.14    0.02    0.52    0.12    0.12    0.13    0.02    0.29    0.13    0.14    0.14
 7          0.02    0.55    0.12    0.13    0.14    0.02    0.24    0.10    0.11    0.11    0.02    0.37    0.12    0.12    0.13
 8          0.02    0.55    0.12    0.13    0.14    0.02    0.19    0.10    0.11    0.12    0.02    0.22    0.11    0.12    0.13

На самом деле у меня есть 26 переменных и 5 лет (87,96 и 00 в именах столбцов - годы). В идеальном мире я хотел бы иметь решетчатый граф с 26 графиками, по одному на переменную, причем каждый сюжет содержит 5 ящиков, то есть один в год. Я понимаю, что это невозможно сделать, это решетка, потому что решетка не принимает предопределенные статистические данные. Есть ли довольно неопытный способ сделать это в R с предопределенной статистикой? Я использовал bxp для простых ящиков, отображающих все переменные в течение одного года на одном графике, например.

Yr01 = read.csv('dat.csv',header=T)
dat01=t(Yr01[,c("01Min","01Q25","01Mean","01Q75","01Max")])
bxp(list(stats=dat01, n=rep(26, ncol(dat01))),ylim=c(0.07,0.2))

но я не знаю, как идти оттуда к тому, что мне нужно.

Благодарю.

1

1 ответы

Это можно сделать, по крайней мере, используя ggplot2 , но вам придется немного изменить код изменить свои данные. И у вас действительно должны быть данные, где квантилиты действительно имеют смысл !! Ваши значения квантилей все испорчены! Например, Var1 имеет 01Max = 0,26 и 01Q75 = .67 !!

Во-первых, я воссоздаю действительные данные:

n  <- c("01Min", "01Max", "01Med", "01Q25", "01Q75", "02Min", 
                            "02Max", "02Med", "02Q25", "02Q75")
v1 <- c(0.03,  0.76,  0.41,  0.13,  0.67,  0.10,  0.43,  0.27,  0.2,   0.33)
v2 <- c(0.03,  0.28,  0.14,  0.08,  0.20,  0.02,  0.77,  0.13,  0.06, 0.44)

df <- data.frame(v1=v1, v2=v2)
df <- as.data.frame(t(df))
names(df) <- n
df <- cbind(var=c("v1","v2"), df)
> df

#    var 01Min 01Max 01Med 01Q25 01Q75 02Min 02Max 02Med 02Q25 02Q75
# v1  v1  0.03  0.76  0.41  0.13  0.67  0.10  0.43  0.27  0.20  0.33
# v2  v2  0.03  0.28  0.14  0.08  0.20  0.02  0.77  0.13  0.06  0.44

Затем мы изменим данные:

require(reshape2)
df.m <- melt(df, id="var")
# look for a bunch of numbers from the start of the string and capture it
# in the first variable:() captures the pattern. And replace it with the 
# captured pattern with the variable "\\1"
df.m$year <- gsub("^([0-9]+)(.*$)", "\\1", df.m$variable)

# the same but instead refer to the captured pattern in the second 
# paranthesis using "\\2"
df.m$quan <- gsub("^([0-9]+)(.*)$", "\\2", df.m$variable)
df.f <- dcast(df.m, var+year ~ quan, value.var="value")

Чтобы добраться до этого формата:

> df.f

#   var year  Max  Med  Min  Q25  Q75
# 1  v1   01 0.76 0.41 0.03 0.13 0.67
# 2  v1   02 0.43 0.27 0.10 0.20 0.33
# 3  v2   01 0.28 0.14 0.03 0.08 0.20
# 4  v2   02 0.77 0.13 0.02 0.06 0.44

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

require(ggplot2)
require(scales)
p <- ggplot(df.f, aes(x=var, ymin=`Min`, lower=`Q25`, middle=`Med`, 
                           upper=`Q75`, ymax=`Max`)) 
p <- p + geom_boxplot(aes(fill=year), stat="identity") 
p

ggplot1

# if you want facetting:
p + facet_wrap( ~ var, scales="free")

ggplot2


Теперь вы можете выполнить свою задачу по построению всех years для каждого var на отдельном графике с помощью lapply с этим кодом и subsetting следующим образом:

lapply(levels(df.f$var), function(x) {
    p <- ggplot(df.f[df.f$var == x, ], 
            aes(x=var, ymin=`Min`, lower=`Q25`, 
                middle=`Med`, upper=`Q75`, ymax=`Max`))
    p <- p + geom_boxplot(aes(fill=year), stat="identity")
    p
    ggsave(paste0(x, ".pdf"), last_plot())
})

Edit: Your data is different from the earlier data you provided in some aspects. So, here's the version of the code for your new data:

# change var to VegType everywhere
require(reshape2)
df.m <- melt(df, id="VegType")

df.m$year <- gsub("^X([0-9]+)(.*$)", "\\1", df.m$variable) # pattern has a X
df.m$quan <- gsub("^X([0-9]+)(.*)$", "\\2", df.m$variable) # pattern has a X
df.f <- dcast(df.m, VegType+year ~ quan, value.var="value")
df.f$VegType <- factor(df.f$VegType) # convert integer to factor

require(ggplot2)
require(scales)
p <- ggplot(df.f, aes(x=VegType, ymin=`MIN`, lower=`Q25`, middle=`Q50`, 
                           upper=`Q75`, ymax=`MAX`)) 
p <- p + geom_boxplot(aes(fill=year), stat="identity") 
p

Вы можете фасет/писать как отдельные графики, используя тот же код, что и раньше.

5
добавлено
Спасибо за очень тщательный ответ! Я застрял на стадии изменения, я подозреваю, потому что, в отличие от моего примера, мои годы не 01,02 и т. Д., Но на самом деле 87,96,00,06,09 , поэтому я думаю, что код gsub не работает, как если бы мои данные были такими, какие я предлагал. Кроме того, я признаю, что я действительно не понимаю, что делает ^ ([0-9] +) (. *) $ ...
добавлено автор SnowFrog, источник
Бинго! Код работает. Один последний вопрос: писать df <- cbind (var = c ("v1", "v2"), df) отлично, если у меня есть только 2 строки, но если у меня есть 26, я не действительно хочу явно писать "v1", ..., "V26" . Есть ли какая-то дикая карта, которую я могу использовать, чтобы сказать, что я хочу все var, например. df <- cbind (var = c ("v *"), df) ?
добавлено автор SnowFrog, источник
Нет, я не хочу менять имена VegType . Мне интересно, будем ли мы называть VegType 1,2,3, ..., 8 или v1, v2, v3 ..., v8 , есть ли wild card, которую я могу использовать в команде cbind, в первом сером поле вашего ответа, что позволило бы мне не писать df <- cbind (VegType = c ("1", "2", " 3 "и т. Д. До" 8 "), df) , но что-то вроде df <- cbind (VegType = c (1: 8), df) . Благодарю.
добавлено автор SnowFrog, источник