使用 dplyr 中的分组计算残差数据帧的均方误差

Calculated Mean Squared Error with dataframe of residuals with grouping in dplyr

所以我有一个这样的残差数据框:

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个变量

我如何通过 ID 计算均方误差 (MSE)?

所以基本上,每个人的 MSE ID 就是目标。

残差的均方误差简单定义为:

要获取每列的 MSE,您只需使用 R 中的 apply 函数即可:

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))

我会做这样的事情

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

reprex package (v0.3.0)

创建于 2020-11-11
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 的解决方案相比,这给出了不同的结果。不过,它确实给出了与 Neeraj 的解决方案相同的结果。

我理解 TO 的方式是他的输入已经是残差,在这种情况下,我只需要对每个残差进行平方,创建每个 ID(以及每个列)的总和,然后除以每个 ID 的观察值。

列“A”和 ID 2 的一个示例:

  • 残差为 2.3 和 34.2
  • 残差平方为 5.29 和 1169.64
  • 残差平方和为 1174.93
  • MSE 是残差平方和除以 2 = 587.465

对吗?