CombiModel=function(nIter=1e5,paUncPref=T,paSpPeV=T,paUncPerf=T,included=c(T,T,T,T,F,T,T,F)){ ### 1 LOADING PREREQUISITE PACKAGES ### # required package for multivariate normal distribution require("MASS") # required package for simultaneously drawing from multiple normal distributions require("plyr") # required package for converting from correlation matrix to covariance matrix require("MBESS") # required function for rank probabilities getRankMat <- function(values, doExclude=FALSE, excludeA=NA){ require("plyr") if (doExclude==TRUE){values[, excludeA] <- min(values) - 1e6} ranks <- aaply(-values,1,rank,.progress = "text") return(ranks) } ### 2 DATA LOADING ### # load preference data for case load("data") # load performance data for case load("pdata") drugNames <- c("Abacavir/Lamivudine", "Tenofovir/Emtricitabine", "Dolutegravir+TE/AL", "Efavirenz+AL", "Raltegravir (EXCLUDED)", "Atazanavir/Ritonavir+EL", "Elvitegravir/Cobicistat+EL", "Darunavir/Ritonavir (EXCLUDED)" ) # show plots of preference data barplot(-mdata$mean / (min(mdata$mean) - max(mdata$mean)), main="Preference weights from Hauber et al study (blue=included)", names.arg=mdata$par, col=rainbow(2)[c(2,2,2,1,1,1,1,2)]) ### 3 PREFERENCSE ### # 3.1 Include parameter uncertainty in preferences or not? if (paUncPref){ popweights <- mvrnorm(nIter, mdata$mean, mdata$meancov) } else { popweights <- matrix(rep(mdata$mean, 8 * nIter), nrow=nIter, ncol=8, byrow = T) } # 3.2 include patient-specific preference variation or not? ptspecificvariation <- matrix(0, nrow=nIter, ncol=8) if (paSpPeV){ parUncVarEstimator <- mvrnorm(nIter, mdata$sd, mdata$sdcov) for(r in 1:nIter){ ptspecificvariation[r, ]=mvrnorm(1, rep(0,8), diag(parUncVarEstimator[r, ] ^ 2)) } } # 3.3 combine preference samples according to Formula 3 prefsamples <- popweights + ptspecificvariation colnames(prefsamples) <- mdata$par ### 4 CLINICAL PERFORMANCES ### # 4.1 get samples perfsamples <- matrix(0, nrow=nIter, ncol=length(pdata$p1)) colnames(perfsamples) <- paste(rep(pdata$par,(length(pdata$p1)/length(pdata$par))),"_",rep(1:(length(pdata$p1)/length(pdata$par)),each=length(pdata$par)),sep="") if (paUncPerf){ for(i in 1:ncol(perfsamples)){ if(pdata$p2[i]>pdata$p1[i]){ perfsamples[,i] <- rbeta(nIter,pdata$p1[i],pdata$p2[i]) # assumption : all distributions are beta } } } else { for(i in 1:ncol(perfsamples)){ if (pdata$p1[i]>0 & pdata$p2[i]>0){ perfsamples[,i] <- pdata$p1[i] / (pdata$p1[i]+pdata$p2[i]) } } } # 4.2 rescale because preferences are over percentages [1;100], not over probabilities [0;1] perfsamples <- perfsamples * 100 ### 5 VALUE PREDICTION ### # 5.1 predicted values per attribute predPrefWeights <- matrix(nrow=nIter, ncol=length(pdata$p1)) colnames(predPrefWeights) <- paste(colnames(perfsamples),"_pw",sep="") n <- length(pdata$par) for(i in 1:(length(pdata$p1) / length(pdata$par))){ predPrefWeights[, ((i-1)*n+1):(i * n)] <- prefsamples * perfsamples[, ((i-1)*n+1):(i*n)] } ### 6 OUTCOME MEASURES # 6.1 combine value per attribute to get overall values overallValues <- matrix(nrow=nIter, ncol=length(pdata$p1) / length(pdata$par)) n <- length(pdata$par) for(i in 1:(length(pdata$p1) / length(pdata$par))){ overallValues[,i] <- rowSums(predPrefWeights[, ((i-1)*n+1):(i*n)]) } # 6.2 calculate ranks r <- getRankMat(overallValues, T, !included) ### RETURN STATEMENT ### return(list( prefsamples=prefsamples, perfsamples=perfsamples, meanValues=colMeans(overallValues[,included]), values=overallValues[,included], ranks=r[,included] )) } nIter=1e4 dat=list(scen1=NA,scen2=NA,scen3=NA,scen4=NA) dat[[1]]=CombiModel(nIter,T,T,T) # all types of uncertainty dat[[2]]=CombiModel(nIter,T,F,F) # only parameter uncertainty in preferences dat[[3]]=CombiModel(nIter,F,T,F) # only patient-specific preference variation dat[[4]]=CombiModel(nIter,F,F,T) # only parameter uncertainty in performances