我正在尝试计算模拟数据的RMSE,但输出显示RMSE为NaN。以下是我使用的代码。
library(caret)RMSE <- function(x,y) sqrt(mean((x-y)^2))sim.regression<-function(n.obs=200,coefficients=c(3,1.5,0,0,2,0,0,0),s.deviation=.1){ n.var=length(coefficients) M=matrix(0,ncol=n.var,nrow=n.obs) beta=as.matrix(coefficients) for (i in 1:n.var){ M[,i]=rnorm(n.obs,0,1) } y=M %*% beta + rnorm(n.obs,0,s.deviation) train.data<-y[1:150] train.data<-data.frame(train.data) test.data<-y[151:200] test.data<-data.frame(test.data) prediction <- predict(lm(y~M),test.data) RMSE.data<-RMSE(prediction, test.data$y) return (list(x=M,y=y,coeff=coefficients, RMSE=RMSE.data)) }set.seed(2000)sim.regression(100)
回答:
欢迎来到SO。代码中存在几个问题:
- 假设您试图根据’M’来学习/预测’y’,您需要将M和y结合起来并创建一个数据框。
- 之后,您才应该将前150个样本用于训练,剩余的用于测试。
- 然后,您在
train.data
上进行训练,并在test.data
上进行预测 - 另外,由于您为训练-测试分割硬编码了[1:150]和[150:200],您需要在sim.regression(200)中传递
200
。
修正后的代码如下:
library(caret)RMSE <- function(x,y) sqrt(mean((x-y)^2))sim.regression<-function(n.obs=200,coefficients=c(3,1.5,0,0,2,0,0,0),s.deviation=.1){ n.var=length(coefficients) M=matrix(0,ncol=n.var,nrow=n.obs) beta=as.matrix(coefficients) for (i in 1:n.var){ M[,i]=rnorm(n.obs,0,1) } y=M %*% beta + rnorm(n.obs,0,s.deviation) data<-data.frame(M,y) train.data <- data[1:150,] test.data<-data[151:200,] prediction <- predict(lm(y~., data=train.data),test.data) RMSE.data<-RMSE(prediction, test.data$y) return (list(x=M,y=y,coeff=coefficients, RMSE=RMSE.data)) }set.seed(2000)sim.regression(200)
输出如下:
$RMSE0.0755869850491716