1

問題:

私はデータセットを持っていinputAll.dataます。データの 80% をモデル構築の入力として使用し、残りの 20% のデータでモデルを検証したいと考えています。

データセットを 2 つの小さなデータセットに手動で分割し、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% のデータを使用して予測値を取得しています。yという名前の別のファイルに実際の値を含むこのデータのコピーを保存しましたinput20Actual.datainput20.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()

問題は、入力セットを手動で分割したことです。これを自動化し、異なる分割 (毎回異なるデータ) に対して同じことを行い、計算されたエラーの平均を取得したいと思います。

私が試したこと:

R のクロス検証について StackOverflow を読みました。私の理解では、モデルの作成にデータの一部を繰り返し使用し、残りをテストに使用するということです。で相互検証関数を使用できる場合nls、入力データを 2 つのファイルに分割する必要はありません。

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 に答える