- 阅读权限
- 255
- 威望
- 0 级
- 论坛币
- 18999 个
- 通用积分
- 1029.7754
- 学术水平
- 146 点
- 热心指数
- 166 点
- 信用等级
- 135 点
- 经验
- 36357 点
- 帖子
- 541
- 精华
- 0
- 在线时间
- 887 小时
- 注册时间
- 2015-9-25
- 最后登录
- 2025-12-4
|
可以把用到的两个函数拿出来简单改写, 请参考
#问题一,mrl.plot, 这个函数写的比较稳健,直接把源代码拿出来绘图
- #读取数据
- loss = readxl::read_xlsx('C:/Users/zsr/Downloads/loss.xlsx', col_names =T)
- #标准化数据
- data = loss/max(loss)
- #参数设置
- umin = min(data);umax = max(data) - 0.1
- conf = 0.95;nint = 100
- x <- xu <- xl <- numeric(nint)
- u <- seq(umin, umax, length = nint)
- for (i in 1:nint) {
- data <- data[data > u[i]]
- x[i] <- mean(data - u[i])
- sdev <- sqrt(var(data))
- n <- length(data)
- xu[i] <- x[i] + (qnorm((1 + conf)/2) * sdev)/sqrt(n)
- xl[i] <- x[i] - (qnorm((1 + conf)/2) * sdev)/sqrt(n)
- }
- plot(u, x, type = "l", xlab = "u", ylab = "Mean Excess",
- ylim = c(min(xl[!is.na(xl)]), max(xu[!is.na(xu)])))
- lines(u[!is.na(xl)], xl[!is.na(xl)], lty = 2)
- lines(u[!is.na(xu)], xu[!is.na(xu)], lty = 2)
复制代码
## 问题二:在gdp.fit中调用了optim,在某些情况下无最优质,思路屏蔽掉无最优值的项,代码如下
- # un.TryCatch 异常处理函数, 捕获所有error和warnings信息,包含一个参数
- # expr 为待执行函数
- un.TryCatch <- function(expr) {
- #设置初始warn和err都为NULL
- warn <- err <- NULL
- #withCallingHandlers 捕获函数或表达式(expr)的error和warn
- value <- withCallingHandlers(
- #tryCatch捕捉warn和error
- tryCatch(expr, error=function(e) {
- err <<- e
- NULL
- }), warning=function(w) {
- warn <<- w
- invokeRestart("muffleWarning")
- })
- #返回表达式运行value, warn, err
- list(value=value, warning=warn, error=err)
- }
- #数据参数设置
- data = loss/max(loss)
- umin = min(data);umax = max(data) - 0.1
- nint = 10;show = FALSE
- m <- s <- up <- ul <- matrix(NA, nrow = nint, ncol = 2)
- u <- seq(umin, umax, length = nint)
- for (i in 1:nint) {
- z.tem <- un.TryCatch(gpd.fit(data$loss, u[i], show = show))
- if(!is.null(z.tem$value)){
- z = z.tem$value
- m[i, ] <- z$mle
- m[i, 1] <- m[i, 1] - m[i, 2] * u[i]
- d <- matrix(c(1, -u[i]), ncol = 1)
- v <- t(d) %*% z$cov %*% d
- s[i, ] <- z$se
- s[i, 1] <- sqrt(v)
- up[i, ] <- m[i, ] + 1.96 * s[i, ]
- ul[i, ] <- m[i, ] - 1.96 * s[i, ]
- }else{
- m[i, ] <- NA
- s[i, ] <- NA
- up[i, ] <-NA
- ul[i, ] <- NA
- }
- }
- names <- c("Modified Scale", "Shape")
- oldpar <- par(mfrow = c(2, 1))
- for (i in 1:2) {
- um <- max(up[, i], na.rm = T)
- ud <- min(ul[, i], na.rm = T)
- plot(u, m[, i], ylim = c(ud, um), xlab = "Threshold",
- ylab = names[i], type = "b")
- for (j in 1:nint) lines(c(u[j], u[j]), c(ul[j, i], up[j, i]))
- }
- par(oldpar)
复制代码
|
|