2016-05-31 84 views
0

問題:交叉驗證使用NLS非線性迴歸中的R

我有一個數據集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%數據來獲得預測值。我在另一個名爲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)) 
} 

誤差計算通過爲各預測值,並將其與我已經存儲在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上我的理解是,它需要重複數據的某些%,持續模型的創建和測試剩餘。如果我可以在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.對不起,如果這是一個明顯的問題。

+0

你需要更新你的R.你在版本3.0.2,我們目前在3.3.0。一旦你這樣做了,你就可以安裝''caret''軟件包 –

+0

@CyrusMohammadian但是我用'sudo apt-get install r-base'安裝了R。我只是重複它,它說'r基地已經是最新版本'。 3.3.0版本是什麼軟件包?我使用R與rkward,我已經按照我在這裏看到的步驟:http://www.r-bloggers.com/download-and-install-r-in-ubuntu/ – Kajal

+0

此外,如果我絕對_have_更新這是否意味着無法對此版本本身執行交叉驗證,並且沒有可以直接使用的R中的函數/ API? – Kajal

回答

2

使用內置數據幀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 
+0

謝謝!這會在重複它之後生成不同的數據(不重複'set.seed')。我會調整這與我的數據集使用它。謝謝您的幫助。 – Kajal