CHƯƠNG 1 TỔNG QUAN VỀ Ô NHIỄM KHÔNG KHÍ
4.7 Xây dựng hệ thống
4.7.2 Chức năng xử lý dữ liệu thiếu
Chức năng xử lý dữ liệu nhiễu được thực hiện với phương pháp hồi quy tuyến tính, vì vậy yêu cầu đầu vào bao gồm mảng dữ liệu quan trắc cần xử lý (csvInput), chỉ tiêu quan trắc cần xử lý (varSelect), tập dữ liệu học (csvTraining) và danh sách các chỉ tiêu quan trắc để xây dựng mô hình hồi quy (varTrainCor). Quy trình xử lý như sau:
1. Từ PHP truyền vào mảng dữ liệu học, mảng dữ liệu cần xử lý, chỉ tiêu quan trắc cần xử lý, danh sách chỉ tiêu để xây dựng mô hình hồi quy 2. Với từng tháng từ bộ dữ liệu csvInput được tách ra, tiến hành tách lấy bộ
dữ liệu có tháng tương ứng từ tập csvTraining.
3. Từ tập dữ liệu được tách từ csvTraining theo tháng. Xây dựng mô hình hồi quy của tháng đó dựa vào danh sách các chỉ tiêu được dùng để xây dựng mô hình hồi quy tuyến tính. Đồng thời lấy mô hình hồi quy nào chạy dự đoán dữ liệu cho chỉ tiêu cần xử lý.
4. Tìm những bản ghi không có dữ liệu và gán dữ liệu được dự đoán từ bước trước sang
5. Trả về bộ dữ liệu sau khi đã gán dữ liệu cho những bản ghi thiếu ở định dạng Json lại cho PHP.
Mã nguồn quy trình xử lý được viết trên R
csvInput<- read.csv(OrgPath,header=TRUE)
// csvInput lưu trữ dữ liệu quan trắc cần xử lý csvTraining<- read.csv(trainPath,header=TRUE)
// csvTraining lưu trữ bộ dữ liệu học funcLM=paste(varSelect,"~",sep="")
funcLM=paste(funcLM,varTrainCor[j],"+",sep="") }
funcLM=substr(funcLM, 1, nchar(funcLM)-1) //Xây dựng hàm hồi quy tuyến tính funcLM df <- data.frame()
//Khai báo mảng df để lưu trữ dữ liệu sang khi điền dữ liệu thiếu
for(i in 1:length(nameMonth)){
// Với mỗi tháng từ tập dữ liệu cần xử lý
splitInput= csvInput[ which(csvInput$MM==nameMonth[i]),]
splitTraining= csvTraining[ which(csvTraining$MM==nameMonth[i]),] //Tách lấy tháng tương ứng từ tập dữ liệu học
regress=lm(funcLM,splitTraining)
//Xây dựng mô hình hồi quy của tháng đó từ tập dữ liệu học splitInput$predict <- predict(regress, newdata=splitInput) //Chạy mô hình hồi quy đó trên tháng tương ứng của bộ dữ liệu cần sử lý để dự báo giá trị thiếu thông qua hàm predict
df=rbind(df,splitInput)
//Gán dữ liệu sau khi điền dữ liệu thiếu vào mảng df }
df=df[ order(df$Time , decreasing = FALSE ),]
df=sqldf(c("update df set varSelect=predict where copyOrg is NULL", "select * from df"))
//Gán những dữ liệu được dự đoán cho những bản ghi thiếu DataHand=df[,c("DateTime","copyOrg")]
afterHandle=cat(toJSON(DataHand)) // Trả về dữ liệu cho PHP