2012-10-25 4 views
1

다른 사람들이 의사 결정을 내릴 수 있도록 의료 보험 혜택 옵션을 시각화하려고합니다. 나는 테이블과 같이 있습니다ggplot2를 사용하여 R을 사용하여 다양한 사례를 표시하십시오.

| plan |  ded | oop | exp_oop | 
|------+------------+------+---------| 
| a |  400 | 2100 | 17400 | 
| b |  1300 | 2600 | 14300 | 
| c |  2600 | 5200 | 28600 | 
  • ded = 공제; 비용 수준 곳
  • oop = 최대 주머니에서 90 % 공동 보험 차기
  • oop 내가 의료 대 직원에게 비용을 플롯 할

에 도달되는 의료 비용의 exp_oop = 양 발생 비용. 건강 보험은 범위에서 작동합니다 ...

어떻게이 범위를 각각 그릴 수 있습니까? 기본적으로 각 계획의 공제 금액에 대해 0에 대해 기울기 = 1을 얻은 다음 x = deductible에서 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 | 

나는 (직원 등 만 직원 + 배우자) 여러 변종이하고 있어요 그래서 각각의 계획에 대해 별도의 데이터 테이블을 필요로하지 않았다 그러나 다만 이미 작업을 할 수 있다면 그것은 좋은 것입니다 데이터 프레임에 이미있는 최대 공제 금액 및 최대 공제 금액 ...

의견을 보내 주셔서 감사합니다!

+0

는 소리 각각의 계획은 아마도'apply' 또는 유사한 것을 사용합니다. –

+1

설명에 따르면 두 번째 계층과 세 번째 계층 사이의 경계는 'oop'이 아니라 'exp_oop'이어야합니다. –

+0

@BrianDiggs 고정 - 좋은 캐치! – Hendy

답변

1

내 접근 방식은 기본적으로 Drew's을 다음과

enter image description here

, 그러나 다만 다른 단계를 수행합니다. plan, ded, oopexp_oop을 사용하는 함수로 시작한 다음 해당 매개 변수를 기준으로 지정된 비용에 대한 비용을 제공하는 함수를 반환합니다.

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

지금 plyr를 사용하여, 나는 어떤지도 비용에 대한 기능의 목록을 만들 수 있습니다 : [참고. 나는 두 번째와 세 번째 계층 사이의 틈을 가정 한 oop가 아니라 원래의 질문에 언급하지, exp_oop입니다] 비용, 각 계획 당 하나씩

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

각 기능에 대해 지정된 비용 범위에 대한 비용을 결정하십시오. 여기서 0에서 $ 50,000 범위를 $ 100 단위로 선택했습니다.

이렇게하면 긴 형태의 데이터 프레임을 쉽게 그릴 수 있습니다.

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

enter image description here

이 정말 비용 아니지만, 금액은 비용의 주어진 수준의 주머니에서 지불했다. 총 비용에는 추가 사안 (적어도 보험료)이 포함됩니다.

편집 :

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)) 
}) 

: 당신이 모든 변화 포인트 (가장 가까운에 $ 100 반올림에 의존하지 않음), 당신은 dat에서 포인트를 추출하고 이들을 사용할 수 있습니다 포함되어 있는지 확인하려면

나는 합리적인 끝을 만들기 위해 테이블에 가장 큰 값보다 큰 0과 뭔가를 더했다. 일부 높은 값 '을 위해 : 당신은 당신이 설명하는 규칙에 따라 비용을 계산하는 사용자 정의 함수를 작성하고`X <-0의 범위에서 비용을 계산하기 위해이 기능을 사용하려면 같은

enter image description here

+0

나는 그것을 좋아한다. 감사. 'function (f)'이 무엇을 설명 할 수 있습니까? 나는'f'에 대한 언급을 보지 못했습니다 ... 또한 이것은 가장 가까운 100에 약간 부정확 할 것입니다, 맞습니까? 슬로프 변경 사항을 실제 값으로 타겟팅 할 수있는 방법은 없습니다. 시퀀스에 상기 x 값을 포함시키지 않으면 안됩니까? – Hendy

+0

'function (f)'는 유일한 인수로 익명 함수 내에서'f'라는 함수를 취하는 익명 함수를 선언합니다. 이 함수는 data.frame ('cost = f (expenses)')의 생성에서 호출됩니다. –

+0

함수에 대한 설명을 해주셔서 감사합니다. 레. 내 질문의 두 번째 부분은 주위에 사냥하고 데이터 자체에서 시퀀스를 생성 할 수 있다고 믿는다 :'sort (plot [! duplicated (plot $ x), "x"])'. 그것들은 제가하려고하는 플롯에서 중요한 유일한 x 값입니다.깔끔한 것들. – Hendy

1

발생한 비용의 함수로 직원에게 비용을 계산하는 vectorize 함수를 작성하십시오. 벡터화해야하므로 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 seqence 정의 (너무 많은 데이터 포인트를, 또는 계산 비용이된다)과 실제 본인 부담 비용 적에게 비용의 각각의 값을 계산 :

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)) 

enter image description here

+0

답변 해 주셔서 감사합니다. 내가 생각했던 것보다 더 복잡해. 스프레드 시트로 계산하고 CSV를 사용하는 것이 더 낫지는 않습니까? 저는 수동으로 하나를 만들었습니다. 당신의 그래프에 뭔가가 있다고 생각합니다. 세 개의 세그먼트는 큰 점프없이 기울기 = 1, 기울기 = 0.1, 기울기 = 0이어야합니다. 블루 라인은 어떤 이유로 크게 점프합니다. [내 버전] (http://i.stack.imgur.com/d8ea.png)을보십시오. 이것은 단순한 이미지 스케일일까요, 아니면 당신과 맞지 않는 것입니까? 점선을 무시하면 프리미엄 절감액과 회사 HSA 기여도에 따라 조정 된 비용이 표시됩니다. – Hendy

+0

costFinder 함수를 인코딩하는 방식에 실수가있을 수 있습니다. –

관련 문제