Skip to content

Commit 62d30c5

Browse files
committed
working forecast
1 parent 05cbe26 commit 62d30c5

File tree

1 file changed

+61
-52
lines changed

1 file changed

+61
-52
lines changed

R/helper.R

Lines changed: 61 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -535,97 +535,106 @@ run_temp_oxygen_forecast <- function(bc, params, ini, times, ice = FALSE,
535535
idstart <- 1
536536
q_par <- params[7]
537537
nep_par <- params[20]
538-
for (nn in which(!is.na(observed$WT_obs))[2:length(which(!is.na(observed$WT_obs)))]){
538+
539+
for (nn in which(!is.na(observed[,2]) | !is.na(observed[,3]))[2:length( which(!is.na(observed[,2]) | !is.na(observed[,3])))]){
540+
#which(!is.na(observed$WT_obs))[2:length(which(!is.na(observed$WT_obs)))]
541+
# which(!is.na(observed[,2:3]))[2:length(which(!is.na(observed[,2:3])))]
539542
idstop = nn
540543
result <- matrix(NA, nrow = 100, ncol =2)
541544
param_matrix <- matrix(NA, nrow = 100, ncol =2)
542-
for (random_run in 1:100){
543-
params[7] <- rnorm(n = 1, mean = q_par, sd = 1e8)
544-
while(is.na(params[7])){
545-
params[7] <- rnorm(n = 1, mean = q_par, sd = 1e8)
545+
id_row1 = 1
546+
id_row2 = 1
547+
548+
if ( !is.na(observed$WT_obs[idstop])){
549+
for (random_run in 1:100){
550+
params[7] <- rnorm(n = 1, mean = q_par, sd = 1e7)
551+
while(is.na(params[7])){
552+
params[7] <- rnorm(n = 1, mean = q_par, sd = 1e7)
553+
}
554+
out <- ode(times = c(idstart:idstop), y = ini, func = OneLayer_forecast, parms = params, method = 'rk4')
555+
nrmse_temp <- sqrt(sum((out[,2]- observed$WT_obs[idstart:idstop])^2, na.rm = TRUE)/(nrow(out)))/(max(out[,2]) - min(out[,2]))
556+
result[random_run,1] <- nrmse_temp
557+
param_matrix[random_run,1] <- params[7]
546558
}
547-
548-
out <- ode(times = c(idstart:idstop), y = ini, func = OneLayer_forecast, parms = params, method = 'rk4')
549-
nrmse_temp <- sqrt(sum((out[,2]- observed$WT_obs[idstart:idstop])^2, na.rm = TRUE)/(nrow(out)))/(max(out[,2]) - min(out[,2]))
550-
# nrmse_do <- sqrt(sum((out[,3]/ 1000 / params[1] * 1e6 - observed$DO_obs[idstart:idstop])^2)/nrow(out))/(max(out[,3]) - min(out[,3]))
551-
result[random_run,1] <- nrmse_temp #, nrmse_do)
552-
param_matrix[random_run,1] <- params[7] # params[20])
553-
}
554-
# sum_result <- apply(result, 1, function(x) sum(x,na.rm = TRUE))
555-
id_row1 <- which.min(result[,1])
556559

560+
id_row1 <- which.min(result[,1])
557561
params[7] <- param_matrix[id_row1, 1]
562+
q_par = params[7]
558563

559-
for (random_run2 in 1:100){
560-
params[20] <- rnorm(n = 1, mean = nep_par, sd = 1e-7)
561-
while(is.na(params[20])){
562-
params[20] <- rnorm(n = 1, mean = nep_par, sd = 1e-7)
563-
}
564-
out <- ode(times = c(idstart:idstop), y = ini, func = OneLayer_forecast, parms = params, method = 'rk4')
565-
nrmse_do <- sqrt(sum((out[,3]/ 1000 / params[1] * 1e6 - observed$DO_obs[idstart:idstop])^2, na.rm = TRUE)/nrow(out))/(max(out[,3]) - min(out[,3]))
566-
567-
result[random_run2,2] <- nrmse_do #, nrmse_do)
568-
param_matrix[random_run2,2] <- params[20] # params[20])
564+
}
565+
566+
if (!is.na(observed$DO_obs[idstop])){
567+
for (random_run2 in 1:100){
568+
params[20] <- rnorm(n = 1, mean = nep_par, sd = 1e-5)
569+
while(is.na(params[20])){
570+
params[20] <- rnorm(n = 1, mean = nep_par, sd = 1e-5)
571+
}
572+
out <- ode(times = c(idstart:idstop), y = ini, func = OneLayer_forecast, parms = params, method = 'rk4')
573+
nrmse_do <- sqrt(sum((out[,3]/ 1000 / params[1] * 1e6 - observed$DO_obs[idstart:idstop])^2, na.rm = TRUE)/nrow(out))/((max(out[,3]) - min(out[,3]))/ 1000 / params[1] * 1e6 )
574+
575+
result[random_run2,2] <- nrmse_do #, nrmse_do)
576+
param_matrix[random_run2,2] <- params[20] # params[20])
569577
}
570-
571-
id_row2 <- which.min(result[,2])
572578

573-
# sum_result <- apply(result, 1, function(x) sum(x,na.rm = TRUE))
574-
# id_row <- which.min(sum_result)
575-
576-
# q_par <- param_matrix[id_row, 1]
577-
# nep_par <- param_matrix[id_row, 2]
578-
# params[7] <- q_par
579-
# params[20] <- nep_par
580-
581-
params[7] <- param_matrix[id_row1, 1]
582-
q_par = params[7]
583-
if (length(id_row2) > 0){
579+
id_row2 <- which.min(result[,2])
584580
params[20] <- param_matrix[id_row2, 2]
585581
nep_par <- params[20]
586-
} else {
587-
params[20] <- param_matrix[id_row1, 2]
588-
nep_par <- params[20]
589582
}
590-
583+
584+
# params[7] <- param_matrix[id_row1, 1]
585+
#
586+
# if (length(id_row2) > 0){
587+
#
588+
# } else {
589+
# params[20] <- param_matrix[id_row1, 2]
590+
# nep_par <- params[20]
591+
# }
591592

592593
out <- ode(times = c(idstart:idstop), y = ini, func = OneLayer_forecast, parms = params, method = 'rk4')
593594

594-
if (match(nn, which(!is.na(observed$WT_obs))[2:length(which(!is.na(observed$WT_obs)))]) == 1){
595+
if (match(nn, which(!is.na(observed[,2]) | !is.na(observed[,3]))[2:length( which(!is.na(observed[,2]) | !is.na(observed[,3])))]) == 1){
595596
out_total <- rbind(out_total, out)
596597
} else {
597598
out_total <- rbind(out_total, out[-c(1),])
598599
}
599600

600-
print(paste0(match(nn, which(!is.na(observed$WT_obs))[2:length(which(!is.na(observed$WT_obs)))]),'/',
601-
length(which(!is.na(observed$WT_obs))[2:length(which(!is.na(observed$WT_obs)))]),
602-
'; WTR NRMSE: ',round(result[id_row1],5)))
603-
print(q_par)
604-
print(nep_par)
601+
print(paste0(match(nn, which(!is.na(observed[,2]) | !is.na(observed[,3]))[2:length( which(!is.na(observed[,2]) | !is.na(observed[,3])))]),'/',
602+
length(which(!is.na(observed[,2]) | !is.na(observed[,3]))[2:length( which(!is.na(observed[,2]) | !is.na(observed[,3])))]),
603+
'; current WTR NRMSE: ',round(result[id_row1,1],5),
604+
'; current DO NRMSE: ',round(result[id_row2,2],5)))
605+
# print(q_par)
606+
# print(nep_par)
605607

606608
idstart = nn
607609
ini <- out[nrow(out), 2:3]
610+
611+
if (!is.na(observed$WT_obs[idstop])){
608612
ini[1] <- rnorm(n = 1, mean = observed$WT_obs[idstop], sd = 0.1)
613+
}
614+
if (!is.na(observed$DO_obs[idstop])){
615+
ini[2] <- rnorm(n = 1, mean = observed$DO_obs[idstop] * 1000 * params[1] / 1e6, sd = 10)
616+
# 1000/1e6 * wq_parameters[1]
617+
}
609618
}
610619

611620
if (max(times) > idstart){
612621
out_forecast <- list()
613622
for (random_run3 in 1:100){
614-
params[7] <- rnorm(n = 1, mean = q_par, sd = 1e8)
623+
params[7] <- rnorm(n = 1, mean = q_par, sd = 1e7)
615624
while(is.na(params[7])){
616-
params[7] <- rnorm(n = 1, mean = q_par, sd = 1e8)
625+
params[7] <- rnorm(n = 1, mean = q_par, sd = 1e7)
617626
}
618-
params[20] <- rnorm(n = 1, mean = nep_par, sd = 1e-7)
627+
params[20] <- rnorm(n = 1, mean = nep_par, sd = 1e-5)
619628
while(is.na(params[20])){
620-
params[20] <- rnorm(n = 1, mean = nep_par, sd = 1e-7)
629+
params[20] <- rnorm(n = 1, mean = nep_par, sd = 1e-5)
621630
}
622631
out <- ode(times = c(idstart:max(times)), y = ini, func = OneLayer_forecast, parms = params, method = 'rk4')
623632
out_df <- rbind(out_total, out[-c(1),])
624633

625634
out_forecast[[match(random_run3, seq(1,100))]] <- out_df
626635
}
627636

628-
}
637+
} else { out_forecast = out_total}
629638

630639
return(out_forecast)
631640
}

0 commit comments

Comments
 (0)