[英]Cross-validation for non-linear regression using nls in R
問題:
我有一個數據集inputAll.data
。 我想將80%的數據用作模型構建輸入,並在其余20%的數據上驗證模型。
我已將數據集手動拆分為兩個較小的數據集, input20.data
包含80%和20%的數據input80.data
和input20.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.