【问题标题】:Calculate MAPE on rows by groups按组计算行上的 MAPE
【发布时间】:2017-06-12 19:43:03
【问题描述】:

我对房价数据集进行了 OLS 回归。我计算了每栋房屋的误差与预测值。我在数据框中有一列,其中包含每所房屋所属的城镇。我想计算每个城镇的 MAPE。我的数据框看起来像这样:

HomePr   Error      Town 

1390      0.40093  Clarkvile   
2010      0.348902 Petersburg  
2393      0.348902 Petersburg  
2000      0.348902 Clarkvile  
7030      0.348902 Pleasant Place  
4025      0.348902 Petersburg  
4000      0.348902 Millerstown 
2086      0.348902 Pleasant Place  
6058      0.348902 Schneider  
2000      0.348902 Jebtown 

我想通过Town 计算 MAPE。所以我的第一步是获取唯一Towns 的列表,然后使用共享该组的所有Errors 计算 MAPE。然后我想要一个新的专栏DF$Mape,它会给我 MAPE,它只使用每组 Town 中的房屋。

我不确定该怎么做。寻找建议。

【问题讨论】:

  • 假设 HomePr 是实际值,然后做tapply(X = df$Error/df$HomePr, INDEX = df$Town, mean)
  • 您应该查看 dplyr 包。您可以 group_by(Town),然后 mutate(Mape = HomePr * Error) 或您将使用的任何公式。在此处查看 dplyr 备忘单:rstudio.com/wp-content/uploads/2015/02/…
  • @Vlo 这实际上看起来不错,但有没有办法将它作为新列附加到 df 上?
  • x <- tapply(X = df$Error/df$HomePr, INDEX = df$Town, mean); merge(df, data.frame(Town = names(x), MAPE = x))

标签: r statistics grouping


【解决方案1】:

像这样?

library(dplyr); library(tibble)

mape <- function(actual, forecasted){
  x = 0.1*((actual - forecasted)/actual)*100
  return(x)
}
tibble(
  HomePr = c(1390, 2010, 2393, 2000, 7030, 4025, 4000,
             2086, 6058, 2000),
  Error = c(0.40093, 0.348902, 0.348902, 0.348902, 0.348902,
            0.348902, 0.348902, 0.348902, 0.348902, 0.348902),
  Town = c("Clarkvile", "Petersburg", "Petersburg", "Clarkvile",  
           "Pleasant Place", "Petersburg", "Millerstown", "Pleasant Place",
           "Schneider", "Jebtown")
) %>% 
  group_by(Town) %>% 
  summarise(means_pr = mean(HomePr),
            means_err = mean(Error)) %>% 
  mutate(Mape = mape(means_pr, means_err))

结果:

# A tibble: 6 x 4
            Town means_pr means_err     Mape
           <chr>    <dbl>     <dbl>    <dbl>
1      Clarkvile 1695.000  0.374916 9.997788
2        Jebtown 2000.000  0.348902 9.998255
3    Millerstown 4000.000  0.348902 9.999128
4     Petersburg 2809.333  0.348902 9.998758
5 Pleasant Place 4558.000  0.348902 9.999235
6      Schneider 6058.000  0.348902 9.999424

更新: 根据下面的 cmets,(真实)数据集将 Town 作为一个因素。这可以简单地转换为字符,使用df &lt;- df %&gt;% mutate(Town = as.character(Town),其中df是数据帧。

【讨论】:

  • 原始问题中列出的这个数据集是一个样本。实际的数据框有大约 20,000 行和大约 100 个城镇。而不是使用写出的列表,我怎样才能让 r 读取行并根据它进行计算?
  • 我不知道您所说的“书面清单”是什么意思。如果您有上面示例中的变量,则相同的代码应该适用于更大的数据集。当您尝试此代码时会发生什么?
  • 嗨,我的意思是你有这条线:Town = c("Clarkvile", "Petersburg", "Petersburg", "Clarkvile", "Pleasant Place", "Petersburg", "Millerstown", "Pleasant Place", "Schneider", "Jebtown") 而我有 100 多个城镇名称,而且它们都重复出现,可能每个都接近 100 次,所以把它们写出来你有是不可行的。有没有更有效的方法?
  • 啊,好吧,我以为你是这个意思。我只是在做一个可重复的例子。对于您的数据集,您只需要计算 MAPE 的函数,然后您使用 group_by()summarise()mutate() 和上面一样,它应该可以工作。
  • 所以我使用了 mape 函数,然后对行进行分组、汇总和变异。得到这个错误:Error in UseMethod("group_by_") : no applicable method for 'group_by_' applied to an object of class "factor" 假设ErrorTownHomePr 分别指df$Errordf$Towndf$HomePr。我像你说的那样忽略了tibble()部分的中​​间代码
猜你喜欢
  • 2018-05-18
  • 1970-01-01
  • 2019-03-14
  • 2017-02-19
  • 2019-08-22
  • 1970-01-01
  • 2017-09-10
  • 1970-01-01
  • 2014-05-11
相关资源
最近更新 更多