-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathnew_code_function.R
93 lines (80 loc) · 3.31 KB
/
new_code_function.R
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
library(patchwork)
library(dplyr)
library(rmweather)
library(ranger)
library(ggplot2)
library(worldmet)
library(openair)
library(tidyr)
library(foreach)
library(purrr)
require(RcppRoll)
library(zoo)
library(plotly)
library(rpatrec)
library(lubridate)
library(Metrics)
#-----------Updated fucntion that determines the CP based on ratio of previous to current point using the 2nd derivative ----------
window_length_constrain = function(df, window_length_vector, epsilon, cp_factor, date = TRUE){
if(date==TRUE){
roll_regression = rollRegres::roll_regres(value ~ date, df,
width = window_length_vector,
do_compute = c("sigmas", "r.squareds", "1_step_forecasts"))
roll_reformat_cp = as.data.frame(roll_regression$coefs) %>%
rename(grad = date) %>%
mutate(date = df$date,
r.squareds = roll_regression$r.squareds,
data = df$value,
window_length_level = as.factor(window_length_vector),
derv_2nd = as.numeric(abs(pracma::gradient(grad))),
cp = derv_2nd/lag(derv_2nd) > cp_factor &
lag(derv_2nd) > epsilon,
) %>%rename("Test dataset" = data,
"Rolling gradient" = grad,
"2nd derivative" = derv_2nd)%>%
select(-"(Intercept)") %>%
drop_na() %>%
pivot_longer(-c(date, window_length_level, cp),
names_to = "variables")%>%
mutate(variables = factor(variables,
levels = c("Test dataset", "Rolling gradient", "2nd derivative"
, "r.squareds")))
return(roll_reformat_cp)
}
else{
roll_regression = rollRegres::roll_regres(value ~ index, df,
width = window_length_vector,
do_compute = c("sigmas", "r.squareds", "1_step_forecasts"))
roll_reformat_cp = as.data.frame(roll_regression$coefs) %>%
rename(grad = index) %>%
mutate(index = df$index,
r.squareds = roll_regression$r.squareds,
data = df$value,
window_length_level = as.factor(window_length_vector),
derv_2nd = as.numeric(abs(pracma::gradient(grad))),
cp = derv_2nd/lag(derv_2nd) > cp_factor &
derv_2nd-lag(derv_2nd) > 0 &
lag(derv_2nd) > epsilon
) %>%rename("Test dataset" = data,
"Rolling gradient" = grad,
"2nd derivative" = derv_2nd)%>%
select(-"(Intercept)") %>%
drop_na() %>%
pivot_longer(-c(index, window_length_level, cp),
names_to = "variables")%>%
mutate(variables = factor(variables,
levels = c("Test dataset", "Rolling gradient", "2nd derivative"
, "r.squareds")))
return(roll_reformat_cp)
}
}
linear_function_generator = function(index, df, seq, epsilon){
f = approxfun(x = index, y = df)
seq_range_x = c(1:seq)
linear_fit = f(seq_range_x)
f_x_df = data.frame(seq_range_x, linear_fit) %>%
rename(index = seq_range_x, value = linear_fit) %>%
mutate(value = jitter(value, factor=epsilon, amount = NULL))%>%
drop_na()
return(f_x_df)
}