state.R 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. # CALCULATE PATIENT STATE ALGORITHM
  2. STATE = c("WALK", "UP", "DOWN", "SIT")
  3. size_ <- 5
  4. differ_ <- 0.1
  5. POINTS <- data.frame(
  6. index = integer(1)
  7. )
  8. POINTS["state"] <- 0
  9. POINTS["probability"] <- 0
  10. for(i in 1:size_){
  11. POINTS[LETTERS[i]] <- 0
  12. }
  13. for(i in size_:(nrow(DATA)-size_)){
  14. start <- DATA[i,]$Head.y
  15. end <- DATA[i+size_,]$Head.y
  16. state_ <- NULL
  17. if(((start - end) < differ_) && (start - end) > -differ_){
  18. if(start >= mean(DATA$Head.y)){ #WALK (4)
  19. state_ <- 1
  20. }
  21. else{ #SIT (4)
  22. state_ <- 4
  23. }
  24. }
  25. else if((start - end) < differ_) { #UP (2)
  26. state_ <- 2
  27. }
  28. else if((start - end) > differ_) { #UP (3)
  29. state_ <- 3
  30. }
  31. else {
  32. state_ <- 1
  33. }
  34. for(j in 0:size_-1){
  35. POINTS[i-j,LETTERS[j+1]] <- state_
  36. #POINTS[i,LETTERS[j+1]] <- state_
  37. }
  38. POINTS[i,]$index <- DATA[i,]$Time
  39. if(i>size_*2 && i<=((nrow(DATA) - size_))){
  40. tmp_ <- (
  41. tbl_df(
  42. table(
  43. POINTS[i-size_,] %>%
  44. unlist(., use.names=FALSE)
  45. )
  46. ) %>%
  47. arrange(
  48. desc(n)
  49. )
  50. )
  51. POINTS[i-size_,]$state <- tmp_[1,]$Var1
  52. POINTS[i-size_,]$probability <- ((1 / size_) * tmp_[1,]$n)
  53. }
  54. DATA[i,]$state = state_
  55. }
  56. print("STATE CALCULATION DONE")
  57. remove(tmp_)
  58. DATA <- DATA[complete.cases(DATA),]
  59. rownames(DATA) <- 1:nrow(DATA)
  60. DATA$index = as.integer(rownames(DATA))
  61. WALKING <- strtoi(rownames(DATA[DATA$state==1,]))
  62. # CALCULATE STRAIGHT WALKING PATH
  63. yPrediction <-lm(Head.y ~ I(index^2)+index, data=DATA[min(WALKING):max(WALKING),])
  64. #lines(WALKING, predict(yPrediction, data.frame(index=WALKING)), type = "l", col = "orange")
  65. yPredicted <- as.vector(predict(yPrediction, data.frame(index=WALKING)))
  66. WALKBASE <- mean(c(yPredicted[1], tail(yPredicted, n=1)))
  67. #WALKBASE <- mean(c(DATA[WALKING[1],]$Head.y, DATA[tail(WALKING, n=1),]$Head.y))
  68. for(i in WALKING[1]:(length(WALKING) + WALKING[1] - 1)){
  69. DATA[i,]$Head.y <- DATA[i,]$Head.y - (yPredicted[i-WALKING[1]+1] - WALKBASE)
  70. }
  71. plot(POINTS$probability, type = "l")