【问题标题】:Calculate Errors using loop function in R使用 R 中的循环函数计算错误
【发布时间】:2021-07-07 15:37:16
【问题描述】:

我有两个具有相同维度的数据矩阵。我想提取同一系列的列向量。然后将两个序列作为向量,然后计算不同的误差,例如平均绝对误差(mae)、平均百分比误差(mape)和均方根误差
(rmse)。我的数据矩阵维度很大,所以我尝试用一​​个例子来解释并手动计算这些错误:

mat1<- matrix(6:75,ncol=10,byrow=T) 
mat2<- matrix(30:99,ncol=10,byrow=T) 
mat1_seri1 <- as.vector(mat1[,c(1+(0:4)*2)])
mat1_seri2<- as.vector(mat1[,c(2+(0:4)*2)])
mat2_seri1 <- as.vector(mat1[,c(1+(0:4)*2)])
mat2_seri2<- as.vector(mat1[,c(2+(0:4)*2)])
mae1<-mean(abs(mat1_seri1-mat2_seri1))
mae2<-mean(abs(mat1_seri2-mat2_seri2))
For mape 
mape1<- mean(abs(mat1_seri1-mat2_seri1)/mat1_seri1)*100
mape2<- mean(abs(mat1_seri2-mat2_seri2)/mat1_seri2)*100

同样,我根据他们的公式计算 rmse,因为我有大量数据矩阵,因此手动操作非常耗时。是否可以使用循环来执行此操作,该循环分别为每个系列提供错误 (mae,mape,rmse) 术语的输出。

【问题讨论】:

  • 您希望以何种方式自动化流程?你也可以把它变成一个函数。
  • 感谢您的回复和时间,是的,我想自动执行此操作,因为我是 r 的新手,是否可以通过函数。
  • 请帮我看看我是如何通过函数处理这个的/

标签: r matrix


【解决方案1】:

我不确定这是否是您正在寻找的,但这里有一个可以自动化该过程的功能,也许还有更好的方法:

fn <- function(m1, m2) {
  stopifnot(dim(m1) == dim(m2))
  
  mat1_seri1 <- as.vector(m1[, (1:ncol(m1))[(1:ncol(m1))%%2 != 0]])
  mat1_seri2 <- as.vector(m1[, (1:ncol(m1))[!(1:ncol(m1))%%2]])
  mat2_seri1 <- as.vector(m2[, (1:ncol(m2))[(1:ncol(m2))%%2 != 0]])
  mat2_seri2 <- as.vector(m2[, (1:ncol(m2))[!(1:ncol(m2))%%2]])
  
  mae1 <- mean(abs(mat1_seri1-mat2_seri1))
  mae2 <- mean(abs(mat1_seri2-mat2_seri2))
  
  mape1 <- mean(abs(mat1_seri1-mat2_seri1)/mat1_seri1)*100
  mape2 <- mean(abs(mat1_seri2-mat2_seri2)/mat1_seri2)*100
  
  setNames(as.data.frame(matrix(c(mae1, mae2, mape1, mape2), ncol = 4)), 
           c("mae1", "mae2", "mape1", "mape2"))
}

fn(mat1, mat2)

  mae1 mae2    mape1    mape2
1   24   24 92.62581 86.89572

【讨论】:

  • 感谢您花时间和兴趣解决问题,非常感谢您,当我运行您的代码时,我收到以下错误 ``` Error: unexpected '>' in: as.data。框架(矩阵(c(mae1,mae2,mape1,mape2),ncol = 4))|>```和另一个错误```setNames中的错误(c(“mae1”,“mae2”,“mape1”,“ mape2")) : 缺少参数“nm”,没有默认的```如果可能,请纠正
  • 不客气,现在可以试试吗。 |&gt; 是新的原生 R 管道运算符,用于将其 LHS 替换为其 RHS 的第一个参数。但它在 Rstudio 中引发了错误,就像我的情况一样,但它并没有使函数执行停止。你可以试试修改后的版本。
  • 不客气。我会尝试进一步改进它,但它总是涉及2个相同维度的矩阵吗?如果是这样的话,我会看看它是如何减少硬编码的。
  • 我们可以通过循环来做到这一点,因为在我的数据中我有两个以上的系列,在一种情况下我有七个系列,在另一种情况下我有二十四个系列,所以基本上我希望通过循环每对系列通过一个一个循环选择并计算每个选定对的均方误差和平均百分比误差。
  • 我一直打算这样做,所以如果我完全理解你,你想为 7 系列和 24 系列的每个组合计算这两个参数,从每个系列中取一个矩阵,另一个从另一个系列?很有可能没问题,我只是想对手头的问题有一个清晰的认识。
猜你喜欢
  • 2021-12-19
  • 2020-07-16
  • 1970-01-01
  • 1970-01-01
  • 2020-12-04
  • 1970-01-01
  • 1970-01-01
  • 2016-06-27
  • 1970-01-01
相关资源
最近更新 更多