R 非线性回归的nls交叉验证

R 非线性回归的nls交叉验证,r,cross-validation,nls,non-linear-regression,R,Cross Validation,Nls,Non Linear Regression,问题: 我有一个数据集inputAll.data。我想使用80%的数据作为模型构建输入,并在剩余20%的数据上验证模型 我已手动将数据集拆分为两个较小的数据集input80.data和input20.data分别包含80%和20%的数据 我的数据集中的数据格式: Name xvalues yvalues Prog1 0.654219 59.70282 Prog2 0.149516 49.59548 Prog3 0.50577 50.5

问题:

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

我已手动将数据集拆分为两个较小的数据集
input80.data
input20.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%数据来获得预测值。我在另一个名为
input20Actual.data
的文件中保存了一份包含实际
y
值的数据副本,但
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))
}
问题是我已经手动拆分了输入集。我想将此过程自动化,并对不同的分割(每次不同的数据)执行相同的操作,并获得计算误差的平均值

我的尝试:

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

我一直在寻找解决办法。关于交叉验证的许多答案都是针对
lm
。但我特别要求对
nls
进行交叉验证。我也读到了关于
caret
软件包的内容,但我尝试过安装它,但大多数时候我都会遇到软件包安装错误,如下所示:

Warning: dependency ‘plyr’ is not available
package ‘plyr’ is not available (for R version 3.0.2)
所以我希望有一种直接的方法来执行交叉验证(在rkward中),而不需要安装更多的软件包。R中是否有一个函数或API可以用于迭代创建模型和测试它们


请注意,我是R的新手。如果这是一个明显的问题,我很抱歉。

使用内置数据框
BOD
尝试下面
fo
中所示的简单模型。首先使用
sample
获取样本行中的索引,并在这些行上运行模型<代码>预测。然后使用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
set.seed(123)#用于再现性

n您需要更新您的R。您的版本为3.0.2,我们目前的版本为3.3.0。完成此操作后,您将能够安装插入符号package@CyrusMohammadian但是我使用sudo apt get install R-base安装了R。我只是重复了一遍,上面说
r-base已经是最新版本了
。3.3.0版本是某种软件包吗?我在rkward中使用R,并且我遵循了我在这里看到的步骤:另外,如果我必须更新,这是否意味着没有办法对这个版本本身执行交叉验证,并且R中没有我可以直接使用的函数/API?您需要更新您的R,当然,有一些方法可以在不进行更新的情况下执行,但它们可能需要您查找并获取以前版本的软件包,这并不容易。您的R版本已过时。请参见此处的问题中发布的R代码,因此应可复制。看,谢谢!重复后会生成不同的数据(不重复
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