1

私は、他の人が決定を下すのを助けるために、私の会社の健康保険給付オプションを視覚化しようとしています。私はそのようなテーブルを持っています:

| plan |        ded |  oop | exp_oop |
|------+------------+------+---------|
|    a |        400 | 2100 | 17400   |
|    b |       1300 | 2600 | 14300   |
|    c |       2600 | 5200 | 28600   |
  • ded=控除可能; 90%の共同保険が開始される費用レベル
  • oop=ポケットの最大値
  • exp_oopoop=到達した医療費の額

従業員の費用と発生した医療費をプロットしたいと思います。健康保険は範囲で機能します...

cost = expenses for 0 < expenses < ded
cost = deductible + (0.10 x (expenses - ded)) for ded <= expenses < exp_oop
cost = oop for oop <= expenses <= infinity

これらの各範囲をどのようにプロットできますか?基本的に、各計画の控除対象に対して0に対して勾配= 1の線を取得し、次にx=控除可能からx=oopまでの勾配=0.1の線を取得し、次にoopから上向きの勾配=0の線を取得します。

ggplot2で条件付きでプロットする方法がわかりません。上記を使用したい場合は、これらのカットオフの再現可能なコードを次に示します。

dat <- data.frame(plan = c("a", "b", "c"), ded = c(400, 1300, 2600), oop = c(2100, 2600, 5200), exp_oop = c(17400, 14300, 28600))

x / y値を自分で作成する必要がありますか?言い換えれば、そのような中間テーブル?

| plan |     x |    y |
|------+-------+------|
|    1 |     0 |    0 |
|    1 |   400 |  400 |
|    1 | 17400 | 2100 |
|    2 |     0 |    0 |
|    2 |  1300 | 1300 |
|    2 | 14300 | 2600 |
|    3 |     0 |    0 |
|    3 |  2600 | 2600 |
|    3 | 28600 | 5200 |

私はいくつかのバリエーション(従業員のみ、従業員+配偶者など)に対してこれを行っているので、プランごとに個別のデータテーブルは必要ありませんが、すでに定義されている控除対象とポケットの最大値で作業できれば素晴らしいでしょうデータフレームにすでにある値...

提案をありがとう!

4

2 に答える 2

1

発生した費用の関数として従業員の費用を計算するベクトル化関数を記述します。にフィードできるように、ベクトル化する必要がありますddply

costFinder <- function(df, oopActual) {
  #df is your 'dat'; we will throw away exp_oop
  #oopActual should be a vector; it is the x axis of your plot
  ded <- df$ded
  oopMax <- df$oop
  cost <- rep(NA, length(oopActual)) #preallocating with NAs will help ID mistakes
  cost[oopActual<ded] <- oopActual[oopActual<ded]
  cost[ded <= oopActual & oopActual < oopMax] <- 0.1 * (oopActual[ded <= oopActual & oopActual < oopMax] - ded) + ded
  cost[oopMax <= oopActual] <- oopMax
  return(cost)
}

次に、expenseシーケンスを定義し(データポイントが多すぎないか、計算コストが高くなります)、プランごとに、費用の各値に対する実際の自己負担コストを計算します。

expense <- seq(0, 50000, by=200)
allCosts <- ddply(dat, .(plan), costFinder, expense)
names(allCosts)[2:ncol(allCosts)] <- expense

次に、ベクトルを溶かして、で使用できるようにしggplotます。ここでは、allCostsデータフレームの列の名前を数値に変更するという怪しげなトリックを採用しています。これはおそらく悪い考えであり、私はそれを行うためのより良い方法を見つけたいと思っています。

costsM <- melt(allCosts, id.vars="plan") 
names(costsM)[2:3] <- c("expense", "actualOOP")
#melt() interprets the column names as a factor. We have to turn them back into numeric,
#    by turning them into characters first and then numerics.
costsM$expense <- as.character(costsM$expense)
costsM$expense <- as.numeric(costsM$expense)

#Plot the data
p <- ggplot() + geom_line(data=costsM, aes(x=expense, y=actualOOP, colour=plan))
print(p)

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

#Add vertical lines for the expected OOP, if you like - arguably it makes things more confusing.
p + geom_vline(data=dat, aes(xintercept=exp_oop, colour=plan))

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

于 2012-10-25T18:18:00.750 に答える
1

私のアプローチは基本的にDrewのアプローチに従いますが、手順が異なるだけです。、、、を取り、(これらのパラメーターに基づいて)特定の費用のコストを与える関数を返す関数から始めplanます。[注:2番目と3番目の層の間の切れ目は、質問で最初に述べられたものではないと仮定しました。]dedoopexp_oopexp_oopoop

cost_generator <- function(ded, oop, exp_oop, ...) {
  function(expenses) {
    ifelse(expenses < ded, 
           expenses, 
           ifelse(expenses < exp_oop, 
                  ded + (0.1 * (expenses-ded)),
                  oop))
  }
}

を使用してplyr、経費をコストにマッピングする関数のリストを、プランごとに1つずつ作成できます。

library("plyr")
funs <- mlply(dat, cost_generator)

関数ごとに、特定の範囲の経費のコストを決定します。ここでは、0から$50,000までの範囲を$100単位で選択しました。

pts <- ldply(funs, function(f) {
  expenses <- seq(0, 50000, 100)
  data.frame(expenses=expenses, cost=f(expenses))
})

これにより、プロットしやすい長い形式のデータフレームが得られます。

library("ggplot2")
ggplot(pts, aes(expenses, cost, colour=plan)) +
  geom_line()

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

もちろん、これは実際には費用ではありませんが、特定のレベルの費用に対して自己負担で支払われる金額です。総費用には追加のものが含まれます(少なくともプレミアム)。

編集:

すべての変更ポイントが含まれていることを確認したい場合(100ドル単位の四捨五入に依存しない)、以下からポイントを抽出してdat使用できます。

library("reshape2")
exps <- melt(dat, id.var="plan")$value
exps <- c(0, exps, 1.1*max(exps))

pts <- ldply(funs, function(f) {
  data.frame(expenses=exps, cost=f(exps))
})

終わりを合理的にするために、0とテーブルの最大値よりも大きいものを追加しました。

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

于 2012-10-25T19:08:58.750 に答える