#========================================== #Time warping #========================================= library(dtw) library(lattice) library(ggplot2) library(cluster) library(gridExtra) #======================================== #Data #---------------------------------------- data1<- read.csv("Logistic_stacked1.csv", sep=";", dec=",") head(data1) group<-data1$Group[match(1:100,data1$ID)] table(group) #---------------------------------------- #Visualization #--------------------------------------- index<-c(1:10, 54:63,81:90) data2<-subset(data1, ID %in% index) data2 xyplot(Temperature~Time|Group,data2,type="l",groups=ID) #================================================ # Compute warping distance for selected elements #================================================ normal_test<-subset(data1, select=Temperature, ID==50) return_test<-subset(data1, select=Temperature, ID==80) critical_test<-subset(data1, select=Temperature, ID==100) #---------------------------------- #normal cases #---------------------------------- distance_normal<-numeric(100) for(i in 1:100){ ref<-subset(data1, select=Temperature, ID== i) normal_test<-subset(data1, select=Temperature, ID==50)#Test sequence align<-dtw(normal_test,ref) distance_normal[i]<-align$distance } best_normal<-min(distance_normal[1:49]) index_best_normal<-which.min(distance_normal[1:49]) best_return<-min(distance_normal[51:80]) index_best_return<-which.min(distance_normal[51:80]) best_critical<-min(distance_normal[81:100]) index_best_critical<-which.min(distance_normal[81:100]) c("index",index_best_normal,index_best_critical+80,index_best_return+50) c("distance",best_normal,best_critical,best_return) #--------------------------------------- #normal-critical cases #--------------------------------------- distance_critical<-numeric(100) for(i in 1:100){ ref<-subset(data1, select=Temperature, ID== i) critical_test<-subset(data1, select=Temperature, ID==100)#Test sequence align<-dtw(critical_test,ref) distance_critical[i]<-align$distance } best_normal<-min(distance_critical[1:50]) index_best_normal<-which.min(distance_critical[1:50]) best_return<-min(distance_critical[51:80]) index_bestreturn<-which.min(distance_critical[51:80]) best_critical<-min(distance_critical[81:99]) index_best_critical<-which.min(distance_critical[81:99]) c("index",index_best_normal,index_best_critical+80,index_best_return+50) c("distance",best_normal,best_critical,best_return) #--------------------------------------- #return cases #--------------------------------------- distance_return<-numeric(100) for(i in 1:100){ ref<-subset(data1, select=Temperature, ID== i) return_test<-subset(data1, select=Temperature, ID==80)#Test sequence align<-dtw(return_test,ref) distance_return[i]<-align$distance } best_normal<-min(distance_return[1:50]) index_best_normal<-which.min(distance_return[1:50]) best_return<-min(distance_return[51:79]) index_best_return<-which.min(distance_return[51:79]) best_critical<-min(distance_return[81:100]) index_best_critical<-which.min(distance_return[81:100]) c("index",index_best_normal,index_best_critical+80,index_best_return+50) c("distance",best_normal,best_critical,best_return) #======================================================= #Visualization of alignments #======================================================= normal_ref<-subset(data1, select=Temperature, ID==9) return_ref<-subset(data1, select=Temperature, ID==77) critical_ref<-subset(data1, select=Temperature, ID==97) plot(dtw(normal_test, normal_ref, k = TRUE), type = "two", off = 1, match.lty = 2, lwd=2, match.indices = 12, xlab= "Time", ylab="Temperature", main = "normal") plot(dtw(critical_test, critical_ref, k = TRUE), type = "two", off = 1, match.lty = 2,lwd = 2, match.indices = 12, xlab= "Time", ylab="Temperature", main="normal-critical") plot(dtw(return_test, return_ref, k = TRUE), type = "two", off = 1, match.lty = 2,lwd = 2, match.indices = 12, xlab= "Time", ylab="Temperature", main = "return") #====================================== #Distance Matrix #====================================== 100*99/2 simi<-diag(100) for(i in 1:100){ ref<-subset(data1, select=Temperature, ID== i) for(j in 1:100){ comp<-subset(data1, select=Temperature, ID==j) align<-dtw(comp,ref) simi[i,j]<-align$distance } } simi[50,9] simi[50,50] d1<-as.dist(simi) #===================================================== # 1-NN Classification #===================================================== sim1<-simi diag(sim1)<-999 index<-numeric(100) dist<-numeric(100) class<-numeric(100) table(group) for(i in 1:100){ dist[i]<-min(sim1[i,1:100]) index[i]<-which.min(sim1[i,1:100]) group<-data1$Group[match(1:100,data1$ID)] class[i]<-group[index[i]] } table(class,group) index #---------------------------------------------------------- #Visualization of Misclassified cases #---------------------------------------------------------- normal_test<-subset(data1, select=Temperature, ID==88) return_test<-subset(data1, select=Temperature, ID==81) critical_test<-subset(data1, select=Temperature, ID==100) normal_ref<-subset(data1, select=Temperature, ID==23) return_ref<-subset(data1, select=Temperature, ID==62) critical_ref<-subset(data1, select=Temperature, ID==97) fig1<-plot(dtw(normal_test, normal_ref, k = TRUE), type = "two", off = 1, match.lty = 2, lwd=2, match.indices = 12, xlab= "Time", ylab="Temperature", main = "wrong normal") fig2<-plot(dtw(critical_test, critical_ref, k = TRUE), type = "two", off = 1, match.lty = 2, lwd=2, match.indices = 12, xlab= "Time", ylab="Temperature", main = "correct critical") fig3<-plot(dtw(return_test, return_ref, k = TRUE), type = "two", off = 1, match.lty = 2, lwd=2, match.indices = 12, xlab= "Time", ylab="Temperature", main = "wrong return")