2016-12-26 12 views
0

なぜ2つのコードが異なる結果を返すのか混乱しています。 ループの唯一の違いは、Wage $ age.cut1age.cut1の使用です。違いの意義は何ですか?2つの単純なループの出力の違いが混乱する

DATA:ISLRパッケージ、賃金データ

cv.err <- rep(NA, 10) 
for (i in 2:10){ 
    Wage$age.cut1 = cut(Wage$age, i) 
    fit = glm(wage~age.cut1, data = Wage) 
    cv.err[i] = cv.glm(Wage, fit, K = 10)$delta[2] 
} 

> cv.err 
[1]  NA 1733.646 1681.587 1636.521 1632.931 1623.112 1611.965 1600.903 1609.973 
[10] 1607.234 # these are the expected results 




cv.err <- rep(NA, 10) 
for (i in 2:10){ 
    age.cut1 = cut(Wage$age, i) 
    fit = glm(wage~age.cut1, data = Wage) 
    cv.err[i] = cv.glm(Wage, fit, K = 10)$delta[2] 
} 
> cv.err 
[1]  NA 1603.255 1608.617 1602.296 1606.265 1606.139 1602.448 1606.063 1605.100 
[10] 1606.986 
+0

_same_コードを2回実行すると、まったく同じ結果が得られないと思います。クロス検証では、ランダムに選択した点を使用してモデルを構築し、モデルをテストするために使用しません。 2回実行すると、ランダムな選択と結果が異なります。 – G5W

+0

すべての 'cv.err'の前に' set.seed(1) 'を設定し、同じ結果が得られるかどうか確認してください。 –

+0

両方のループでランダムシードを1に設定すると、異なる結果が得られます。結果は私の最初の実行と一致しています。私が知る限り、両方のループは同じですが、そうではありませんか? – Redeyes10

答えて

0

はい、これら二つの違いは、あなたのループロジックに大きな違いを生みます。最初のループでは、 age.cut1 $修飾子によって証明賃金データフレームの列であり、glm使用されます。 2番目のループでは、age.cut1はスタンドアロンの別名のベクターであり、の式での未使用のです。数式が使用されるときはいつでも、列はデータ引数で参照されるオブジェクトから派生します。記載されているパッケージとデータ構造に不慣れ

は、最も可能性の高いage.cut1列は前に(エラーが第二のループのglmコールでの参照で発生していないので)ループにWageデータフレーム内に存在しません。ただし、最初のループで更新されるのはcut(Wage$age, i)のみです。同じ名前のオブジェクトが2番目のループに割り当てられていますが、元の列データはそのままglmに残ります。

+0

説明をありがとう! – Redeyes10

関連する問題