저는 초보자이고 시뮬레이션 된 데이터와 관찰 된 데이터의 PBIAS (Percent Bias) 및 NSE (Nash-Sutcliffe Efficiency)를 계산하는 함수 (아래)를 만들었습니다. 그러나 전체 데이터 세트를 사용해서 만 이러한 테스트를 계산할 수 있습니다.
model.assess <- function(Sim, Obs) {
rmse = sqrt( mean( (Sim - Obs)^2, na.rm = TRUE) ) #Formula to calculate RMSE
RSR <- rmse / sd(Obs) #object producing RSR test from the RMSE formula
PBIAS <- 100 *(sum((Sim - Obs)/sum(Obs), na.rm =TRUE)) #object producing PBIAS test
NSE <- 1 - sum((Obs - Sim)^2)/sum((Obs - mean(Obs))^2, na.rm =TRUE) #object producing NSE test
stats <- print(paste0("RSR = ", sprintf("%.3f", round(RSR, digits=3)), " PBIAS = ", sprintf("%.3f",round(PBIAS, digits=3))," NSE = ", sprintf("%.3f",round(NSE, digits=3))))
return(stats) #returns the results of the tests with 3 decimals and spacing in between
이것은 네 개의 다른 스테이션 (SNS, MRC, TLG, SJF)의 데이터 세트, 월간 스트림 흐름입니다.
StationID Date Obs_flow Sim_flow Month Year
SNS 1950-10-01 0.010170 0.030687967 October 1950-01-01
SNS 1950-11-01 0.366260 0.416466741 November 1950-01-01
SNS 1950-12-01 0.412210 0.496136731 December 1950-01-01
SNS 1951-01-01 0.119520 0.182072570 January 1951-01-01
SNS 1951-02-01 0.113480 0.142611192 February 1951-01-01
SNS 1951-03-01 0.127090 0.176350274 March 1951-01-01
SNS 1951-04-01 0.175120 0.193221389 April 1951-01-01
SNS 1951-05-01 0.208940 0.275980903 May 1951-01-01
SNS 1951-06-01 0.114420 0.144675317 June 1951-01-01
SNS 1951-07-01 0.032280 0.018057796 July 1951-01-01
방정식과 R 제곱을 사용하여 Obs 대 Sim의 산점도를 플롯하려면 다음을 사용했습니다.
dataset %>%
filter(StationID == "SNS") %>%
ggplot(aes(x = Obs_flow, y = Sim_flow)) +
geom_point(aes(Obs_flow, Sim_flow), alpha = 0.3)+
stat_smooth(aes(x = Obs_flow, y = Sim_flow),
method = "lm", se = TRUE, colour="#FC4E07", fullrange = TRUE) +
stat_poly_eq(formula = "y~x",
aes(label = paste0(..eq.label..)), #adding the equation on the top
parse = TRUE, label.x.npc = "center", label.y.npc = 0.97, size = 3.45, family= "Times New Roman")+
stat_poly_eq(formula = "y~x",
aes(label = paste0(..rr.label..)), #adding the Rsquared at the bottom
parse = TRUE, label.x.npc = 0.95, label.y.npc = 0.05, size = 3.45, family= "Times New Roman")+
annotate("text", x = 0, y = 1.3,, label = paste0(model.assess(dataset$Sim_flow, dataset$Obs_flow)), collapse = "\n", hjust = 0, size=2.4, family= "Times New Roman") +
facet_wrap(~ Month, ncol=4, labeller = labeller(StationID = c("MRC" = "Merced River", "SJF"= "Upper San Joaquin River", "SNS" = "Stanislaus River", "TLG" = "Tuolumne River")), scales = "fixed")
stat_poly_eq
각 패싯에 대한 방정식과 Rsquared를 추가했지만 주석은 모든 패싯에 대해 동일한 숫자를 추가합니다. 각 패싯에 대해 NSE 및 PBIAS를 별도로 추가하는 방법이 있습니까? 나는 패키지를 시도했지만 HydroGOF
동일한 결과를 얻었습니다. 미학을 실례합니다.
샘플 데이터는 다른 사람들에게 도움이 될 것입니다. 향후 질문에 대해서는 이 링크 를 참조하십시오.
몇 가지 문제가 있습니다. 귀하의 model.assess()
각면에 대한 값을 필요로하면서 기능은 하나 개의 레코드를 제공합니다. 그래서 코드를 사용하여 더미를 만들었습니다.
ll <- data.frame(Month=c(),label=c())
nM <- length(Month)
lapply(1:nM, function(i){
a <- Sim_flow*i*i*0.5
b <- Obs_flow*i
m <- model.assess(a,b)
ll <<- rbind(ll,data.frame(Month=Month[i],label=m))
})
labels <- ll
다음으로 여기에 언급 된 주석 대신 geom_label을 사용해야 합니다 . 아래 코드
ggplot(data=dataset, aes(x = Obs_flow, y = Sim_flow)) +
geom_point(aes(Obs_flow, Sim_flow), alpha = 0.3)+
stat_smooth(aes(x = Obs_flow, y = Sim_flow),
method = "lm", se = TRUE, colour="#FC4E07", fullrange = TRUE) +
stat_poly_eq(formula = "y~x",
aes(label = paste0(..eq.label..)), #adding the equation on the top
parse = TRUE, label.x.npc = "center", label.y.npc = 0.97, size = 3.45, family= "Times New Roman") +
stat_poly_eq(formula = "y~x",
aes(label = paste0(..rr.label..)), #adding the Rsquared at the bottom
parse = TRUE, label.x.npc = 0.95, label.y.npc = 0.05, size = 3.45, family= "Times New Roman") +
facet_wrap(~Month, ncol=4, labeller = labeller(StationID = c("MRC" = "Merced River", "SJF"= "Upper San Joaquin River", "SNS" = "Stanislaus River", "TLG" = "Tuolumne River")), scales = "fixed") +
geom_label(data = labels, aes(label=label, x = Inf, y = -Inf),
hjust=1, vjust=0, size=1.8,
inherit.aes = FALSE)
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다