-1

会社の保険プランの提供を分析するコードを書き込もうとしていますが、複雑です。PPO プランは簡単ですが、控除額の高い健康保険プランは複雑です。これは、家族向けプランに「分割」控除額自己負担額の上限 (個人と合計) を導入したためです。それはこのように動作します:

  • 個人が個人控除額を満たせば、90% でカバーされます。
  • プランの残りの 1 人以上が控除額の合計を満たせば、家族全員が 90% でカバーされます。
  • 個人は、医療費だけで家族控除額を満たすことはできません

家族 (4 人) の費用のベクトルを入力し、各プランの合計費用を出力したいと考えています。以下は、考えられるシナリオの表です。列コードは次のとおりです。

  • ded_ind: 1 人の個人が個人控除額を満たしましたか?
  • ded_tot: 免責金額の合計に達しましたか?
  • oop_ind: 個人の自己負担上限に達したか
  • oop_tot: 自己負担額の合計が上限に達しましたか?
  • exp_ind= 最も高い支出者の費用
  • exp_rem= 残りの /other/ 家族の費用 (最高額の支出者ではない)
  • oop_max_ind= 個人が自己負担額の最大額を支払った費用のレベル (個人の自己負担額が最大ded_ind + 0.1 * exp_ind =の場合)
  • oop_max_fam= 個人の場合と同じですが、残りの家族の場合

テーブル:

| ded_ind | oop_ind | ded_rem | oop_rem | formula                                       
|---------+---------+---------+---------+---------------------------------------------------------------------------|
|       0 |       0 |       0 |       0 | exp_ind + exp_rem                                                         |
|       1 |       0 |       0 |       0 | ded_ind + 0.1 * (exp_ind - ded_ind) + exp_rem                             |
|       0 |       0 |       1 |       0 | exp_ind + ded_rem + 0.1 * (exp_rem - ded_rem)                             |
|       1 |       1 |       0 |       0 | oop_max_ind + exp_fam                                                     |
|       1 |       0 |       1 |       0 | ded_ind + 0.1 * (exp_ind - ded_ind) + ded_rem + 0.1 * (exp_rem - ded_rem) |
|       0 |       0 |       1 |       1 | oop_max_rem + exp_ind                                                     |
|       1 |       0 |       1 |       1 | ded_ind + 0.1 * (exp_ind - ded_ind) + oop_max_rem                         |
|       1 |       1 |       1 |       0 | oop_ind_max + ded_rem + 0.1 * (exp_rem - ded_rem)                         |
|       1 |       1 |       1 |       1 | oop_ind_max + oop_rem_max                                                 |

省略: 0 1 0 00 0 0 1、、0 1 1 0および0 1 0 1が存在oop_indoop_remない。ded_indded_rem

私の現在のコードは、そのようなやや大規模なifelseループです(コードではなく、それが何をするか):

check if plan is ppo or hsa
  if hsa plan
    if exp_ind + exp_rem < ded_rem # didn't meet family deductible
      if exp_ind < ded_ind # individual deductible also not met
        cost = exp_ind + exp_rem
      else is exp_ind > oop_ind_max # ded_ind met, is oop_ind?
        ded_ind + 0.1 * (exp_ind - ded_ind) + exp_fam # didn't reach oop_max_ind
        else oop_max_ind + exp_fam # reached oop_max_ind

    else ...

それ以外の場合、合計は家族控除額よりも大きくなります。私はそれが 2 人以上によって貢献されたかどうかを確認し、そのように続けます。

問題の背景をいくつか説明したので、私の質問です。このような条件付きの状況を管理するには、ifelseループして少しずつフィルターをかけるよりも良い方法はありますか?

いくつかのより高いレベルの条件をチェックするため、コードは冗長に見えます (テーブルded_remが満たされているか満たされていないかを考えてください...どちらの場合もチェックする必要がded_indありoop_max_ind、コードは同じです...ちょうど配置されています)構造内の 2 つの異なる場所でifelse)。

これは、ある種の行列演算で行うことができますか? 条件のフィルタリングを処理するためのより賢い方法のオンラインの他の例はありますか?

ご提案いただきありがとうございます。


PS 私は R を使用してshinyおり、他の従業員が家族ごとに最良のシナリオと最悪のシナリオを入力し、ドットまたは棒グラフを介してどの計画が先行するかを確認できるように、R を使用してインタラクティブを作成します。

4

2 に答える 2

0

この質問はあまり具体的ではないため、より簡単な例/回答を次に示します。

# example data
test <- expand.grid(opt1=0:1,opt2=0:1)
# create a unique identifier to represent the binary variables
test$code <- with(allopts,paste(opt1,opt2,sep=""))
# create an input variable to be used in functions
test$var1 <- 1:4

#  opt1 opt2 code var1
#1    0    0   00    1
#2    1    0   10    2
#3    0    1   01    3
#4    1    1   11    4

バイナリ条件に応じて適用するそれぞれの関数と、各コンボの意図した結果:

var1 + 10    #code 00 - intended result =   11
var1 + 100   #code 10 - intended result =  102
var1 + 1000  #code 01 - intended result = 1003
var1 + var1  #code 11 - intended result =    8

組み合わせを使用ifelseして計算を行います。

test$result <- with(test,
  ifelse(code == "00", var1 + 10,
  ifelse(code == "10", var1 + 100,
  ifelse(code == "01", var1 + 1000,
  ifelse(code == "11", var1 + var1,
  NA
)))))

結果:

  opt1 opt2 code var1 result
1    0    0   00    1     11
2    1    0   10    2    102
3    0    1   01    3   1003
4    1    1   11    4      8
于 2013-08-08T05:53:16.763 に答える