CaseStudyForm
Title Extended Health Clinic
DateSubmitted 25 Sep 2017
CaseStudyType TeachingCaseStudy
OperationsResearchTopics SimulationModelling
ApplicationAreas Healthcare
ProblemDescription This case study extends the Simple Health Clinic – Scheduled Appointments model. The extensions are:
1. Walk-up patients are triaged before receiving treatment;
2. After being triaged, some walk-up patients need to have a test performed before seeing a doctor;
3. Appointment patients arrive at their appointment times +/- a few minutes;
4. The arrival rate of walk-up patients varies over the day.

The goal of this simulation study is to analyse the average time patients spend:

1. waiting for treatment; and
2. in the clinic;
and the average length of the patient queue (which informs waiting room size). This analysis will include a comparison of the walk-up vs scheduled patients.

ProblemFormulation In order to formulate a simulation model we specify the following components:
1. Background – problem description
2. Objectives of the study
3. Expected benefits
4. The CM: inputs, outputs, content, assumptions, simplifications’
5. Experiments to run

Components 1(Background – problem description) and 2 (Objectives of the study) are given in the Problem Description section (see paragraph describing the goal of the simulation study to identify study objectives).

The Expected benefits (component 3) are a virtual environment for evaluating patient waiting times, total time patients spend in the clinic, and the number of patients waiting for treatment. This environment can be used to experiment with changes to the clinic, including a comparison of effects on the waiting times, queue length, etc for the walk-up vs the scheduled patients.

The CM content is specified using the following components:

1. Component List
2. Process flow diagram
3. Logic flow diagram
4. Activity cycle diagram

Component List

The components of the Extended Health Clinic model are:

• Walk-up patients with their (inter)arrival times
• Scheduled patients with their appointment times
• Triage nurses with their triage times
• Test nurses with their testing times
• Doctors with their treatment times
• Waiting room with its capacity

Process Flow Diagram

 Patient Logic Flow Diagram Doctor Logic Flow Diagrams Nurse Logic Flow Diagrams

Activity Cycle Diagram

Once the content has been established (note this is usually an iterative process) we can identify the inputs and outputs: appointment times, interarrival times, triage times, test times, treatment times, waiting times for triage, testing, and treatment (i.e., Patient arrives to Nurse triages Patient, Nurse triages Patient to Nurse performs test on Patient, Nurse performs test on Patient to Doctor sees Patient, Nurse triages Patient to Doctor sees Patient, Patient arrives to Doctor sees Patient), total clinic time (Patient arrives to Outside), number in waiting room.

Assumptions are used to define stochasticity (e.g., Exponential interarrivals, Triangular treatment times) and the simplifications keep the system simple (e.g., single doctors and nurses on all day for triage, testing, and treatment, no registration, no prioritisation).

ComputationalModel Start with the Simple Health Clinic – Scheduled Appointments JaamSim model.

Select the PatientEntity and add a Test attribute to the AttributeDefinitionList by adding { Test 0} to the list.

Now add a distribution that determines if a Walk-Up patient needs a test or not. Add a DiscreteDistribution object from Model Palette > Probability Distributions. Name it TestDistribution and edit it so that 30% of Walk-Up patients require tests.

| Object | Graphics | Key Inputs | | TestDistribution | Position = 1 -2.5 0.0 m | UnitType = DimensionlessUnit, ValueList = 0 1, ProbabilityList = 0.7 0.3 |

Now select the AssignWalkup object and add { `'this.obj.Test = [TestDistribution].Value'` } to AttributeAssignmentList.

Next, create two new servers (Process Flow > Server), one for triage and one for testing. Name then NurseTriage and NurseTest respectively and give them the nurse.png (icon made by Freepik from www.flaticon.com) graphic. Lay out NurseTriage (on the left), NurseTest (on the right), and TestDistribution (near NurseTest) as shown below:

Rename the ArriveToTreat EntityConveyor to be ArriveToTriage and change NextComponent to be NurseTriage. You can redirect the EntityConveyor by clicking on it, then Ctrl-clicking on its end point and dragging it to where you want it to be. Redirect ArriveToTriage as shown below:

Next, we need to add the branching for the potential test. Add a Branch object (Model Palette > Process Flow > Branch) and name it TestBranch. Now add 3 more EntityConveyors: TriageToDoctor, TriageToTest, TestToDoctor. TestBranch and the 3 conveyors are shown below (TriageToTest going horizontal left to right, TriageToDoctor diagonally down left, TestToDoctor diagonally down left).

Next, make sure that the flow of the patients through the triage and test conveyors and servers is set correctly. The TestBranch object uses the value of the entities' Test attribute with 1 added to it to transform it from a {0, 1} value to a {1, 2} value (JaamSim starts lists at 1 not 0), so a patient that doesn't need a test (Test = 0) goes to the first component in the list, i.e., TriageToDoctor conveyor.

