Как я могу пересчитать среднее значение смеси индивидуальных и средних значений с разным количеством наблюдений в R?

#r #machine-learning #mean #summary

#r #машинное обучение #среднее #Краткие сведения

Вопрос:

У меня есть два набора данных, с которыми я работаю. Первый набор данных представляет собой набор отдельных образцов, с которых я проводил измерения, а другой — набор зарегистрированных средних измерений для данной популяции вида в предыдущих исследованиях. Первый набор данных выглядит следующим образом:

 data.frame(Species = c('Species1', "Species1", 'Species1', 'Species2', 'Species3', 'Species3'),
           Specimen = c('A1', 'B2', 'C3', 'D4', 'E5', 'F6'),
           Measurement1 = c(100, 110, 120, 130, 140,150),
           Measurement2 = c(1, 2, 3, 4, 5, 6))
  

а другое выглядит так:

 data.frame(Species = c('Species1','Species1', 'Species2', 'Species3'),
                  N = c(10, 10, 11, 12),
                  Measurement1 = c(100, 100, 110, 120),
                  Measurement2 = c(1, 2, 3, 4))
  

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

 data.frame(Species=c('Species1','Species2','Species3'),
                  N=c(23,12,14),
                  Measurement1=c(101.3043,111.67,123.5714),
                  Measurement2=c(1.565,3,4.214))
  

Я знаю aggregate() , что вычислит среднее значение для данного фрейма данных, но я не знаю ни одного простого способа пересчитать среднее значение нескольких суммированных средних значений или как это сделать, если количество записей меняется. Я знаю, что среднее значение можно пересчитать вручную, используя формулу

(X x * N x) (X y * N y) (X c * N c) / (N x N y N c)

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

Комментарии:

1. Похоже, в ваших данных есть какая-то проблема. (Скобки закрыты в неправильных местах.). Можете ли вы показать, как вы выполняете вычисления для общих данных? Как вы получаете 101.3043 as Measurement1 на выходе, также как N 23?

2. Я исправил кодировку. Для вычисления я делал все это вручную в Excel, поэтому я хотел бы попытаться найти решение для машинного обучения. Я получаю 101.3043, потому что есть 23 наблюдения (3 в первом кадре, 20 во втором разделении на две группы по 10), и поэтому я получаю ((10*100) (10*100) (100 110 120))/23.

Ответ №1:

Вы можете объединить два набора данных, а затем взять взвешенное среднее :

 library(dplyr)

data1 %>%
  mutate(N = 1) %>%
  select(-Specimen) %>%
  bind_rows(data2) %>%
  group_by(Species) %>%
  summarise(across(starts_with('Measurement'), weighted.mean, N), 
            N = sum(N))

#  Species  Measurement1 Measurement2     N
#  <chr>           <dbl>        <dbl> <dbl>
#1 Species1         101.         1.57    23
#2 Species2         112.         3.08    12
#3 Species3         124.         4.21    14
  

Комментарии:

1. Как бы я это сделал для нескольких столбцов, которые не начинаются с «Измерения»? «Measurement1» — это просто имя фиктивной переменной, которую я использовал для целей этого вопроса.

2. Вы можете указать имена столбцов в across : summarise(across(c(col1, col2), weighted.mean, N)