在r中聚合rmse和r2

问题描述 投票:0回答:2

这是一个示例数据 数据2:

 lvl   x  y
  0 20.099 21.2
100 21.133 21.4
250 20.866 21.6
500 22.679 21.8
750 22.737 22.1
  0 30.396 32.0
100 31.373 32.1
250 31.303 32.2
500 33.984 32.8
750 44.563 38.0
  0 22.755 18.5
100 23.194 18.8
250 23.263 20.5
500 23.061 27.9
750 25.678 36.4

我尝试通过以下代码行获取每个级别(lvl)的rmse和r2:

data2 %>% group_by(lvl) %>% summarise_each(funs(rmse(data2$x~data2$y)))

summary(lm(data2$x,data2$y))$r.squared

分别,在计算rmse时得到以下错误消息:

错误:缺少参数“obs”,没有默认值

# A tibble: 5 x 3
    lvl         x         y
  <int>     <dbl>     <dbl>
1     0 0.6639888 0.6639888
2   100 0.6639888 0.6639888
3   250 0.6639888 0.6639888
4   500 0.6639888 0.6639888
5   750 0.6639888 0.6639888

计算r2时。

我想聚合每个级别的 rmse 和 r2。在这种情况下,我只有 5 个级别。所以答案看起来像 5 行 X 3 列,列名称为 `"lvl"、"rmse"、"r2" 提前谢谢您。

r aggregate-functions summarize
2个回答
2
投票

你不需要

summarise_each
总结就能做你想做的事。如果您更喜欢使用 dplyr,这里是一个解决方案

data2 <-
data.frame(
  lvl = c(  0, 100, 250, 500, 750, 0, 100, 250, 500, 750, 0, 100, 250, 500, 750)
  ,x = c(
    20.099, 21.133, 20.866, 22.679, 22.737, 30.396, 31.373, 31.303, 33.984, 44.563, 22.755, 23.194, 23.263, 23.061, 25.678
  )
  ,y = c(21.2, 21.4, 21.6, 21.8, 22.1, 32.0, 32.1, 32.2, 32.8, 38.0, 18.5, 18.8, 20.5, 27.9, 36.4)
)

#install.packages("ModelMetrics")
library(ModelMetrics)

data2 %>%
  group_by(lvl) %>%
  summarise(
    RMSE = rmse(x, y)
    ,R2 = cor(x, y)^2
  )

## A tibble: 5 × 3
#    lvl     RMSE        R2
#  <dbl>    <dbl>     <dbl>
#1     0 2.701237 0.8176712
#2   100 2.575982 0.8645350
#3   250 1.729888 0.9091029
#4   500 2.920640 0.7207692
#5   750 7.267279 0.4542507

1
投票
## split your data2 into a list by the levels of the factor and then use lapply
list_of_rsquared <- lapply(split(data2, data2$lvl), function (z) {
  summary(lm(x ~ y, data = z))$r.squared
}
)

## you will get a list of r.squared for each level . Now you can simply rbind the list of r.squared.
rsquared_vals <- do.call("rbind", list_of_rsquared)

您可以对 RMSE 使用相同的方法。 (我假设您已经编写了一个名为 RMSE 的函数?因为我只是使用您上面的公式)

list_of_rmse <- lapply(split(data2, data2$lvl), function (z) { sqrt(mean((z$x - z$y)^2)) } )

rmse_vals <- do.call("rbind", list_of_rmse)

您现在只需

cbind
您需要的所有三列即可:

cbind(data2$lvl, rsquared_vals, rmse_vals)
© www.soinside.com 2019 - 2024. All rights reserved.