使用apply计算两个矩阵的均方误差

时间:2014-01-13 19:35:39

标签: r

我试图弄清楚如何使用apply来计算两个矩阵的每一行的MSE,其中一个是预测和其他正确的值。

我的MSE功能看起来像

mse <- function(x_hat,x) {
    return(sum((x_hat-x)^2)/length(x))
}

所以第一个MSE的计算结果为

mse(results[1,],real[1,])

如何使用apply为两个矩阵的每一行计算?我对作为第一个应用参数的内容感到困惑,因为它必须是一个变量。

2 个答案:

答案 0 :(得分:1)

你可以在行索引上lapply(),传入x_hatx作为附加参数。这将需要更改MSE函数或包装器。我将展示两者:

1:重写mse()以将行索引作为其第一个参数并使用它

mse2 <- function(i, x_hat, x) {
  sum((x_hat[i,] - x[i,])^2) / length(x[i,])
}

lapply(seq_len(nrow(x)), mse2, x_hat = x_hat, x = x)

2:给mse()

写一个包装器
wrap.mse <- function(i, x_hat, x) {
  mse(x_hat[i, ], x[i, ])
}

lapply(seq_len(nrow(x)), wrap.mse, x_hat = x_hat, x = x)

包装器的优点是mse()保持不变,比修改版本更简单。

如果您希望将结果简化为MSE值的向量而不是列表,则可以将lapply()调用更改为sapply()

答案 1 :(得分:1)

您不需要apply。您的函数几乎完全被矢量化,因此您可以放入矩阵并完成它。这样可行。

mse<-function(x_hat,x) rowMeans((x_hat-x)^2)

现在,您可以运行:

mse(x_hat,x)  

你将获得一个MSE向量,每行一个。