3

R では、またはmgcvなどの変換を含む数式を使用して、パッケージから GAM モデルを適合させることができます。デフォルトでは、変換が適用された数式で指定された変数のみが返されます。logsqrtmodel.frame

変換されていないものを復元する方法はありますdata.frameか?

例:

reg <- mgcv::gam(log(mpg) ~ disp + I(hp^2), data=mtcars)

戻り値

> head(reg$model,3) log(mpg) disp I(hp^2) Mazda RX4 3.044522 160 12100 Mazda RX4 Wag 3.044522 160 12100 Datsun 710 3.126761 108 8649

しかし、この変換されていないデータセットをモデルのmodel.frame

mpg disp hp Mazda RX4 21.0 160 110 Mazda RX4 Wag 21.0 160 110 Datsun 710 22.8 108 93

いくつかの背景:newdataほとんどのモデルのpredict()関数の引数には変換されていないデータが必要なためmodel.frame、関数に戻すことはできませんpredict()newdata引数を省略すると適合値が返されることは既に認識しています。私の要件は、モデル オブジェクトが生データを返すことです。

4

3 に答える 3

4

ここに 1 つの方法があります。ガウス データの場合でも、glmの代わりに使用します。生データフレームを含め、よりもはるかに多くのものを返します。lmglmlm


そうですね、mgcv質問するなら例を挙げたほうがいいですよねmgcv

mgcvとの一貫した基準がありglmます。返される可能性?gamObjectのあるものの完全なリストについては、以下をお読みください。の引数を介して設定すると、gamを返すことができることがわかります。を呼び出すときに、次を追加します。datakeepDatacontrolgamgam

control = gam.control(keepData = TRUE)

簡単で再現可能な例を次に示します。

dat <- data.frame(x = runif(50), y = rnorm(50))
library(mgcv)
fit <- gam(y ~ s(x, bs = 'cr', k = 5), data = dat, control = gam.control(keepData = TRUE))
head(fit$model)  # model frame
head(fit$data)  # original data
于 2017-03-18T18:48:19.357 に答える
3

「用語」からを抽出し、varsそれを使用して元のデータセットをサブセット化できます

head(mtcars[all.vars(reg$terms)], 3)
#               mpg disp  hp
#Mazda RX4     21.0  160 110
#Mazda RX4 Wag 21.0  160 110
#Datsun 710    22.8  108  93

またはcall

v1 <- all.vars(reg$call)
head(get(tail(v1, 1))[head(v1, -1)], 3)
#               mpg disp  hp
#Mazda RX4     21.0  160 110
#Mazda RX4 Wag 21.0  160 110
#Datsun 710    22.8  108  93
于 2017-03-18T18:48:32.190 に答える
1

編集: @李哲源 Zheyuan Li のコメントに基づく

次のアプローチは、元のデータが現在のワークスペースまたは検索パスに存在するかどうかによって異なります。モデルを更新する前に元のデータを削除すると、エラーが発生します。

Error in is.data.frame(data) : object 'dat' not found

dat <- mtcars
reg <- lm(log(mpg) ~ disp + I(hp^2), data=dat)
head(reg$model,3)
#               log(mpg) disp I(hp^2)
# Mazda RX4     3.044522  160   12100
# Mazda RX4 Wag 3.044522  160   12100
# Datsun 710    3.126761  108    8649

# rm( dat )  ## uncomment this line and see error appears after update
reg <- update(reg, mpg ~ disp + hp, method = 'model.frame' )
head(reg)
#                    mpg disp  hp
# Mazda RX4         21.0  160 110
# Mazda RX4 Wag     21.0  160 110
# Datsun 710        22.8  108  93
# Hornet 4 Drive    21.4  258 110
# Hornet Sportabout 18.7  360 175
# Valiant           18.1  225 105
于 2017-03-18T18:42:58.037 に答える