| Object | Key Inputs | | ArriveToTriage | NextComponent = NurseTriage | | NurseTriage | NextComponent = TestBranch | | TestBranch | NextComponentList = TriageToDoctor TriageToTest, Choice = `'this.obj.Test + 1'` | | TriageToDoctor | NextComponent = Doctor, TravelTime = 2 min | | TriageToTest | NextComponent = NurseTest, TravelTime = 2 min | | NurseTest | NextComponent = TestToDoctor | | TriageToDoctor | NextComponent = Doctor, TravelTime = 2 min |

Now, add Queues for both triage and testing, set these queues as the wait queues for triage and testing. The treatment time is modelled by a triangular distribution with minimum 2 minutes, maximum 15 minutes and mode (most likely) 8 minutes, so add a TriangularDistribution called TriageDistribution with these parameters. The test time is modelled as a constant time of 10 minutes, so add this to the NurseTest's ServiceTime. You need to change the StateAssignment of NurseTriage and NurseTest to reflect these activities too.

| Object | Key Inputs | | NurseTriage | WaitQueue = TriageQueue, StateAssignment = Triage, ServiceTime = TriageDistribution | | NurseTest | WaitQueue = TestQueue, StateAssignment = Test, ServiceTime = 10 min | | TriageDistribution | UnitType = TimeUnit, MinValue = 2 min, MaxValue = 15 min, Mode = 8 min |

Finally, you should change the StateAssignment of all your queues so that we can track the time spent waiting for various sets in the pathway. You also need to change the DefaultStateList of your patient entities.

| Object | Key Inputs | | WalkupQueue | StateAssignment = WaitTreat | | AppointmentQueue | StateAssignment = WaitTreat | | TriageQueue | StateAssignment = WaitTriage | | TestQueue | StateAssignment = WaitTest | | PatientEntity | DefaultStateList = { Arrive WaitTreat WaitTriage WaitTest Treat Triage Test Leave } |

At this point you can run your simulation and ensure that your triage/test process does not cause any errors.

However, now that the PatientEntity has new states we need to modify and append our Statistics modules and Simulation output. Change the existing Statistics modules to gather all the time in the system and waiting times and change the outputs generated by the simulation.

| Object | Key Inputs | | TimeInSystem | SampleValue = `'this.obj.StateTimes([[Arrive]]) + this.obj.StateTimes([[WaitTriage]]) + this.obj.StateTimes([[Triage]]) + this.obj.StateTimes([[WaitTest]]) + this.obj.StateTimes([[Test]]) + this.obj.StateTimes([[WaitTreat]]) + this.obj.StateTimes([[Treat]]) + this.obj.StateTimes([[Leave]])'` | | WaitingTime | NextComponent = WaitingTriage
SampleValue = `'this.obj.StateTimes([[WaitTriage]]) + this.obj.StateTimes([[WaitTest]]) + this.obj.StateTimes([[WaitTreat]])'` | | TimeInSystem2 | SampleValue = `'this.obj.StateTimes([[Arrive]]) + this.obj.StateTimes([[WaitTreat]]) + this.obj.StateTimes([[Treat]]) + this.obj.StateTimes([[Leave]])'` | | WaitingTime2 | NextComponent = WaitingTriage
SampleValue = this.obj.StateTimes([[WaitTreat]]) | | WaitingTriage (New Statistics component) | UnitType = TimeUnit
NextComponent = WaitingTest
SampleValue = this.obj.StateTimes([[WaitTriage]]) | | WaitingTest (New Statistics component) | UnitType = TimeUnit
NextComponent = WaitingTreat
SampleValue = this.obj.StateTimes([[WaitTest]]) | | WaitingTreat (New Statistics component) | UnitType = TimeUnit
NextComponent = PatientWalkupSink
SampleValue = this.obj.StateTimes([[WaitTreat]]) | | Simulation | UnitTypeList = DimensionlessUnit TimeUnit TimeUnit TimeUnit TimeUnit TimeUnit DimensionlessUnit DimensionlessUnit TimeUnit TimeUnit DimensionlessUnit DimensionlessUnit
RunOutputList = { [Simulation].RunIndex(1) } { [WaitingTriage].SampleAverage } { [WaitingTest].SampleAverage } { [WaitingTreat].SampleAverage } { [WaitingTime].SampleAverage } { [TimeInSystem].SampleAverage } { [WalkupQueue].QueueLengthAverage } { [Doctor].Utilisation } { [WaitingTime2].SampleAverage } { [TimeInSystem2].SampleAverage } { [AppointmentQueue].QueueLengthAverage } { `'[Doctor2Appointment].Utilisation + [Doctor2Walkup].Utilisation'` } |

Run your simulation and use Lab3Analysis.R to look at the results from your simulation with the triage and tests added. The confidence intervals results should look as follows:

Results The results...
Conclusions In conclusion...
ExtraForExperts