簡體   English   中英

在R中使用nls進行非線性回歸的交叉驗證

[英]Cross-validation for non-linear regression using nls in R

問題:

我有一個數據集inputAll.data 我想將80%的數據用作模型構建輸入,並在其余20%的數據上驗證模型。

我已將數據集手動拆分為兩個較小的數據集, input20.data包含80%和20%的數據input80.datainput20.data

我的數據集中的數據格式:

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使用交叉驗證功能,則不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來獲取樣本中行的索引,並在其上運行模型。 然后,使用帶有樣本內模型的樣本外數據,使用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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM