Rの時間依存係数-実行方法


17

更新:別の更新で申し訳ありませんが、分数多項式と競合するリスクパッケージを使用したいくつかの可能な解決策を見つけました。


問題

私はRにある時間依存係数分析を行う簡単な方法を見つけることができません。変数係数を取り、それを時間依存係数(変数ではない)に入れてから、時間に対する変動をプロットしたいです:

βmy_variable=β0+β1t+β2t2...

可能な解決策

1)データセットの分割

この例(ラボセッションのパート2)を見てきましたが、別のデータセットの作成は複雑で、計算コストがかかり、あまり直感的ではないようです...

2)ランクの低いモデル-coxvcパッケージ

coxvcパッケージには、問題に対処するためのエレガントな方法を提供します-ここだマニュアル。問題は、作成者がパッケージを開発していないことです(最後のバージョンは2007年5月23日以降です)。電子メールでの会話の後、パッケージが機能するようになりましたが、データセットで1回の実行に5時間かかりました(140 000エントリ)、期間の終わりに極端な推定値を提供します。ここで少し更新されたパッケージを見つけることができます-私はほとんどプロット関数を更新しました。

それは単に微調整の問題かもしれませんが、ソフトウェアは信頼区間を簡単に提供できず、プロセスは非常に時間がかかるため、他のソリューションを今見ています。

3)timeregパッケージ

印象的なtimeregパッケージもこの問題に対処していますが、その使用方法は定かではなく、スムーズなプロットが得られません。

4)分数多項式時間(FPT)モデル

アニカ・ブッフホルツは、「治療と予後因子の経時変化の長期的影響の評価」に関する優れた論文を見つけました。彼女は、Sauerbreiらの提案したFPTが時間依存係数に最も適切であると結論付けています。

FPTは時変効果の検出に非常に優れていますが、ランクの削減アプローチでは時変効果の選択が含まれないため、モデルが非常に複雑になります。

研究は非常に完了しているように見えますが、私には少し手の届かないところにあります。彼女はたまたまザウアーブレイと仕事をしているので、私も少し不思議に思っています。それは健全に思えますが、mfpパッケージを使用して分析を行うことができると思いますが、どうすればよいかわかりません。

5)cmprskパッケージ

私は競合するリスク分析を行うことを考えてきましたが、計算には時間がかかるため、通常のcox回帰に切り替えました。CRRは、時間依存の共変量のオプションをthougあります。

....
cov2        matrix of covariates that will be multiplied 
            by functions of time; if used, often these 
            covariates would also appear in cov1 to give 
            a prop hazards effect plus a time interaction
....

二次の例はありますが、実際に時間が表示される場所にはあまり従わず、その表示方法もわかりません。test.Rファイルも見てきましたが、例は基本的に同じです...

私のサンプルコード

さまざまな可能性をテストするために使用する例を次に示します

library("survival")
library("timereg")
data(sTRACE)

# Basic cox regression    
surv <- with(sTRACE, Surv(time/365,status==9))
fit1 <- coxph(surv~age+sex+diabetes+chf+vf, data=sTRACE)
check <- cox.zph(fit1)
print(check)
plot(check, resid=F)
# vf seems to be the most time varying

######################################
# Do the analysis with the code from #
# the example that I've found        #
######################################

# Split the dataset according to the splitSurv() from prof. Wesley O. Johnson
# http://anson.ucdavis.edu/~johnson/st222/lab8/splitSurv.ssc
new_split_dataset = splitSuv(sTRACE$time/365, sTRACE$status==9, sTRACE[, grep("(age|sex|diabetes|chf|vf)", names(sTRACE))])

surv2 <- with(new_split_dataset, Surv(start, stop, event))
fit2 <- coxph(surv2~age+sex+diabetes+chf+I(pspline(stop)*vf), data=new_split_dataset)
print(fit2)

######################################
# Do the analysis by just straifying #
######################################
fit3 <- coxph(surv~age+sex+diabetes+chf+strata(vf), data=sTRACE)
print(fit3)

# High computational cost!
# The price for 259 events
sum((sTRACE$status==9)*1)
# ~240 times larger dataset!
NROW(new_split_dataset)/NROW(sTRACE)

########################################
# Do the analysis with the coxvc and   #
# the timecox from the timereg library #
########################################
Ft_1 <- cbind(rep(1,nrow(sTRACE)),bs(sTRACE$time/365,df=3))
fit_coxvc1 <- coxvc(surv~vf+sex, Ft_1, rank=2, data=sTRACE)

fit_coxvc2 <- coxvc(surv~vf+sex, Ft_1, rank=1, data=sTRACE)

Ft_3 <- cbind(rep(1,nrow(sTRACE)),bs(sTRACE$time/365,df=5))
fit_coxvc3 <- coxvc(surv~vf+sex, Ft_3, rank=2, data=sTRACE)

layout(matrix(1:3, ncol=1))
my_plotcoxvc <- function(fit, fun="effects"){
    plotcoxvc(fit,fun=fun,xlab='time in years', ylim=c(-1,1), legend_x=.010)
    abline(0,0, lty=2, col=rgb(.5,.5,.5,.5))
    title(paste("B-spline =", NCOL(fit$Ftime)-1, "df and rank =", fit$rank))
}
my_plotcoxvc(fit_coxvc1)
my_plotcoxvc(fit_coxvc2)
my_plotcoxvc(fit_coxvc3)

# Next group
my_plotcoxvc(fit_coxvc1)

fit_timecox1<-timecox(surv~sex + vf, data=sTRACE)
plot(fit_timecox1, xlab="time in years", specific.comps=c(2,3))

これらのグラフのコード結果:比較coxvcための異なる設定との coxvcとtimecoxのプロット。結果は大丈夫だと思いますが、timecoxグラフを説明することはできないと思います-複雑に思えます...

私の(現在の)質問

  • RでFPT分析を行うにはどうすればよいですか?
  • cmprskで時間共変量を使用するにはどうすればよいですか?
  • 結果をプロットする方法(できれば信頼区間)?

3
y=xβmyy=xβ0+xtβ1+xt2β2y~xy~x*(t+t^2)-ty~x+x:t+x:t^2

2番目の部分:「2. PHの仮定を確認するための確定的な時間依存共変量のモデル化」は、私の質問に対処する部分だと思いました。私はあなたが説明する式の何かをしたいと思っていましたが、それを試してみたときにエラーまたは別の時間変数を取得しました...時間に対して低いp値を取得しました:-D
Max Gordon

@ max-gordon、あなたの応答変数は量ですか、それともイベントが発生するまでの時間ですか?引用するほとんどの方法は、具体的にはイベントまでの時間データ用です。
f1r3br4nd

@ f1r3br4nd:これは、ハザードが非比例的である量(私の研究では年齢)です。つまり、イベントまでの時間モデルでは時間とともに変化します。審査に合格したことがないでしょう... -最後に、私は私が3-Dグラフを行うことで感激はなかったように2つの異なる時間フレームに分割することを決めた
マックス・ゴードン

時間に依存する/変化する予測変数と時間の相互作用には違いがあります。ほとんどの変数は時間に依存します(性別は例外です)。1人に1つの観測がある場合、時間依存/変動分析を実行する機会はほとんど、またはまったくありません。Anderson-Gillの方法は、時間依存の生存分析に最も頻繁に使用されます。時間依存の方法の利点は、フォローアップ中の値がベースライン値よりも生存経験を予測しやすいことです。2番目の状況である、時間と相互作用する予測子は、PH仮定の単なるテストです。
アダムロビンソン

回答:


8

@mpiktasは、実行可能なモデルを提供することに近づきましたが、time = tで2次関数に使用する必要がある用語はになりますI(t^2))。これは、Rでは "^"の式の解釈が相互作用を作成し、べき乗を実行しないため、 "t"と "t"の相互作用は単なる "t"であるためです。(これは[r]タグを使用してSOに移行すべきではありませんか?)

このプロセスの代替案については、推論の目的には多少疑わしく思えますが、Harrellのrms / Hmiscパッケージでサポート機能を使用することにおそらく興味がある場合は、Harrellの「回帰モデリング戦略」を参照してください。彼は(しかし彼は自分の論文のいくつかを引用しているが、ただ通過するだけで)時間のスケールに適合するスプラインを構築してバスタブ型の危険をモデル化することに言及している。パラメトリック生存モデルに関する彼の章では、比例ハザードの仮定をチェックし、時間スケールでの推定ログハザード効果の線形性を調べるためのさまざまなプロット手法について説明しています。

編集:追加のオプションはcoxph、「オプションの時間変換関数のリスト」として説明されている 'tt'パラメーターを使用することです。


これはおそらくSO [r]タグに移動する必要があることに同意します。
ザック

あなたの答えを+1してください、これがとても難しい答えだとは知りませんでした。それは一般的な問題のように思えます。おそらく、質問はコーディングの問題よりも多く、おそらくあなたはSOがより良い選択であることについて正しいかもしれません。あなたの式を試してみましたが、vf + I(vf log(time))が優れた適合性を持っているようです。vftimeとvf * time ^ 2 だけを試しましたが、ログは運賃で最も低いp値を与えました。私はAICを取得するために、CPH()関数でそれを実行しようとしたが、それはエラーを与えた:(あなたは、推定上のプロットを行う方法の任意のアイデアを持っていますか?
マックス・ゴードン

check <- cox.zph(fit1); print(check); plot(check, resid=F)あなたの設定のように、時間「効果」の有益なプロットを与えたと思いました。rmsパッケージからのcph()またはサバイバルからのcoxphを意味しましたか?
DWin

はい、シェーンフェルト残差は時間変動の良いアイデアを提供しますが、人々はそれを理解するのに苦労するかもしれないと思います。プロットは、私のモデルでは説明されていない残差変動を理解できるように提供します。私はy軸に完全な可変効果があり、x軸に時間があるプロットが欲しいのですが、テーブルとプロットの両方を見る必要がないので、これは解釈しやすいと思います時間内の特定のポイントで危険を取得するには...はい、私は1つは、AIC()で仕事をしないためCPH()とないcoxphを()意味
マックス・ゴードン

私は質問で説明されているすべての複雑な方法を見つけた理由に少し混乱していますが、このI(変数*時間)は非常に簡単で直感的です?
マックスゴードン

5

@DWinと@Zachのどちらの答えも、時変係数をモデル化する方法を完全に答えていないため、これに対する答えを変更しました。私は最近これについて投稿しました。ここにその要点があります。

h(t)

h(t)=f(t)S(t)

f(t)S(t)0

time0S(t)

他の時点で被験者が入ることを許可する場合、Survfrom Surv(time, status)を変更する必要がありますSurv(start_time, end_time, status)。一方でend_time、強く、結果と相関しているstart_time(同じように、元の提案でほのめかし)の相互作用項として利用できるようになりました。通常の設定でstart_timeは、後に表示されるいくつかの被験者を除いて0ですが、各観測をいくつかの期間に分割します。唯一の違いは、各観測が複数回発生することです。最後の観測以外はすべて、打ち切りのない結果のオプションがあります。

実際の時間分割

この時間分割を簡単にするGregパッケージをCRANで公開しました。まず、いくつかの理論的観察から始めます。

library(Greg)
test_data <- data.frame(
  id = 1:4,
  time = c(4, 3.5, 1, 5),
  event = c("censored", "dead", "alive", "dead"),
  age = c(62.2, 55.3, 73.7, 46.3),
  date = as.Date(
    c("2003-01-01", 
      "2010-04-01", 
      "2013-09-20",
      "2002-02-23"))
)

イベントを示す*を使用して、これをグラフィカルに表示できます。

ここに画像の説明を入力してください

timeSplitter以下を適用する場合:

library(dplyr)
split_data <- 
  test_data %>% 
  select(id, event, time, age, date) %>% 
  timeSplitter(by = 2, # The time that we want to split by
               event_var = "event",
               time_var = "time",
               event_start_status = "alive",
               time_related_vars = c("age", "date"))

次のものが得られます。

ここに画像の説明を入力してください

ご覧のとおり、各オブジェクトは複数のイベントに分割されており、最後の期間には実際のイベントステータスが含まれています。これにより、単純な:相互作用項を持つモデルを構築できるようになります(*これを拡張するためtime + var + time:var、を使用しないでください。時間自体には関心がありません)。I()関数を使用する必要はありませんが、時間の非線形性を確認する場合は、スプラインを追加してからを使用して表示する別の時間相互作用変数を作成することがよくありますrms::contrast。とにかく、回帰呼び出しは次のようになります。

coxp(Surv(start_time, end_time, event) ~ var1 + var2 + var2:time, 
     data = time_split_data)

サバイバルパッケージのtt機能を使用する

また、tt関数を使用してサバイバルパッケージで時間依存係数を直接モデル化する方法もあります。Therneau教授は、彼のビネットで主題について徹底的に紹介しています。残念ながら、大規模なデータセットでは、メモリの制限によりこれを行うのは困難です。このtt関数は、時間を非常に細かい部分に分割し、その過程で巨大なマトリックスを生成するようです。


2

PerformanceAnalyticsapply.rolling関数を使用して、ローリングウィンドウを通じて線形回帰を実行することができます。これにより、係数は時間とともに変化します。

例えば:

library(PerformanceAnalytics)
library(quantmod)
getSymbols(c('AAPL','SPY'), from='01-01-1900')
chart.RollingRegression(Cl(AAPL),Cl(SPY), width=252, attribute='Beta')
#Note: Alpha=y-intercept, Beta=regression coeffient

これは他の機能でも機能します。


答えてくれてありがとう、動く時間枠は私のアプローチと同じように機能するはずです。あなたの例を実行することはできませんが、私のsTRACEの例に基づいて例を挙げて、それを実装する方法を正確に知ることができますか?
マックスゴードン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.