Среднее значение только данных, содержащихся между 1-м и 3-м квартилем в R - PullRequest
1 голос
/ 24 марта 2020

У меня есть значения концентрации для различных эффектов, и я пытался вычислить средние значения для каждого набора сгруппированных данных (по различным эффектам), но только для данных, содержащихся между 1-м и 3-м квартилем коробчатого графика, с помощью R. Сначала я сделал коробочные диаграммы (с ggplot), но не понимаю, как это могло бы помочь. С помощью функции ggplot_build () я просто получаю квартили. Я также попробовал «aggregate ()», но это дает среднее значение для всего набора, и я не хочу включать то, что находится за пределами 1-го и 3-го квартилей. Любые идеи? Спасибо за вашу помощь.

 conc.value Conc.units Effect.group           Effect
1    0.000160000    AI mg/L    systemic        Physiology
2    0.000560000    AI mg/L    systemic        Population
3    0.001090377    AI mg/L    systemic        Population
4    0.001124100    AI mg/L   cell-based        Enzyme(s)
5    0.001686150    AI mg/L    systemic        Population
6    0.002000000    AI mg/L    systemic        Population
7    0.002000000    AI mg/L    systemic        Population
8    0.002000000    AI mg/L    systemic        Population
9    0.002248200    AI mg/L   cell-based        Enzyme(s)
10   0.002248200    AI mg/L   cell-based        Enzyme(s)
11   0.002248200    AI mg/L    systemic        Population
12   0.002248200    AI mg/L   cell-based     Biochemistry
13   0.004000000    AI mg/L    systemic        Population
14   0.004000000    AI mg/L    systemic        Population
15   0.004496400    AI mg/L   cell-based     Biochemistry
16   0.004496400    AI mg/L   cell-based        Enzyme(s)
17   0.004496400    AI mg/L    systemic        Population
18   0.005000000    AI mg/L    systemic        Population
19   0.005000000    AI mg/L    systemic        Population
20   0.005000000    AI mg/L    systemic        Population
21   0.005000000    AI mg/L    systemic        Population
22   0.005000000    AI mg/L    systemic        Population
23   0.005000000    AI mg/L    systemic        Population
24   0.005000000    AI mg/L    systemic        Population
25   0.005000000    AI mg/L    systemic        Population
26   0.005000000    AI mg/L    systemic        Population

Ответы [ 3 ]

1 голос
/ 24 марта 2020

Я бы использовал функцию quantile. Используя те же данные, что и @ Chris

quantile(df$V1)
         0%         25%         50%         75%        100% 
-2.30916888 -0.49385424  0.06175631  0.69181917  2.18733299 

Вы можете получить значения по индексу quantile(df$V1)[1] или с помощью опции probs

> quantile(df$V1,probs=.25)
       25% 
-0.4938542 

Когда у вас есть данные просто подмножество и рассчитать среднее значение (как @Chris) указал

1 голос
/ 24 марта 2020

Вы можете получить доступ к статистике, включенной в коробочные сюжеты. Вот некоторые иллюстративные данные:

set.seed(123)
df <- data.frame(
  V1 = c(rnorm(100))
)

Теперь сохраните коробочную диаграмму вашего столбца V1 как объект, называемый здесь, ну, object:

object <- boxplot(df$V1)

Внутренняя проверка статистики связано с object:

object$stats
            [,1]
[1,] -1.96661716
[2,] -0.49667731
[3,]  0.06175631
[4,]  0.69499808
[5,]  2.18733299

2-е и 4-е значения разграничивают IQR (для проверки вы можете сделать summary(df)). Поэтому следующим шагом будет подмножество df$V1 на этих двух значениях и вычисление среднего значения:

mean(df$V1 >= object$stats[2] & df$V1 <= object$stats[4])
[1] 0.5

Это в nuce , как вы можете решить вопрос. Поскольку кажется, что у вас более сложная структура данных, это решение, очевидно, придется адаптировать к вашим данным. Если вам нужна помощь в этом, вам нужно показать, как выглядят данные.

Например, если у вас есть фрейм данных с несколькими числовыми переменными, вы можете выполнить вычисления в одном go, например так:

set.seed(123)
df <- data.frame(
  V1 = c(rnorm(100)),
  V2 = c(rnorm(100, 1)),
  V3 = c(rnorm(100, 2))
)

lapply(df[,1:3], function(x)  mean(x >= object$stats[2] & x <= object$stats[4]))
$V1
[1] 0.5

$V2
[1] 0.39

$V3
[1] 0.07

РЕДАКТИРОВАТЬ :

Для набора данных, такого как тот, который вы описали в своем недавнем комментарии, решение может быть следующим:

set.seed(123)
df <- data.frame(
  V1 = c(rnorm(100)),
  Effect = sample(LETTERS[1:4], 100, replace = T)
)

Чтобы рассчитать среднее значение для межквартильного диапазона на Effect, вы можете сделать это за один go:

tapply(df$V1, df$Effect, function(x)  mean(x[x >= quantile(x, 0.25) & x <= quantile(x, 0.75)]))
           A            B            C            D 
 0.005502653  0.251196882  0.077304685 -0.108590409
0 голосов
/ 24 марта 2020

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

qgroup = function(numvec, n = 4){

  qtile = quantile(numvec, probs = seq(0, 1, 1/n), na.rm = T)
  out = sapply(numvec, function(x) sum(x >= qtile[-(n+1)]))

  return(out)
}

> qgroup(seq(1:20))
 [1] 1 1 1 1 1 2 2 2 2 2 3 3 3 3 3 4 4 4 4 4

Теперь примените эту функцию к числовому c вектору nums в data.table или data.frame:

set.seed(123)
nums = rnorm(100)

#data.table
dt = data.table(nums)[, Qnums := qgroup(nums)]

#data.frame
df = data.frame(nums)
df$Qnums = qgroup(df$nums)

Наконец, подмножество объекта данных в соответствии с Qnums и вычисление среднего значения для столбца цифры c nums:

> dt[Qnums %in% c(2,3), mean(nums)]
[1] 0.05432868

> mean(df$nums[df$Qnums %in% c(2,3)])
[1] 0.05432868
...