Вычисленная среднеквадратичная ошибка с фреймом данных остатков с группировкой в dplyr

#r #dplyr #mse

#r #dplyr #mse

Вопрос:

Итак, у меня есть фрейм данных остатков как таковой:

 ID    A    B    C     D 
1    .2 23.3  2.3  4.32
2   2.3  2.4    0     1
3  23.3  1.3   23  3.44
2  34.2   33 56.5  76.5
1   0.3 76.4  3.2  78.5
  

* Существует около 200 переменных

Как я мог бы вычислить среднеквадратичную ошибку (MSE), используя это by ID ?

Таким образом, в основном, MSE для каждого человека ID является целью.

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

1. Вы хотите вычислить MSE для каждого столбца для каждого отдельного человека, то есть MSE для столбца A и еще один MSE для столбца B, или вы хотите вычислить общий MSE, так что для каждого идентификатора, но по всем столбцам? Пожалуйста, объясните. Также объясните, как именно вы хотите вычислить MSE, поскольку в разных контекстах существуют разные формулы.

2. Общий MSE для каждого идентификатора. Формула MSE для СУММЫ ((X — Xi) ^ 2) @дешен

Ответ №1:

 library(tidyverse)
df_example %>%
  group_by(ID) %>%
  summarize(across(everything(), ~sum(.x^2)/n()))
  

что дает:

 # A tibble: 3 x 5
     ID       A       B       C      D
  <int>   <dbl>   <dbl>   <dbl>  <dbl>
1     1   0.065 3190.      7.76 3090. 
2     2 587.     547.   1596.   2927. 
3     3 543.       1.69  529      11.8
  

Обратите внимание, что это дает разные результаты по сравнению с решением @Bruno’s. Однако это дает те же результаты, что и решение Neeraj.

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

Один пример для столбца «A» и идентификатора 2:

  • Остатки равны 2,3 и 34,2
  • Квадраты остатков равны 5,29 и 1169,64
  • Сумма квадратов остатков равна 1174,93
  • MSE — это сумма квадратов остатков, деленная на 2 = 587,465

Это правильно?

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

1. это правильно, нам нужно было бы добавить этот шаг

2. Итак, результат выше правильный или нет? Если это так, было бы здорово, если бы вы могли отметить один из правильных ответов как принятый.

Ответ №2:

Что-то вроде этого я бы сделал

 library(tidyverse)

df_example <- tibble::tribble(
  ~ID,   ~A,   ~B,   ~C,   ~D,
   1L,  0.2, 23.3,  2.3, 4.32,
   2L,  2.3,  2.4,    0,    1,
   3L, 23.3,  1.3,   23, 3.44,
   2L, 34.2,   33, 56.5, 76.5,
   1L,  0.3, 76.4,  3.2, 78.5
  )

df_example %>% 
  group_by(ID) %>% 
  summarise(lenght_vector = c_across(cols = c(A:D)) %>% length(),
            sum_vector = c_across(cols = c(A:D)) %>% sum(),
            mean_error = sum_vector/lenght_vector,
            MSE = mean_error %>% sqrt())
#> `summarise()` ungrouping output (override with `.groups` argument)
#> # A tibble: 3 x 5
#>      ID lenght_vector sum_vector mean_error   MSE
#>   <int>         <int>      <dbl>      <dbl> <dbl>
#> 1     1             8      189.        23.6  4.85
#> 2     2             8      206.        25.7  5.07
#> 3     3             4       51.0       12.8  3.57
  

Создано 2020-11-11 пакетом reprex (версия 0.3.0)

Ответ №3:

Среднеквадратичная ошибка для остатков просто определяется как:

MSE для остатков

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

 df <- matrix(runif(100), ncol = 10) #dummy data

#generating ID in first column
set.seed(123)
df <- cbind(sample(1:3, 10, replace = TRUE), df)

mse <- aggregate(df[, 2:ncol(df)], by = list(df[, 1]), FUN = function(x) 1/length(x) * sum(x ** 2))
  

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

1. Хорошо, я понял вашу проблему.

2. Вам нужно сделать aggregate(.~ID, df, function(x) mean(x^2))