使用 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
对吗?
所以我有一个这样的残差数据框:
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-11library(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
对吗?