【问题标题】:r.squared matrix of predictions vs actual values in Rr.squared 矩阵的预测与 R 中的实际值
【发布时间】:2022-01-06 14:12:14
【问题描述】:

我想创建一个矩阵,显示多年来所做的一些预测和实际值的 r.squared 确定系数。

我的目标是显示一个看起来像这样的矩阵。

我发现的唯一方法是创建多个列表,使用map2_dbl(l.predicted_line1, l.actual, ~ summary(lm(.x ~ .y))$r.squared) 单独计算每一行/每一列,然后使用一些代码将结果向量添加到矩阵中。这将创建 9 个列表,这是我想避免的。

有什么方法可以更有效地做到这一点?

#sample data
l.actual <- list(
    overall_15 = c(59,65,73,73,64,69,64,69,63,NA,82,60,NA,73,NA,73,73,NA,69,
                   69,71,66,65,70,72,72,NA,64,69,67,64,71,NA,62,62,71,67,63,64,76,72),
    overall_16 = c(60,68,75,74,68,71,NA,72,64,69,82,66,64,77,NA,71,72,NA,69,
                   69,75,67,71,73,73,73,NA,66,NA,69,65,70,76,NA,67,71,72,64,65,76,73),
    overall_17 = c(63,68,NA,74,72,72,NA,73,66,69,83,67,64,76,NA,71,73,NA,70,
                   70,79,NA,73,72,NA,NA,NA,NA,NA,70,NA,70,77,NA,68,74,74,66,64,75,69),
    overall_18 = c(NA,68,NA,78,73,72,NA,72,68,67,86,NA,62,75,65,71,71,67,71,
                   71,76,NA,71,71,NA,NA,74,NA,71,NA,NA,68,74,NA,67,75,74,65,NA,72,NA),
    overall_19 = c(NA,NA,NA,77,73,72,NA,71,69,66,87,63,62,73,65,NA,NA,NA,NA,
                   NA,75,NA,NA,67,NA,NA,73,NA,NA,NA,NA,NA,74,NA,NA,74,74,65,NA,68,NA),
    overall_20 = c(NA,NA,NA,77,NA,NA,NA,72,71,66,87,NA,NA,NA,65,NA,NA,NA,70,
                   70,75,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,74,NA,66,71,73,NA,NA,69,NA),
    overall_21 = c(NA,67,NA,76,NA,69,NA,73,69,65,85,NA,NA,NA,NA,NA,NA,NA,NA,
                   NA,75,NA,NA,NA,NA,NA,69,NA,NA,NA,NA,NA,73,NA,67,68,72,NA,NA,68,NA),
    overall_22 = c(NA,NA,NA,75,NA,NA,NA,75,67,65,84,NA,NA,NA,NA,NA,NA,NA,68,
                   68,73,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,67,69,71,NA,NA,68,NA)
  )

l.predicted <- list(
  potential_15 = c(59,68,74,76,65,75,64,72,66,NA,85,60,NA,76,NA,73,75,NA,71,
                   71,71,67,65,70,72,72,NA,68,74,67,64,71,NA,62,62,71,71,63,67,78,72),
  potential_16 = c(60,71,75,75,68,73,NA,74,66,69,83,66,64,77,NA,71,74,NA,70,
                   70,76,67,71,73,73,73,NA,66,NA,69,65,70,76,NA,67,71,72,64,66,76,73),
  potential_17 = c(63,69,NA,75,72,72,NA,73,69,69,83,67,64,76,NA,71,73,NA,70,
                   70,79,NA,73,72,NA,NA,NA,NA,NA,70,NA,70,77,NA,68,74,74,66,64,75,69),
  potential_18 = c(NA,68,NA,78,73,72,NA,72,69,67,86,NA,62,75,65,71,71,67,71,
                   71,76,NA,71,71,NA,NA,74,NA,71,NA,NA,68,74,NA,67,75,74,65,NA,72,NA),
  potential_19 = c(NA,NA,NA,77,73,72,NA,71,70,66,87,63,62,73,65,NA,NA,NA,NA,
                   NA,75,NA,NA,67,NA,NA,73,NA,NA,NA,NA,NA,74,NA,NA,74,74,65,NA,68,NA),
  potential_20 = c(NA,NA,NA,77,NA,NA,NA,72,71,66,87,NA,NA,NA,65,NA,NA,NA,70,
                   70,75,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,74,NA,66,71,73,NA,NA,69,NA),
  potential_21 = c(NA,67,NA,76,NA,69,NA,73,69,65,85,NA,NA,NA,NA,NA,NA,NA,NA,
                   NA,75,NA,NA,NA,NA,NA,69,NA,NA,NA,NA,NA,73,NA,67,68,72,NA,NA,68,NA),
  potential_22 = c(NA,NA,NA,75,NA,NA,NA,75,67,65,84,NA,NA,NA,NA,NA,NA,NA,68,
                   68,73,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,67,69,71,NA,NA,68,NA)
)

【问题讨论】:

    标签: r matrix syntax statistics coefficients


    【解决方案1】:

    这是一个使用一些 tidyverse 包的解决方案。关键是使用函数expand_grid() 来获取每个列表元素的所有组合。这会产生一个带有两个命名列表列的小标题。接下来我们可以使用mutate() 提取列表的名称并将它们分配给新列,并提取数字ID。使用filter() 仅保留潜力小于或等于整体的行。最后使用您建议的代码获取每行的 R 平方,然后绘图。 (请注意,我并没有努力让情节看起来像你的那样。)

    library(purrr)
    library(dplyr)
    library(ggplot2)
    library(tidyr)
    
    r_squared_combinations <- expand_grid(l.actual, l.predicted) %>%
      mutate(overall = names(l.actual),
             potential = names(l.predicted),
             overall_n = as.numeric(gsub('overall_', '', overall)),
             potential_n = as.numeric(gsub('potential_', '', potential))) %>%
      filter(potential_n <= overall_n) %>%
      mutate(r_squared = map2_dbl(l.predicted, l.actual, ~ summary(lm(.x ~ .y))$r.squared))
    
    ggplot(r_squared_combinations, aes(x = overall, y = potential, fill = r_squared, label = round(r_squared, 3))) +
      geom_tile() +
      geom_text(color = 'white') 
    

    附注:顺便提一下,基本函数expand.grid() 的工作原理与tidyr::expand_grid() 一样好,但expand_grid() 默认返回一个tibble,如果您使用tidyverse 函数可能会更方便。

    【讨论】:

      猜你喜欢
      • 2013-12-26
      • 2021-01-28
      • 2015-10-13
      • 2022-01-07
      • 2020-06-26
      • 1970-01-01
      • 2021-01-24
      • 1970-01-01
      • 2021-04-08
      相关资源
      最近更新 更多