HOWTO · R
R の線形回帰モデルで `predict()` 関数を使う方法
R の predict() で線形回帰モデルから応答値を予測する方法を解説します。newdata の形式と、モデル式に合わせた特徴量列名も確認できます。
このページの内容
R で学習済みの線形回帰モデルから応答値を予測するには、モデルと、newdata に渡すデータフレームを指定して predict() を呼び出します。このデータフレームには、モデル式に記載したものと完全に同じ名前の特徴量列が必要です。たとえば lm(Response ~ Feature, data = training) で学習したモデルでは、newdata に Feature という列を含めます。
R の線形回帰モデルで predict() 関数を使う
次の自己完結した例は正常に実行され、3 つの予測値を返します。小さな学習用データフレームを作成してモデルを学習し、新しい 3 つの特徴量に対する予測を求めます。式の Response は推定する値、Feature は入力を表します。predict() は newdata の各行に対して 1 つずつ予測値を返します。
Feature <- 15:24
set.seed(654)
Response <- 2 * Feature + 5 + rnorm(10, mean = 0, sd = 3)
training <- data.frame(Response = Response, Feature = Feature)
model <- lm(Response ~ Feature, data = training)
newdata <- data.frame(Feature = c(20.5, 16.5, 22.5))
predict(object = model, newdata = newdata)
この呼び出しは、学習済みの model を newdata の各行に適用し、入力した行と同じ順序で 1 行につき 1 つの推定値を返します。Feature の値は学習済みの関係に与える入力であり、推定対象は Response です。object と newdata の引数名を明示すると、それぞれの役割が分かりやすくなります。また、lm() に使った学習データではなく、どのデータフレームで予測するのかも読み取りやすくなります。
新しい値は単独のベクトルではなく、データフレームとして渡してください。たとえば predict(model, newdata = c(20.5, 16.5, 22.5)) は、このモデルの予測メソッドが必要とする表形式の入力になりません。特徴量の列名もモデル式に合わせます。data.frame(NewFeature = c(20.5, 16.5, 22.5)) で作ったデータフレームには、モデル式が参照する Feature 列がありません。この場合、R はモデルの元の環境から Feature を探すことがあり、行数に関する警告が出たり、指定した 3 つの値を使わない予測が返ったりします。実際の挙動はその環境で利用できる変数によって異なるため、値が返ってきただけで新しい値が使われたと判断しないでください。意図した入力を明示するには、data.frame(Feature = ...) の形で newdata を作成します。
例を応用するときは、モデル式と予測用データの列名を揃えてください。モデルで別の予測変数名を使う場合は、newdata にも同じ名前の列を用意します。予測変数が複数ある場合は、式で使う変数ごとに列が必要です。各行が、モデルによって Response を推定する 1 件分のデータになります。モデルオブジェクトには学習時の情報も保持されるため、予測データには新しい対象の値を入れ、学習時の変数を誤って繰り返したり別名にしたりしないようにします。
出力は数値の予測ベクトルであり、新たに学習したモデルでも、元の入力を含む表でもありません。予測値を入力値と並べて確認する場合は、newdata を保持し、返されたベクトルとデータフレームにまとめます。たとえば呼び出しの結果を predicted に代入し、Feature = newdata$Feature と Response = predicted を含む結果表を作ると、各特徴量とその推定値の対応が明確になります。不確実性の区間が必要な場合、predict.lm() は区間を指定するオプションもサポートしています。点推定ではなく区間を求めるときに利用してください。