Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # Подгрузка пакетов.
- library(ggplot2)
- # Часть 0.
- rmvs.sim <- function(N, mu = 0, tau, delta, x0 = 0){
- result <- list()
- result$N <- N
- result$mu <- mu
- result$tau <- tau
- result$delta <- delta
- result$x0 <- x0
- result$e <- rnorm(N)
- result$sigma <- c(rep(1, floor(N*tau)), rep(1/delta, N - floor(N*tau)))
- result$eps <- result$sigma*result$e
- result$y <- mu + cumsum(c(x0, result$eps))
- return(result)
- }
- hm.sim <- function(N, mu = 0, tau, delta, x0 = 0){
- result <- list()
- result$N <- N
- result$mu <- mu
- result$tau <- tau
- result$delta <- delta
- result$x0 <- x0
- result$alpha <- 1 - 7/N
- result$e <- rnorm(N)
- result$sigma <- c(rep(1, floor(N*tau)), rep(1/delta, N - floor(N*tau)))
- result$eps <- result$sigma*result$e
- result$y <- c(x0)
- for(i in 2:(N + 1)){
- result$y[i] <- result$alpha*result$y[i-1] + result$eps[i-1]
- }
- result$y <- result$y + mu
- return(result)
- }
- hbm.sim <- function(N, mu = 0, tau, delta, x0 = 0, tau_b, delta_b){
- result <- list()
- result$N <- N
- result$mu <- mu
- result$tau <- tau
- result$delta <- delta
- result$x0 <- x0
- result$tau_b <- tau_b
- result$delta_b <- delta_b
- result$e <- rnorm(N)
- result$sigma <- c(rep(1, floor(N*tau)), rep(1/delta, N - floor(N*tau)))
- result$eps <- result$sigma*result$e
- result$u <- c(x0)
- for(i in 2:(N + 1)){
- if(i <= floor(tau_b[1]*N)){
- result$u[i] <- result$u[i-1] + result$eps[i-1]
- } else if((i > floor(tau_b[1]*N)) & (i <= floor(tau_b[2]*N))){
- result$u[i] <- (1 + delta_b[1])*result$u[i-1] + result$eps[i-1]
- } else if((i > floor(tau_b[2]*N)) & (i <= floor(tau_b[3]*N))){
- result$u[i] <- (1 - delta_b[2])*result$u[i-1] + result$eps[i-1]
- } else {
- result$u[i] <- result$u[i-1] + result$eps[i-1]
- }
- }
- result$y <- mu + result$u
- if(result$y[floor(tau_b[2]*N)] < result$y[floor(tau_b[1]*N)]){
- result$y <- (-1)*result$y
- }
- return(result)
- }
- simple.adf.test <- function(y, cnst = TRUE){
- result <- list()
- result$y <- y
- result$cnst <- cnst
- if(cnst){
- adf.model <- lm(diff(y) ~ y[1:(length(y) - 1)])
- } else if(cnst == FALSE){
- adf.model <- lm(diff(y) ~ y[1:(length(y) - 1)] - 1)
- }
- result$adf.model <- summary(adf.model)
- result$residuals <- as.numeric(adf.model$residuals)
- if(cnst){
- result$t_value <- as.numeric(result$adf.model[4]$coefficients[,3][2])
- } else if(cnst == FALSE){
- result$t_value <- as.numeric(result$adf.model[4]$coefficients[,3])
- }
- if(length(y)-1 == 100){
- result$cr_value <- -1.95
- } else if(length(y)-1 == 250){
- result$cr_value <- -1.95
- } else if(length(y)-1 == 500){
- result$cr_value <- -1.95
- }
- result$is_stationary <- ifelse(result$t_value < result$cr_value, 1, 0)
- return(result)
- }
- reindex <- function(u){
- u_square <- as.numeric(u^2)
- result <- list()
- result$u <- as.numeric(u)
- result$s <- c(0:length(u))/length(u)
- result$eta_hat <- rep(0, (length(u) + 1))
- for(i in 2:(length(u) + 1)){
- result$eta_hat[i] <- (sum(u_square[1:floor(result$s[i]*length(u))]) +
- (result$s[i]*length(u) - floor(result$s[i]*length(u)))*
- u_square[(floor(result$s[i]*length(u)) + 1)])/sum(u_square)
- }
- result$eta_hat[length(result$eta_hat)] <- 1
- result$eta_hat_inv <- rep(0, (length(u) + 1))
- for(i in 2:(length(u) + 1)){
- s <- i/length(u)
- k <- length(result$eta_hat[result$eta_hat < s])
- result$eta_hat_inv[i] <- (k-1)/length(u) +
- 1/(length(u)*(result$eta_hat[k+1] - result$eta_hat[k]))*(s - result$eta_hat[k])
- }
- result$eta_hat_inv[length(result$eta_hat_inv)] <- 1
- result$new_index <- floor(result$eta_hat_inv*length(u))
- return(result)
- }
- simple.sadf.test <- function(y, r0 = 0.01 + 1.8/sqrt(length(y)), cnst = TRUE,
- reindex = FALSE){
- result <- list()
- result$y <- y
- result$r0 <- r0
- result$cnst <- cnst
- result$reindex <- reindex
- result$t_values <- c()
- if(reindex == FALSE){
- for(i in floor(r0*length(y)):length(y)){
- model <- simple.adf.test(y[1:i], cnst = cnst)
- result$t_values[(i - floor(r0*length(y)) + 1)] <- model$t_value
- }
- } else if(reindex == TRUE){
- for(i in floor(r0*length(y)):length(y)){
- model <- simple.adf.test(y[1:i], cnst = cnst)
- new_index <- reindex(model$residuals)
- model_new <- simple.adf.test(y[(new_index$new_index + 1)], cnst = cnst)
- result$t_values[(i - floor(r0*length(y)) + 1)] <- model_new$t_value
- }
- }
- result$sadf_value <- max(result$t_values)
- if(length(y)-1 == 100){
- result$cr_value <- 1.37
- } else if(length(y)-1 == 200){
- result$cr_value <- 1.41
- } else if(length(y)-1 == 400){
- result$cr_value <- 1.49
- } else if(length(y)-1 == 800){
- result$cr_value <- 1.51
- } else if(length(y)-1 == 1600){
- result$cr_value <- 1.51
- }
- result$is_explosive <- ifelse(result$sadf_value > result$cr_value, 1, 0)
- return(result)
- }
- simple.gsadf.test <- function(y, r0 = 0.01 + 1.8/sqrt(length(y)), cnst = TRUE,
- reindex = FALSE){
- result <- list()
- result$y <- y
- result$r0 <- r0
- result$cnst <- cnst
- result$reindex <- reindex
- return(result)
- }
- gstadf.test <- function(y, r0 = 0.01 + 1.8/sqrt(length(y)), cnst = TRUE,
- test_type = "sadf", omega_est = TRUE){
- result <- list()
- result$y <- y
- result$r0 <- r0
- result$cnst <- cnst
- result$test_type <- test_type
- # Часть 1. Оценка NW.
- y_0 <- y - y[1]
- N <- length(y)
- tau_l <- 0.1
- kerU <- function(x){
- result <- c()
- for(i in 1:length(x)){
- if((x[i] < 0) & (x[i] >= -1)){
- result[i] <- 1
- } else {
- result[i] <- 0
- }
- }
- return(result)
- }
- my <- diff(y_0)
- mx <- y_0[1:(length(y_0)-1)]
- HT <- seq(N^(-0.5), N^(-0.1), by=0.01)
- rx <- (1:N)/N
- TSCV <- Inf
- for(hi in 1:length(HT)){
- h1 <- HT[hi]
- rr1 <- rep(0, length(my))
- for(k in floor(tau_l*N):length(my)){
- z1 <- kerU((rx[k]-rx)/h1)
- z1 <- z1[2:length(z1)]
- rr1[k] <- sum(mx*z1*my)/sum(mx*z1*mx)
- }
- u <- my - rr1*mx
- ee <- u[floor(tau_l*N):length(u)]
- TSCV1 <- mean(ee^2)
- if(TSCV1 < TSCV){
- TSCV <- TSCV1
- u_hat <- u
- h <- h1
- }
- }
- result$u_hat <- u_hat
- result$h <- h
- if(omega_est == TRUE){
- result$w_sq <- mean(u_hat^2)
- } else {
- result$w_sq <- 1
- }
- # Часть 2. Переиндексация.
- new_index <- reindex(u_hat)
- y_tt <- y[(new_index$new_index + 1)]
- # Часть 3. Сам тест.
- result$t_values <- c()
- if(test_type == "sadf"){
- for(i in floor(r0*length(y_tt)):length(y_tt)){
- if(cnst == TRUE){
- y_tt_norm <- y_tt - mean(y_tt[1:i])
- } else {
- y_tt_norm <- y_tt
- }
- result$t_values[(i - floor(r0*length(y_tt)) + 1)] <-
- (y_tt_norm[i]^2 - y_tt_norm[1]^2 -
- result$w_sq*(i-1)/N)/(result$w_sq^0.5*2*sum(y_tt_norm[1:(i-1)]^2)^0.5)
- }
- result$sadf_value <- max(result$t_values)
- if(length(y_tt)-1 == 100){
- result$cr_value <- 1.37
- } else if(length(y_tt)-1 == 200){
- result$cr_value <- 1.41
- } else if(length(y_tt)-1 == 400){
- result$cr_value <- 1.49
- } else if(length(y_tt)-1 == 800){
- result$cr_value <- 1.51
- } else if(length(y_tt)-1 == 1600){
- result$cr_value <- 1.51
- }
- result$is_explosive <- ifelse(result$sadf_value > result$cr_value, 1, 0)
- }
- return(result)
- }
- # Часть 1. Размест теста.
- df <- data.frame(matrix(0, 5, 3))
- colnames(df) <- c("100", "250", "500")
- rownames(df) <- c("constant", "delta = 0.2, tau = 0.1",
- "delta = 0.2, tau = 0.9", "delta = 5, tau = 0.1",
- "delta = 5, tau = 0.9")
- df_new <- data.frame(matrix(0, 5, 3))
- colnames(df_new) <- c("100", "250", "500")
- rownames(df_new) <- c("constant", "delta = 0.2, tau = 0.1",
- "delta = 0.2, tau = 0.9", "delta = 5, tau = 0.1",
- "delta = 5, tau = 0.9")
- for(i in 1:10000){
- for(j in c(100, 250, 500)){
- y0 <- rmvs.sim(j, mu = 0, tau = 0.5, delta = 1, x0 = 0)
- model0 <- simple.adf.test(y0$y)
- new_index0 <- reindex(model0$residuals)
- model0_new <- simple.adf.test(y0$y[(new_index0$new_index + 1)])
- y1 <- rmvs.sim(j, mu = 0, tau = 0.1, delta = 0.2, x0 = 0)
- model1 <- simple.adf.test(y1$y)
- new_index1 <- reindex(model1$residuals)
- model1_new <- simple.adf.test(y1$y[(new_index1$new_index + 1)])
- y2 <- rmvs.sim(j, mu = 0, tau = 0.9, delta = 0.2, x0 = 0)
- model2 <- simple.adf.test(y2$y)
- new_index2 <- reindex(model2$residuals)
- model2_new <- simple.adf.test(y2$y[(new_index2$new_index + 1)])
- y3 <- rmvs.sim(j, mu = 0, tau = 0.1, delta = 5, x0 = 0)
- model3 <- simple.adf.test(y3$y)
- new_index3 <- reindex(model3$residuals)
- model3_new <- simple.adf.test(y3$y[(new_index3$new_index + 1)])
- y4 <- rmvs.sim(j, mu = 0, tau = 0.9, delta = 5, x0 = 0)
- model4 <- simple.adf.test(y4$y)
- new_index4 <- reindex(model4$residuals)
- model4_new <- simple.adf.test(y4$y[(new_index4$new_index + 1)])
- if(j == 100){
- df[1, 1] <- df[1, 1] + model0$is_stationary
- df[2, 1] <- df[2, 1] + model1$is_stationary
- df[3, 1] <- df[3, 1] + model2$is_stationary
- df[4, 1] <- df[4, 1] + model3$is_stationary
- df[5, 1] <- df[5, 1] + model4$is_stationary
- df_new[1, 1] <- df_new[1, 1] + model0_new$is_stationary
- df_new[2, 1] <- df_new[2, 1] + model1_new$is_stationary
- df_new[3, 1] <- df_new[3, 1] + model2_new$is_stationary
- df_new[4, 1] <- df_new[4, 1] + model3_new$is_stationary
- df_new[5, 1] <- df_new[5, 1] + model4_new$is_stationary
- } else if(j == 250){
- df[1, 2] <- df[1, 2] + model0$is_stationary
- df[2, 2] <- df[2, 2] + model1$is_stationary
- df[3, 2] <- df[3, 2] + model2$is_stationary
- df[4, 2] <- df[4, 2] + model3$is_stationary
- df[5, 2] <- df[5, 2] + model4$is_stationary
- df_new[1, 2] <- df_new[1, 2] + model0_new$is_stationary
- df_new[2, 2] <- df_new[2, 2] + model1_new$is_stationary
- df_new[3, 2] <- df_new[3, 2] + model2_new$is_stationary
- df_new[4, 2] <- df_new[4, 2] + model3_new$is_stationary
- df_new[5, 2] <- df_new[5, 2] + model4_new$is_stationary
- } else if(j == 500){
- df[1, 3] <- df[1, 3] + model0$is_stationary
- df[2, 3] <- df[2, 3] + model1$is_stationary
- df[3, 3] <- df[3, 3] + model2$is_stationary
- df[4, 3] <- df[4, 3] + model3$is_stationary
- df[5, 3] <- df[5, 3] + model4$is_stationary
- df_new[1, 3] <- df_new[1, 3] + model0_new$is_stationary
- df_new[2, 3] <- df_new[2, 3] + model1_new$is_stationary
- df_new[3, 3] <- df_new[3, 3] + model2_new$is_stationary
- df_new[4, 3] <- df_new[4, 3] + model3_new$is_stationary
- df_new[5, 3] <- df_new[5, 3] + model4_new$is_stationary
- }
- }
- if(i %% 1000 == 0){
- print(i)
- }
- }
- df <- round(df/100, 1)
- df_new <- round(df_new/100, 1)
- df
- df_new
- # Часть 2. Мощность теста.
- df_power <- data.frame(matrix(10000, 5, 3))
- colnames(df_power) <- c("100", "250", "500")
- rownames(df_power) <- c("constant", "delta = 0.2, tau = 0.1",
- "delta = 0.2, tau = 0.9", "delta = 5, tau = 0.1",
- "delta = 5, tau = 0.9")
- df_power_new <- data.frame(matrix(10000, 5, 3))
- colnames(df_power_new) <- c("100", "250", "500")
- rownames(df_power_new) <- c("constant", "delta = 0.2, tau = 0.1",
- "delta = 0.2, tau = 0.9", "delta = 5, tau = 0.1",
- "delta = 5, tau = 0.9")
- for(i in 1:10000){
- for(j in c(100, 250, 500)){
- y0 <- hm.sim(j, mu = 0, tau = 0.5, delta = 1, x0 = 0)
- model0 <- simple.adf.test(y0$y)
- new_index0 <- reindex(model0$residuals)
- model0_new <- simple.adf.test(y0$y[(new_index0$new_index + 1)])
- y1 <- hm.sim(j, mu = 0, tau = 0.1, delta = 0.2, x0 = 0)
- model1 <- simple.adf.test(y1$y)
- new_index1 <- reindex(model1$residuals)
- model1_new <- simple.adf.test(y1$y[(new_index1$new_index + 1)])
- y2 <- hm.sim(j, mu = 0, tau = 0.9, delta = 0.2, x0 = 0)
- model2 <- simple.adf.test(y2$y)
- new_index2 <- reindex(model2$residuals)
- model2_new <- simple.adf.test(y2$y[(new_index2$new_index + 1)])
- y3 <- hm.sim(j, mu = 0, tau = 0.1, delta = 5, x0 = 0)
- model3 <- simple.adf.test(y3$y)
- new_index3 <- reindex(model3$residuals)
- model3_new <- simple.adf.test(y3$y[(new_index3$new_index + 1)])
- y4 <- hm.sim(j, mu = 0, tau = 0.9, delta = 5, x0 = 0)
- model4 <- simple.adf.test(y4$y)
- new_index4 <- reindex(model4$residuals)
- model4_new <- simple.adf.test(y4$y[(new_index4$new_index + 1)])
- if(j == 100){
- df_power[1, 1] <- df_power[1, 1] - model0$is_stationary
- df_power[2, 1] <- df_power[2, 1] - model1$is_stationary
- df_power[3, 1] <- df_power[3, 1] - model2$is_stationary
- df_power[4, 1] <- df_power[4, 1] - model3$is_stationary
- df_power[5, 1] <- df_power[5, 1] - model4$is_stationary
- df_power_new[1, 1] <- df_power_new[1, 1] - model0_new$is_stationary
- df_power_new[2, 1] <- df_power_new[2, 1] - model1_new$is_stationary
- df_power_new[3, 1] <- df_power_new[3, 1] - model2_new$is_stationary
- df_power_new[4, 1] <- df_power_new[4, 1] - model3_new$is_stationary
- df_power_new[5, 1] <- df_power_new[5, 1] - model4_new$is_stationary
- } else if(j == 250){
- df_power[1, 2] <- df_power[1, 2] - model0$is_stationary
- df_power[2, 2] <- df_power[2, 2] - model1$is_stationary
- df_power[3, 2] <- df_power[3, 2] - model2$is_stationary
- df_power[4, 2] <- df_power[4, 2] - model3$is_stationary
- df_power[5, 2] <- df_power[5, 2] - model4$is_stationary
- df_power_new[1, 2] <- df_power_new[1, 2] - model0_new$is_stationary
- df_power_new[2, 2] <- df_power_new[2, 2] - model1_new$is_stationary
- df_power_new[3, 2] <- df_power_new[3, 2] - model2_new$is_stationary
- df_power_new[4, 2] <- df_power_new[4, 2] - model3_new$is_stationary
- df_power_new[5, 2] <- df_power_new[5, 2] - model4_new$is_stationary
- } else if(j == 500){
- df_power[1, 3] <- df_power[1, 3] - model0$is_stationary
- df_power[2, 3] <- df_power[2, 3] - model1$is_stationary
- df_power[3, 3] <- df_power[3, 3] - model2$is_stationary
- df_power[4, 3] <- df_power[4, 3] - model3$is_stationary
- df_power[5, 3] <- df_power[5, 3] - model4$is_stationary
- df_power_new[1, 3] <- df_power_new[1, 3] - model0_new$is_stationary
- df_power_new[2, 3] <- df_power_new[2, 3] - model1_new$is_stationary
- df_power_new[3, 3] <- df_power_new[3, 3] - model2_new$is_stationary
- df_power_new[4, 3] <- df_power_new[4, 3] - model3_new$is_stationary
- df_power_new[5, 3] <- df_power_new[5, 3] - model4_new$is_stationary
- }
- }
- if(i %% 1000 == 0){
- print(i)
- }
- }
- df_power <- round(df_power/100, 1)
- df_power_new <- round(df_power_new/100, 1)
- df_power
- df_power_new
- # Часть 3. Первые попытки с SADF.
- ####
- set.seed(301)
- N_sim = 200
- tau_sim = 0.3
- delta_sim = 1
- delta_b1_sim = c(0, 0.02, 0.04, 0.06, 0.08)
- NN_sim = 1000
- power <- rep(0, 5)
- for(j in delta_b1_sim){
- for(i in 1:NN_sim){
- y <- hbm.sim(N = N_sim, mu = 0, tau = tau_sim, delta = delta_sim, x0 = 0,
- tau_b = c(0.4, 0.6, 1), delta_b = c(j, 0))
- model <- gstadf.test(y$y, omega_est = FALSE)
- power[(j/0.02 + 1)] <- power[(j/0.02 + 1)] + model$is_explosive
- if(i %% 100 == 0){
- print(i)
- }
- }
- print(j)
- }
- round(power/NN_sim, 3)
- ####
- set.seed(301)
- N_sim = 200
- tau_sim = 0.3
- delta_sim = 1
- delta_b1_sim = c(0, 0.02, 0.04, 0.06, 0.08)
- reindex_sim = FALSE
- NN_sim = 1000
- power <- rep(0, 5)
- for(j in delta_b1_sim){
- for(i in 1:NN_sim){
- y <- hbm.sim(N = N_sim, mu = 0, tau = tau_sim, delta = delta_sim, x0 = 0,
- tau_b = c(0.4, 0.6, 1), delta_b = c(j, 0))
- model <- simple.sadf.test(y = y$y, reindex = reindex_sim)
- power[(j/0.02 + 1)] <- power[(j/0.02 + 1)] + model$is_explosive
- if(i %% 100 == 0){
- print(i)
- }
- }
- print(j)
- }
- round(power/NN_sim, 3)
- ####
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement