1

问题:

我有一个数据集inputAll.data。我想使用 80% 的数据作为模型构建输入,并在剩余的 20% 数据上验证模型。

我手动将数据集拆分为两个较小的数据集input80.datainput20.data分别包含 80% 和 20% 的数据。

我的数据集中的数据格式:

Name      xvalues     yvalues
Prog1     0.654219    59.70282
Prog2     0.149516    49.59548
Prog3     0.50577     50.53859
Prog4     0.77783     59.95499
Prog5     0.237923    49.61133
Prog6     0.756063    50.63021
Prog7     0.015625    53.77959

我使用 80% 的数据来构建非线性回归模型nls

df = data.frame(input80.data)
yval = df$yvalues
xval = df$xvalues
model1 = nls(formula = yval ~ exp(xval + beta * xval), start = list(beta = 0))
sm1 = summary(model1)
fit1 = fitted.values(model1)

我正在使用剩余的 20% 数据来获得预测值。我保存了此数据的副本,其中包含y另一个名为 的文件中的实际值input20Actual.data,但input20.data仅包含x值。

dfNew = data.frame(input20.data)
xpred = dfNew$xvalues
dfVerify = data.frame(input20Actual.data)
yverify = dfVerify$yvalues
xverify = dfVerify$xvalues

obtainedPred = predict(model1, data.frame(xvalues = c(xpred) ))

然后我使用一个自定义函数RMSE来计算预测值和实际值之间的误差。

RMSE <- function(fitted, actual){
  sqrt(mean((fitted - actual)^2))
}

误差计算是通过获取每个预测值并将其与我存储的实际值进行比较来完成的input20Actual.data。我将输出存储在一个文件中。

sink("ErrorsOut.txt")
cat("\n\nRMSE:\n")
for (i in 1:13) {
    #There are 13 values to be predicted in input20.data
    corr = obtainedPred[[i]]
    act = yverify[[i]]
    err = RMSE(act, corr)
    cat(err)
    cat(" ")
}
cat("\n")
sink()

问题是我手动拆分了输入集。我想自动化这个,并为不同的拆分(每次不同的数据)做同样的事情,并获得计算误差的平均值。

我尝试了什么:

我在 StackOverflow 上阅读了有关 R 中交叉验证的信息。我的理解是,它迭代地需要一些 % 的数据用于模型创建,而剩余的数据用于测试。如果我可以在 中使用交叉验证功能nls,我就不必将输入数据拆分为两个文件。

我已经在 SO 上搜索了很多解决方案。许多关于交叉验证的答案都是针对lm. 但我特别需要对nls. 我还阅读了有关该caret软件包的信息,但我尝试安装它,但大多数时候我最终都会遇到软件包安装错误,如下所示:

Warning: dependency ‘plyr’ is not available
package ‘plyr’ is not available (for R version 3.0.2)

所以我希望有一种直接的方法来执行交叉验证(在 rkward 中),而不需要安装更多的包。R 中是否有可用于迭代创建模型和测试它们的函数或 API?

请注意,我是 R 的新手。对不起,如果这是一个明显的问题。

4

1 回答 1

3

使用内置数据框BOD尝试如下所示的简单模型fo。首先用于sample获取样本行的索引并在这些行上运行模型。predict.nls然后用于使用带有样本内模型的样本外数据获取预测值。从中可以计算出残差平方和 (RSS) 和其他结果。每次运行sample都会生成一组可能不同的索引(前提set.seed是不重新运行)。这可以打包在一个函数中并重复运行。不使用任何包。

set.seed(123) # for reproducibility

n <- nrow(BOD)
frac <- 0.8
ix <- sample(n, frac * n) # indexes of in sample rows

fo <- demand ~ a + Time * b
fm <- nls(fo, BOD, start = c(a = 0, b = 0), subset = ix) # in sample model

BOD.out <- BOD[-ix, ] # out of sample data
pred <- predict(fm, new = BOD.out)
act <- BOD.out$demand
RSS <- sum( (pred - act)^2 )
RSS
于 2016-05-31T16:18:57.080 回答