ท่อโอเพนซอร์ซ R เพื่อทำความสะอาดและประมวลผลสถิติตอนโรงพยาบาลระดับผู้ป่วย (HES) และเชื่อมโยงข้อมูลการตายของ ONS โดยมีจุดประสงค์เพื่อสร้างชุดข้อมูลพร้อมการวิเคราะห์สำหรับโปรแกรมการวิเคราะห์ที่กำหนดไว้
สถิติตอนของโรงพยาบาล (HES) เป็นฐานข้อมูลที่มีรายละเอียดของการรับสมัคร Hosptial ทั้งหมดการเข้าร่วม A&E และการนัดหมายผู้ป่วยนอกที่โรงพยาบาล NHS ในอังกฤษ
ก่อนที่จะสามารถใช้สำหรับการวิเคราะห์ข้อมูล HES ต้องการการทำความสะอาดการควบคุมคุณภาพและการประมวลผลเพื่อรับตัวแปรเพิ่มเติม โครงสร้างการบันทึกที่ซับซ้อนของ HES ตัวแปรจำนวนมากและขนาดของชุดข้อมูลทำให้งานนี้เป็นงานที่ท้าทายทั้งจากมุมมองการวิเคราะห์และการคำนวณ
เวิร์กโฟลว์กึ่งอัตโนมัติที่เรากำลังพัฒนาในกระบวนการที่เก็บข้อมูลนี้ข้อมูล HES อย่างสม่ำเสมอและทำซ้ำได้ว่าขั้นตอนการประมวลผลทั้งหมดได้รับการบันทึกไว้เพื่อให้แน่ใจว่าโครงการวิเคราะห์ที่ได้รับการอนุมัติแต่ละโครงการจะขึ้นอยู่กับข้อมูลที่สะอาดเดียวกัน
เราใช้ข้อมูล HES ที่เชื่อมโยงกับข้อมูลการตายของ ONS ตั้งแต่ปี 2008/09 จนถึงการเปิดตัวรายไตรมาสล่าสุด แอปพลิเคชันข้อมูลของเราได้รับการอนุมัติจาก NHS Digital [บริการขอข้อมูลการเข้าถึงข้อมูลการเข้าถึงข้อมูล (DARS)
ข้อมูลจะถูกเข้าถึงในสภาพแวดล้อมข้อมูลที่ปลอดภัยของมูลนิธิสุขภาพ สิ่งอำนวยความสะดวกการวิเคราะห์ข้อมูลที่ปลอดภัย (ได้รับการรับรองด้วยมาตรฐานความปลอดภัยของข้อมูล ISO27001 และได้รับการยอมรับสำหรับชุดเครื่องมือรักษาความปลอดภัยและการป้องกันข้อมูลดิจิตอลของ NHS) จะไม่มีการใช้ข้อมูลที่สามารถระบุผู้ป่วยหรือบุคคลอื่นได้โดยตรง
โฟลเดอร์ DOC มีข้อมูลเกี่ยวกับ:
นอกจากนี้ส่วนด้านล่างอธิบาย
เนื่องจากข้อมูล HES ที่เตรียมไว้ในไปป์ไลน์นี้ไม่ได้เปิดเผยต่อสาธารณะรหัสจึงไม่สามารถใช้เพื่อทำซ้ำข้อมูลและฐานข้อมูลที่สะอาดเหมือนกัน อย่างไรก็ตามรหัสสามารถใช้กับสารสกัด HES ระดับผู้ป่วยที่คล้ายกันเพื่อเตรียมชุดข้อมูลสำหรับการวิเคราะห์ สำหรับข้อมูลรายละเอียดเพิ่มเติมเกี่ยวกับวิธีการทำงานของท่อดูด้านล่างหรืออ้างอิงเอกสารกระบวนการ
เอกสารกระบวนการอธิบายการออกแบบโดยรวมของไปป์ไลน์แสดงรายการอินพุตที่จำเป็นและคำอธิบายระดับสูงของขั้นตอนในเวิร์กโฟลว์
ผังงานแสดงให้เห็นว่าการป้อนข้อมูลของผู้ใช้และข้อมูลเคลื่อนที่ผ่านฟังก์ชั่นไปป์ไลน์ที่แตกต่างกันอย่างไร
ท่อสามารถทำงานได้สองโหมด:
update = TRUE
) การอัปเดตข้อมูล HES ภายในปีเดียวกันนั้นทับซ้อนกันดังนั้นข้อมูลเก่าบางส่วนจะถูกลดลงและแทนที่ด้วยการอัปเดตใหม่ ข้อมูลการเสียชีวิตของ ONS จะได้รับการรีเฟรชอย่างสมบูรณ์ด้วยการอัปเดตข้อมูลแต่ละครั้งใน โหมดการสร้าง ท่อส่ง
ใน โหมดอัปเดต ไปป์ไลน์
บันทึกการตัดสินใจของสถาปัตยกรรม (ADR) จับการตัดสินใจทางสถาปัตยกรรมและตัวเลือกการออกแบบพร้อมกับบริบทเหตุผลและผลที่ตามมา นอกจากนี้เรายังบันทึกการตัดสินใจเชิงวิเคราะห์บางอย่าง
จนถึงตอนนี้เราได้บันทึกการตัดสินใจเกี่ยวกับ
ท่อส่ง HES ถูกสร้างขึ้นภายใต้ R เวอร์ชัน 3.6.2 (2019-12-12)-"Dark and Stormy Night"
แพ็คเกจ R ต่อไปนี้ซึ่งมีอยู่ใน CRAN จะต้องใช้งานท่อส่ง HES:
ตำแหน่งที่สร้างฐานข้อมูลจำเป็นต้องมีพื้นที่เก็บข้อมูลที่เพียงพอเทียบเท่ากับขนาดไฟล์รวมของสารสกัดข้อมูล HES RAW บวกขนาดไฟล์ 2 x ของชุดข้อมูล APC (เป็นตารางสำหรับคาถาผู้ป่วยในและคาถาผู้ป่วยในต่อเนื่องจะ เพิ่ม)
ขั้นตอนการประมวลผลบางอย่างไม่ได้ดำเนินการในหน่วยความจำ แต่เป็นแบบสอบถาม SQLite ซึ่งรวมถึงอัลกอริทึมการตั้งค่าสถานะซ้ำการสร้างคาถาและการสร้างตารางสถิติสรุปบนข้อมูลที่สะอาด ขึ้นอยู่กับขนาดของชุดข้อมูลขั้นตอนเหล่านี้สร้างฐานข้อมูล SQLite ชั่วคราวขนาดใหญ่ (ไฟล์ .Tiqls) ซึ่งจะถูกลบโดยอัตโนมัติเมื่อมีการดำเนินการแบบสอบถาม โดยค่าเริ่มต้นสิ่งเหล่านี้จะถูกสร้างขึ้นในไดเรกทอรีบ้าน R ซึ่งมักจะอยู่บนไดรฟ์ที่มีความจุที่ จำกัด
เราพบว่าการดำเนินการของ pieline ล้มเหลวเมื่อมีการจัดเก็บชั่วคราวไม่เพียงพอ (ฐานข้อมูลข้อผิดพลาด 'หรือดิสก์เต็ม') สิ่งนี้สามารถแก้ไขได้โดยการเปลี่ยนตำแหน่งที่สร้างฐานข้อมูล SQLite ชั่วคราว บน Windows สถานที่จัดเก็บชั่วคราวจะถูกควบคุมโดยตัวแปรสภาพแวดล้อม "TMP" เราแนะนำให้สร้างไฟล์. renviron ระดับโครงการเพื่อตั้งค่า TMP ไปยังตำแหน่งที่มีความจุที่เพียงพอ
เส้นทาง data_path
ไปยังสารสกัดข้อมูล HES
ไปป์ไลน์สามารถประมวลผลชุดข้อมูลระดับผู้ป่วยต่อไปนี้: HES ยอมรับการดูแลผู้ป่วย, อุบัติเหตุและเหตุฉุกเฉิน, การดูแลผู้ป่วย, การดูแลที่สำคัญและบันทึกการตาย (รวมถึงไฟล์บริดจ์เชื่อมโยงกับ HES) มันต้องใช้อย่างน้อยหนึ่งในนั้น ไฟล์ข้อมูลดิบจะต้องอยู่ในโฟลเดอร์เดียวกัน
เส้นทาง database_path
ไปยังโฟลเดอร์ที่จะสร้างฐานข้อมูล SQLite
data_set_codes
ชุดข้อมูล HES ที่คาดหวังในโฟลเดอร์ data_path
นี่ควรเป็นหนึ่งหรือหลาย "APC", "AE", "CC" และ "OP" ตัวระบุเหล่านี้ตรงกับชื่อของไฟล์ RAW ซึ่งควรเป็นกรณีของไฟล์ RAW HES ที่ได้รับจาก NHS Digital บันทึกการตายของ ONS และไฟล์สะพาน ONS-HES จะถูกประมวลผลโดยค่าเริ่มต้นหากมีอยู่ ชื่อไฟล์สำหรับบันทึกการตายและไฟล์บริดจ์ควรมี "ONS" และ "BF" ตามลำดับ
เส้นทาง expected_headers_file
ไปยังไฟล์ CSV ที่มีชื่อคอลัมน์ที่คาดหวังสำหรับแต่ละชุดข้อมูล
ไฟล์ CSV นี้มีคอลัมน์อย่างน้อยสองคอลัมน์ชื่อ colnames
และ dataset
คล้ายกับเทมเพลตนี้ ส่วนหัวของคอลัมน์ในข้อมูลจะได้รับทุนโดยอัตโนมัติในขณะที่ข้อมูลถูกอ่านดังนั้นชื่อคอลัมน์ในไฟล์ CSV ควรเป็นตัวพิมพ์ใหญ่ทั้งหมด ข้อมูลนี้จะใช้เพื่อตรวจสอบว่าไฟล์ข้อมูลดิบแต่ละไฟล์มีคอลัมน์ที่คาดหวังทั้งหมดหรือไม่
อาร์กิวเมนต์ต่อไปนี้มีการตั้งค่าเริ่มต้น:
chunk_sizes
จำนวนแถวต่อก้อนสำหรับแต่ละชุดข้อมูล
ไฟล์ข้อมูลแต่ละไฟล์จะถูกอ่านและประมวลผลเป็นชิ้นที่ท้าทายจำนวนแถว ขนาดเริ่มต้นคือ 1 ล้านบรรทัดต่อก้อน แต่สามารถแก้ไขได้โดยผู้ใช้ ขนาดก้อนที่ใหญ่ขึ้นส่งผลให้จำนวนชิ้นเล็กลงต่อไฟล์ลดเวลาในการประมวลผลโดยรวม นี่อาจเป็นเพราะสำหรับแต่ละก้อนในไฟล์ที่กำหนด fread()
ต้องการความก้าวหน้าอีกต่อไปเพื่อย้ายไปยังหมายเลขแถวที่ระบุเพื่อเริ่มอ่านข้อมูล อย่างไรก็ตามขนาดก้อนขนาดใหญ่ยังเพิ่มเวลาในการประมวลผลแต่ละก้อนในหน่วยความจำ ขนาดก้อนที่ดีที่สุดสมดุลเวลาในการประมวลผลเวลาในการอ่านและขึ้นอยู่กับระบบและชุดข้อมูลเนื่องจากแต่ละชุดข้อมูลสามารถมีตัวแปรที่แตกต่างกันจำนวนหนึ่งและดังนั้นจึงต้องใช้หน่วยความจำที่แตกต่างกันต่อแถว ขอแนะนำให้เรียกใช้การทดสอบในชุดข้อมูลย่อยที่เล็กกว่าก่อนเนื่องจากขนาดก้อนขนาดใหญ่มากอาจทำให้ Rstudio พัง
coerce
ประเภทข้อมูลการบีบบังคับ
โดยค่าเริ่มต้นฟังก์ชั่น fread()
ที่ใช้ในการอ่านในข้อมูลจะตรวจจับประเภทคอลัมน์โดยอัตโนมัติ
อีกทางเลือกหนึ่งประเภทข้อมูลสามารถบีบบังคับให้กับประเภทที่ผู้ใช้กำหนดโดยการตั้งค่าอาร์กิวเมนต์นี้เป็น TRUE
ประเภทคอลัมน์จะถูกจัดหา int คอลัมน์ที่สามเรียกว่า type
ในไฟล์ CSV พร้อมชื่อคอลัมน์ที่คาดหวังดูแม่แบบนี้ โปรดทราบว่า SQLite ไม่มีข้อมูลวันที่ ตัวแปรวันที่จะต้องจัดเก็บเป็นอักขระและควรแสดงรายการเป็นอักขระในไฟล์ CSV
IMD_2014_csv
, IMD_2019_csv
และเส้นทาง CCG_xlsx
ไปยังไฟล์ที่มีข้อมูลอ้างอิงที่จะรวมเข้าด้วยกัน
ข้อมูลอ้างอิงเพิ่มเติมที่สามารถรวมเข้ากับแต่ละระเบียนในปัจจุบันรวมถึงดัชนีของการกีดกันหลายครั้ง (IMD), 2015 และ/หรือ 2019 เวอร์ชันและตัวระบุ CCG เส้นทางไฟล์ไปยังไฟล์อ้างอิงควรได้รับเป็นอาร์กิวเมนต์และจะเข้าร่วมกับผู้ป่วย LSOA11 ไฟล์ CSV ที่มีการแมป LSOA11-to-IMD จำเป็นต้องมีชื่อคอลัมน์ที่เริ่มต้นด้วย "รหัส LSOA" ชื่อคอลัมน์ที่มี "ดัชนี" ของการกีดกันหลายครั้ง (IMD) "และชื่อคอลัมน์ที่มี" ดัชนีของการกีดกันหลายครั้ง (IMD) decile " ไฟล์การค้นหาสำหรับ IMD 2015 และ IMD 2019 สามารถดาวน์โหลดได้จาก gov.uk (ไฟล์ 7: ทุกอันดับ, deciles และคะแนนสำหรับดัชนีการลิดรอนและตัวหารประชากร) ไฟล์ค้นหาสำหรับตัวระบุ CCG สามารถดาวน์โหลดได้จาก NHS Digital (ไฟล์: X-การเปลี่ยนแปลงการแมป CCG-DCO-STP เมื่อเวลาผ่านไป)
update
โหมดสวิตช์ไปป์ไลน์
โหมด Pipeline จะถูกเปลี่ยนจาก Build เป็นโหมดอัพเดตโดยการตั้งค่าอาร์กิวเมนต์นี้เป็น TRUE
บันทึกการตั้งค่าสถานะซ้ำ duplicate
คอลัมน์เพิ่มเติมจะถูกสร้างขึ้นในชุดข้อมูล APC, A&E และ OP ที่ระบุว่าระเบียนมีแนวโน้มที่จะซ้ำกันหรือไม่หากการตั้งค่า argumet นี้ถูกตั้งค่าเป็น TRUE
กฎการกำหนดและการสืบทอดสามารถพบได้ใน (derived_variables.md) คำเตือน: สิ่งนี้จะเพิ่มเวลาทำงานของท่ออย่างมีนัยสำคัญ
comorbiditees
ตั้งค่าสถานะ comorbidities
คอลัมน์เพิ่มเติมจะถูกสร้างขึ้นในชุดข้อมูล APC รวมถึงการตั้งค่าสถานะสำหรับแต่ละเงื่อนไขและคะแนน Charlson และ Elixhauser TRUE
ถ่วงน้ำหนัก นอกจากนี้เงื่อนไขการตั้งค่าสถานะไปป์ไลน์ที่เกี่ยวข้องกับความอ่อนแอและคำนวณดัชนีความอ่อนแอที่กำหนดเอง (ดู?) คำเตือน: สิ่งนี้จะเพิ่มเวลาทำงานของท่ออย่างมีนัยสำคัญ
ปัจจุบันท่อได้ถูกออกแบบมาให้ทำงานในเซสชัน rstudio จากคอนโซล R รวบรวมรหัส:
> source("pipeline.R")
จากนั้น Call pipeline()
ซึ่งให้เป็นอาร์กิวเมนต์เส้นทางไปยังไดเรกทอรีข้อมูลเส้นทางไปยังไดเรกทอรีสำหรับฐานข้อมูล SQLite, เวกเตอร์ของรหัสชุดข้อมูล, เส้นทางไปยัง CSV ที่มีคอลัมน์ที่คาดหวัง เวกเตอร์ของจำนวนแถวที่จะอ่านในเวลาต่อชุดข้อมูลและหากจำเป็นและบูลีนเพื่อเปิดใช้งานการบีบบังคับ ข้อมูลจะถูกประมวลผลและเขียนลงในฐานข้อมูล NB นี่เป็นกระบวนการที่ช้าและใช้หน่วยความจำในปริมาณที่พอเหมาะ
ตัวอย่างวิ่ง:
> pipeline(data_path = "/home/user/raw-data/", database_path = "/home/user/database-dir/", data_set_codes = c("APC", "AE", "CC", "OP"), chunk_sizes = c(2000000, 5000000, 2000000, 3000000), expected_headers_file = "/home/user/expected_columns.csv", IMD_15_csv = "IMD_2015_LSOA.csv", IMD_19_csv = "IMD_2019_LSOA.csv", CCG_xlsx = "xchanges-to-ccg-dco-stp-mappings-over-time.xlsx", coerce = TRUE, update = FALSE, duplicates = FALSE, comorbidities = FALSE)
สำหรับคำแนะนำเกี่ยวกับวิธีการสืบค้นฐานข้อมูล SQLite จาก R ตัวอย่างเช่นดูฐานข้อมูลการสอน RSTUDIO โดยใช้ R.
ฐานข้อมูลสามารถสอบถามได้:
library( tidyverse )
library( dbplyr )
library ( DBI )
con <- dbConnect( RSQLite :: SQLite(), paste0( database_path , " HES_db.sqlite " ))
# List available tables
dbListTables( con )
# List available variables in the A&E table
dbListFields( con , " AE " )
# Option 1: Query using dbplyr
# Select table
AE <- tbl( con , ' AE ' )
# Look at the first 5 rows
AE % > %
head() % > %
collect()
# Option 2: Query using SQL
dbGetQuery( con , ' SELECT * FROM AE LIMIT 5 ' )
dbDisconnect( con )
หากคุณใช้ DBI ให้ใช้ฟังก์ชัน dbGetQuery()
หลีกเลี่ยงการใช้ฟังก์ชั่นที่สามารถปรับเปลี่ยนฐานข้อมูลพื้นฐานเช่น dbExecute()
, dbSendQuery()
หรือ dbSendStatement()
โครงการนี้ได้รับใบอนุญาตภายใต้ใบอนุญาต MIT