モデルを再利用して新しい観測値を予測する
モデルの計算コストが高くない場合は、モデル構築プロセス全体をRスクリプトで文書化し、必要に応じて再実行する傾向があります。モデルフィッティングにランダム要素が含まれている場合は、既知のランダムシードを設定するようにします。
モデルの計算に計算コストがかかる場合でも、上記のスクリプトを使用save()
しますが、intoおよびrdaオブジェクトを使用してモデルオブジェクトを保存します。次に、保存されたオブジェクトが存在する場合はそれをロードするか、存在しない場合if()...else
はコードの関連部分をラップした単純な句を使用してモデルを再適合させるようにスクリプトを変更する傾向があります。
保存したモデルオブジェクトをロードするときは、必要なパッケージを必ずリロードしてください。ただし、ロジットモデルがを介して適合した場合、glm()
Rを超えてロードする追加のパッケージはありません。
次に例を示します。
> set.seed(345)
> df <- data.frame(x = rnorm(20))
> df <- transform(df, y = 5 + (2.3 * x) + rnorm(20))
>
> m1 <- lm(y ~ x, data = df)
>
> save(m1, file = "my_model1.rda")
>
>
> newdf <- data.frame(x = rnorm(20))
>
> load("my_model1.rda")
>
> predict(m1, newdata = newdf)
1 2 3 4 5 6
6.1370366 6.5631503 2.9808845 5.2464261 4.6651015 3.4475255
7 8 9 10 11 12
6.7961764 5.3592901 3.3691800 9.2506653 4.7562096 3.9067537
13 14 15 16 17 18
2.0423691 2.4764664 3.7308918 6.9999064 2.0081902 0.3256407
19 20
5.4247548 2.6906722
これを自動化したい場合は、おそらくスクリプトで次のことを行います。
df <- data.frame(x = rnorm(20))
df <- transform(df, y = 5 + (2.3 * x) + rnorm(20))
if(file.exists("my_model1.rda")) {
load("my_model1.rda")
} else {
m1 <- lm(y ~ x, data = df)
}
newdf <- data.frame(x = rnorm(20))
predict(m1, newdata = newdf)
もちろん、データ生成コードは、実際のデータをロードするコードに置き換えられます。
以前に適合したモデルを新しい観測値で更新する
追加の新しい観測値を使用してモデルを再適合させたい場合。次にupdate()
、便利な機能です。1つ以上のモデル引数を更新してモデルを再適合させるだけです。モデルの適合に使用されるデータに新しい観測値を含める場合は、引数'data'
に渡されたデータフレームに新しい観測値を追加してから、次の手順を実行します。
m2 <- update(m1, . ~ ., data = df)
ここではm1
、元の、保存されたモデル適合され. ~ .
、この場合、手段は、の左と右両側に、既存のすべての変数が含まれるモデル式が変更される~
(換言すれば、モデル式に変更を加えない)、そしてdf
あります元のモデルを適合させるために使用されるデータフレーム。新しく利用可能な観測値を含むように拡張されました。
これが実際の例です:
> set.seed(123)
> df <- data.frame(x = rnorm(20))
> df <- transform(df, y = 5 + (2.3 * x) + rnorm(20))
>
> m1 <- lm(y ~ x, data = df)
> m1
Call:
lm(formula = y ~ x, data = df)
Coefficients:
(Intercept) x
4.960 2.222
>
>
> newdf <- data.frame(x = rnorm(20))
> newdf <- transform(newdf, y = 5 + (2.3 * x) + rnorm(20))
>
> df <- rbind(df, newdf)
>
>
> m2 <- update(m1, . ~ ., data = df)
> m2
Call:
lm(formula = y ~ x, data = df)
Coefficients:
(Intercept) x
4.928 2.187
他の人はコメントformula()
で言及しました、それは適合されたモデルから式を抽出します:
> formula(m1)
y ~ x
>
>
> m3 <- lm(formula(m1), data = df)
ただし、モデルフィッティングに、などの追加の引数'family'
、または'subset'
より複雑なモデルフィッティング関数の引数が含まれる場合。update()
モデルフィッティング関数にメソッドが使用できる場合(のような多くの一般的なフィッティング関数に使用できますglm()
)、モデル式を抽出して再利用するよりも簡単にモデルフィッティングを更新できます。
Rですべてのモデリングと将来の予測を行うつもりなら、PMMLなどを介してモデルを抽象化することにはあまり意味がないようです。
data
引数で更新されたデータを提供することができます...私があなたを正しく理解したと仮定して...