nutterb / HydeNet

Hybrid Decision Networks in R
Other
23 stars 3 forks source link

policyMatrixValues() returns null #96

Closed jarrod-dalton closed 8 years ago

jarrod-dalton commented 8 years ago

Maybe I'm doing something wrong, or maybe I need to update to the latest and greatest version, but I get nothing when I ask for the default policy matrix in the antiemetic example:

g <- HydeNetwork(~ Emesis | Age*Sex*Drug
                 + DrugCost | Drug
                 + ClinicianCosts | Emesis*SE
                 + SE | Emesis*Drug
                 + SETreatmentCosts | SE*TreatSE
                 + TreatSE | Emesis*Drug
                 + Resolution | Drug*SE*TreatSE*Emesis
                 + OutcomesAvoided | Emesis*SE*Resolution)

g <- setDecisionNodes(g, Drug, TreatSE)
g <- setUtilityNodes(g, DrugCost, ClinicianCosts,
                     SETreatmentCosts, OutcomesAvoided)

g <- setNode(g, Age, nodeType = "dnorm", mu=60, tau=1/(12^2))
g <- setNode(g, Sex, nodeType = "dbern", p=0.5,
             factorLevels = c("M","F"))
g <- setNode(g, Drug, nodeType = "dbern", "dbern", p=0.5,
             factorLevels = c("Metoclopramide","Ondansetron"))

eqn <- "ilogit(-4.1 + 0.31*(Age/10) + 0.66*Sex + 1.15*Drug + 0.23*Sex*Drug)"
g <- setNode(g, Emesis, nodeType = "dbern", p=eqn,
             validate=FALSE, factorLevels = c("No","Yes"))

data(SE.cpt)
g <- setNodeModels(g, SE.cpt)

g <- setNode(g, TreatSE, nodeType = "dbern",
             p = "0.40 + 0.18*Drug + 0.12*Emesis - 0.03*Drug*Emesis",
             validate=FALSE, factorLevels = c("No","Yes"))

data(Resolution.cpt)
g <- setNodeModels(g, Resolution.cpt)

g <- setNode(g, DrugCost, "determ", define=fromFormula(),
             nodeFormula = DrugCost ~ ifelse(Drug=="Metoclopramide",10,12))

g <- setNode(g, SETreatmentCosts, "determ", define=fromFormula(),
             nodeFormula = SETreatmentCosts ~ ifelse(SE=="Yes" && TreatSE=="Yes",5,0))

g <- setNode(g, ClinicianCosts, "determ", define=fromFormula(),
             nodeFormula = ClinicianCosts ~ ifelse(Emesis=="Yes",30,0)
                                          + ifelse(SE=="Yes",20,0))

g <- setNode(g, OutcomesAvoided, "determ", define=fromFormula(),
             nodeFormula = OutcomesAvoided ~ 
               ifelse(Emesis=="Yes",
                      ifelse(SE=="Yes",
                             ifelse(Resolution=="Resolved", 0.25, 0.00),
                             0.3),
                      ifelse(SE=="Yes",
                             ifelse(Resolution=="Resolved", 0.60, 0.35),
                             1.0)))

policyMatrix(g)
[1] Drug    TreatSE
<0 rows> (or 0-length row.names)
nutterb commented 8 years ago

I had foolishly divorced the factorLevels argument in setNode from the policyValues argument. The undesirable side effect was that you had to set them both.

In the code I just committed, setNode now has the format setNode(factorLevels = NULL, policyValues = factorLevels). If you only set the factor levels now, it will copy them over into policy values as well (or you can set them differently if you like).