17

ロジスティック回帰の時間傾向をモデル化するためにGAMを使用しています。それでも、フィットしたスプラインを抽出して、GAMまたはGAMMにフィットできない別のモデルに追加したいと思います。

したがって、2つの質問があります。

  1. モデルに他のノットを見つけさせながら、1つのノットを特定の場所に強制的に配置するために、時間の経過とともにスムーズにフィットするにはどうすればよいですか?

  2. フィットしたGAMから行列を抽出して、別のモデルの代入として使用できるようにするにはどうすればよいですか?

私が実行しているモデルのタイプは、次の形式です。

gam <- gam(mortality.under.2~ maternal_age_c+ I(maternal_age_c^2)+
           s(birth_year,by=wealth2) + wealth2 + sex +
           residence + maternal_educ + birth_order,
           data=colombia2, family="binomial")

GAMの広範なドキュメントを読みましたが、まだわかりません。どんな提案でも本当にありがたいです。

4

1 に答える 1

38

メソッドとを使用して、これmgcv::gamを行う方法(Q2)が あります。predict.gamtype = "lpmatrix"

?predict.gam以下に再現する例もあります。

 library(mgcv)
 n <- 200
 sig <- 2
 dat <- gamSim(1,n=n,scale=sig)

 b <- gam(y ~ s(x0) + s(I(x1^2)) + s(x2) + offset(x3), data = dat)

 newd <- data.frame(x0=(0:30)/30, x1=(0:30)/30, x2=(0:30)/30, x3=(0:30)/30)

 Xp <- predict(b, newd, type="lpmatrix")

 ##################################################################
 ## The following shows how to use use an "lpmatrix" as a lookup 
 ## table for approximate prediction. The idea is to create 
 ## approximate prediction matrix rows by appropriate linear 
 ## interpolation of an existing prediction matrix. The additivity 
 ## of a GAM makes this possible. 
 ## There is no reason to ever do this in R, but the following 
 ## code provides a useful template for predicting from a fitted 
 ## gam *outside* R: all that is needed is the coefficient vector 
 ## and the prediction matrix. Use larger `Xp'/ smaller `dx' and/or 
 ## higher order interpolation for higher accuracy.  
 ###################################################################

 xn <- c(.341,.122,.476,.981) ## want prediction at these values
 x0 <- 1         ## intercept column
 dx <- 1/30      ## covariate spacing in `newd'
 for (j in 0:2) { ## loop through smooth terms
   cols <- 1+j*9 +1:9      ## relevant cols of Xp
   i <- floor(xn[j+1]*30)  ## find relevant rows of Xp
   w1 <- (xn[j+1]-i*dx)/dx ## interpolation weights
   ## find approx. predict matrix row portion, by interpolation
   x0 <- c(x0,Xp[i+2,cols]*w1 + Xp[i+1,cols]*(1-w1))
 }
 dim(x0)<-c(1,28) 
 fv <- x0%*%coef(b) + xn[4];fv    ## evaluate and add offset
 se <- sqrt(x0%*%b$Vp%*%t(x0));se ## get standard error
 ## compare to normal prediction
 predict(b,newdata=data.frame(x0=xn[1],x1=xn[2],
         x2=xn[3],x3=xn[4]),se=TRUE)

これは、RまたはGAMモデルの外部で実行される予測ステップでさえ、プロセス全体を通過します。例ではモデル内のすべての項を評価し、スプライン以外に2つの項があるため、例を少し変更して必要な処理を行う必要があります。基本的に同じことを行いますが、スプライン項に対してのみ行います。Xpスプラインに関連する行列の列と行を見つける必要があります。次に、スプ​​ラインが中央に配置されていることに注意する必要があります。これにより、スプラインを元に戻すことも、元に戻すこともできます。

Q1についてxnは、例のベクトル/行列に適切な値を選択してください。これらnは、モデルの第3項の値に対応します。したがって、固定したいものを平均値に設定してから、スプラインに関連付けられているものを変更します。

これらすべてをRで実行している場合は、他のモデルに入力されるデータがあるスプライン共変量の値でスプラインを評価する方が簡単です。これを行うには、予測する値のデータフレームを作成してから、

predict(mod, newdata = newdat, type = "terms")

ここで、は(を介して)mod近似されたGAMモデルであり、はモデル内の各変数の列を含むデータフレームです(パラメトリック項を含みます。変更したくない項を一定の平均値に設定します[たとえば、データセット内の変数]または因子の場合は特定のレベル)。パーツは、スプライン項を含むモデル内の各項の近似値への「寄与」を含む各行の行列を返します。スプラインに対応するこの行列の列を取得します。これも中央に配置されます。mgcv::gamnewdattype = "terms"newdat

おそらく私はあなたのQ1を誤解しました。ノットを制御する場合は、のknots引数を参照してくださいmgcv::gam。デフォルトでmgcv::gamは、データの両端にノットを配置し、残りの「ノット」を間隔全体に均等に広げます。ノットが見つかりmgcv::gamません-それはあなたのためにそれらを配置し、あなたはそれが引数を介してそれらを配置する場所を制御することができます。knots

于 2013-03-23T14:17:44.063 に答える