Inceptionのようなlist-within-list-within-listオブジェクト構造fda
の使用については気にしませんが、私の応答は、パッケージ作成者が作成したシステムに従います。
私たちが正確に何をしているかを最初に考えることは有益だと思います。あなたがこれまでに行ったことの説明に基づいて、これはあなたがやっていると私が信じていることです(私が何かを誤って解釈した場合はお知らせください)。私は表記法を使い続けますが、実際のデータが不足しているため、RamsayとSilvermanの関数型データ分析、Ramsay、Hooker、およびGravesのRとMATLABを使用した関数型データ分析の例 (次の方程式とコードの一部は直接持ち上げられます)これらの本から)。
機能的な線形モデルを介してスカラー応答をモデル化しています。
yi=β0+∫T0Xi(s)β(s)ds+ϵi
βK
β(s)=∑k=1Kbkθk(s)
行列表記では、これはです。β(s)=θ′(s)b
また、共変量関数もいくつかの基底で拡張します(基底関数など)。そう、L
Xi(s)=∑k=1Lcikψk(s)
繰り返しますが、行列表記では、これはです。X(s)=Cψ(s)
したがって、とすると、モデルは次のように表すことができます。J=∫ψ(s)θ′(s)ds
y=β0+CJb。
そして、およびとすると、モデルはZ=[1CJ]ξ=[β0b′]′
y=Zξ
そして、これは私たちにとってより身近に見えます。
今、あなたはある種の正則化を追加しているのがわかります。fda
パッケージには、フォームの粗さのペナルティで動作します
P=λ∫[Lβ(s)]2ds
線形微分演算子。これで、ペナルティマトリックスを次のように定義するとLR
R=λ⎛⎝⎜⎜⎜⎜⎜00⋮00R1⋮0⋯⋯⋱⋯00⋮RK⎞⎠⎟⎟⎟⎟⎟
ここで、は基底展開に関するものであり、ペナルティ付き二乗和を最小化します。Riβi
(y−Zξ)′(y−Zξ)+λξ′Rξ、
したがって、私たちの問題は、ソリューションの尾根回帰にすぎません。
ξ^=(Z′Z+λR)−1Z′y。
(1)私たちが何をしているかを理解することが重要であると思います、そして(2)上記のいくつかは、後で使用するコードのいくつかを理解するために必要です。コードに...
Rコードを使用したデータの例を次に示します。fda
パッケージで提供されているカナダの気象データセットを使用しています。関数型線形モデルを使用して、多数の気象観測所の年間降水量のログをモデル化し、関数型共変量として各観測所からの温度プロファイル(温度は1日1回365日間記録された)を使用します。私達はあなたがあなたの状況で説明する方法と同様に進みます。データは35ステーションで記録されました。データセットを34のステーションに分割します。これはデータとして使用され、最後のステーションは「新しい」データセットになります。
私はRコードとコメントを介して続行します(fda
パッケージについて十分理解しているので、以下のことは驚くべきことではありません。そうでない場合は、お知らせください)。
# pick out data and 'new data'
dailydat <- daily$precav[,2:35]
dailytemp <- daily$tempav[,2:35]
dailydatNew <- daily$precav[,1]
dailytempNew <- daily$tempav[,1]
# set up response variable
annualprec <- log10(apply(dailydat,2,sum))
# create basis objects for and smooth covariate functions
tempbasis <- create.fourier.basis(c(0,365),65)
tempSmooth <- smooth.basis(day.5,dailytemp,tempbasis)
tempfd <- tempSmooth$fd
# create design matrix object
templist <- vector("list",2)
templist[[1]] <- rep(1,34)
templist[[2]] <- tempfd
# create constant basis (for intercept) and
# fourier basis objects for remaining betas
conbasis <- create.constant.basis(c(0,365))
betabasis <- create.fourier.basis(c(0,365),35)
betalist <- vector("list",2)
betalist[[1]] <- conbasis
betalist[[2]] <- betabasis
# set roughness penalty for betas
Lcoef <- c(0,(2*pi/365)^2,0)
harmaccelLfd <- vec2Lfd(Lcoef, c(0,365))
lambda <- 10^12.5
betafdPar <- fdPar(betabasis, harmaccelLfd, lambda)
betalist[[2]] <- betafdPar
# regress
annPrecTemp <- fRegress(annualprec, templist, betalist)
1年ほど前に機能データについて初めて教えられたとき、私はこのパッケージをいじりました。また、predict.fRegress
欲しいものを手に入れることができませんでした。振り返ってみると、どうすれば動作するのかわかりません。そのため、予測を半手動で取得する必要があります。私は、コードから直接取り出した部分を使用しますfRegress()
。繰り返しますが、私はコードとコメントを介して続行します。
まず、セットアップ:
# create basis objects for and smooth covariate functions for new data
tempSmoothNew <- smooth.basis(day.5,dailytempNew,tempbasis)
tempfdNew <- tempSmoothNew$fd
# create design matrix object for new data
templistNew <- vector("list",2)
templistNew[[1]] <- rep(1,1)
templistNew[[2]] <- tempfdNew
# convert the intercept into an fd object
onebasis <- create.constant.basis(c(0,365))
templistNew[[1]] <- fd(matrix(templistNew[[1]],1,1), onebasis)
予測を取得する
y^new=Znewξ^
をfRegress
計算yhatfdobj
して少し編集するために使用するコードを取り上げます。 台形規則(とがそれぞれの基底で展開されているを介して積分を推定するfRegress
ことyhatfdobj
によって計算します。 ∫T0Xi(s)β(s)Xiβ
通常、にfRegress
格納されている共変量をループすることにより、近似値を計算しannPrecTemp$xfdlist
ます。したがって、問題については、この共変量リストを新しい共変量リストの対応するもの、つまりに置き換えtemplistNew
ます。これがコードです(fRegress
2つの編集、不要なコードのいくつかの削除、およびいくつかのコメントが追加されているで見つかったコードと同じ):
# set up yhat matrix (in our case it's 1x1)
yhatmat <- matrix(0,1,1)
# loop through covariates
p <- length(templistNew)
for(j in 1:p){
xfdj <- templistNew[[j]]
xbasis <- xfdj$basis
xnbasis <- xbasis$nbasis
xrng <- xbasis$rangeval
nfine <- max(501,10*xnbasis+1)
tfine <- seq(xrng[1], xrng[2], len=nfine)
deltat <- tfine[2]-tfine[1]
xmat <- eval.fd(tfine, xfdj)
betafdParj <- annPrecTemp$betaestlist[[j]]
betafdj <- betafdParj$fd
betamat <- eval.fd(tfine, betafdj)
# estimate int(x*beta) via trapezoid rule
fitj <- deltat*(crossprod(xmat,betamat) -
0.5*(outer(xmat[1,],betamat[1,]) +
outer(xmat[nfine,],betamat[nfine,])))
yhatmat <- yhatmat + fitj
}
(注:でこのチャンクと周囲のコードをfRegress
見ると、上で概説した手順が表示されます)。
35のステーションすべてをデータとして使用して天気の例を再実行することによりコードをテストし、上記のループからの出力を比較してannPrecTemp$yhatfdobj
、すべてが一致するようにしました。私はまた、「新しい」データとしてさまざまなステーションを使用して数回実行しましたが、すべてが妥当であるようです。
上記のいずれかが不明確な場合や、正しく機能していない場合はお知らせください。過度に詳細な応答でごめんなさい。私は自分自身を助けることができませんでした:)そして、あなたがまだそれらを所有していない場合は、この応答を書くために使用した2冊の本をチェックしてください。彼らは本当に良い本です。