R语言学习之极值统计——Gumbel参数估计

说明

在学习过程中参考了以下文章:
R语言与点估计学习笔记(矩估计与MLE)(CSDN)
R语言与函数估计学习笔记(函数模型的参数估计)(CSDN)
R 基本函数总结(博客园)

1、极值统计

所谓极值,指的是数据集合当中的最大值或者最小值,极值统计理论研究的就是数据集当中极值分布模型的理论。
用R语言进行极值统计,最简单的需求无非是两种:

  1. 已知极值分布的模型和参数,预测未知点;
  2. 已知若干数据点,求最拟合这些数据点的分布函数及分布函数的参数。

第一种需求比较简单,很容易实现;第二种需求比较困难,但是如果有已经编好的程序,直接用也很简单,而且往往用第二种需求得出来的分布模型和参数,预测未知点,回到了第一种需求。

接下来的内容都是为了完成最终的任务,即在已知数据点,并且假定数据符合Gumbel分布的基础上,估计模型参数。

G u m b e l ( x ) = e − e − ( x − a ) / b   Gumbel (x) = e^{-e^{-(x-a)/b}}\, Gumbel(x)=ee(xa)/b

2、用到的包

# 在RGui中输入以下命令,选择一个国内镜像,然后会自动安装成功

# 常用极值分布包

install.packages("evd")

3、已知模型参数求点

# 在该包中实现了四个gumbel函数,其分布函数的数学表达式为:
# G(x) = exp{
    
    -exp[-(z-a)/b]}

dgumbel(x, loc=0, scale=1, log = FALSE) 		#密度函数
pgumbel(q, loc=0, scale=1, lower.tail = TRUE) 	#分布函数
qgumbel(p, loc=0, scale=1, lower.tail = TRUE)	#分位函数
rgumbel(n, loc=0, scale=1)						#随机生成函数

# 参数含义
# x,q:分位数向量
# p:概率向量
# loc,scale:位置和尺度参数即公式中的a和b,可为向量可为数值
# log:逻辑值,真值时返回对数密度函数
# ower.tail:默认为真值返回下侧概率,否则范围上侧概率

# 设置分布参数和已知点的部分信息,求点

dgumbel(-1:2, -1, 0.5)
pgumbel(-1:2, -1, 0.5)
qgumbel(seq(0.9, 0.6, -0.1), 2, 0.5)
rgumbel(6, -1, 0.5)
pgumbel(qgumbel((1:9)/10, -1, 2), -1, 2)

4、已知点数据求模型参数

根据未知模型的类别不同,可采取不同的方法对模型参数进行估计,可分为以下几类:

  1. 线性函数模型
  2. 一般函数模型
  3. 概率分布模型

4.1 线性分布模型

相当于估计以下函数中的未知数a和b
y ( x ) = a x + b   y (x) = ax+b\, y(x)=ax+b

使用lm()函数进行线性回归,估计参数
在这里插入图片描述

library(plyr)
library(ggplot2)

set.seed(1)
x <- seq(1,5,length.out = 100)	# 等间距的100个数作为x轴
noise <- rnorm(n = 100,mean = 0,sd = 1)
a <- 1							# 人为设定系数a为1
b <- 2							# 人为设定系数b为2
y <- a * x + b + noise			# 随机数产生噪声
model <- lm(y~x)    #拟合线性模型函数
summary(model)      #获取描述性统计量
yConf <- predict(model,interval = 'confidence') #指定置信区间
yPred <- predict(model,interval = 'prediction') #指定预测区间
yConf <- as.data.frame(yConf)
yPred <- as.data.frame(yPred)
yConf
ggplot(data.frame(x = x, y = y), aes(x, y)) +
  geom_point(colour = "gray", size = 3) +
  geom_smooth(method = "lm", color = "black", se = FALSE) +
  geom_line(aes(x, y), data.frame(x = x, y = yConf$lwr)) + 
  geom_line(aes(x, y), data.frame(x = x, y = yConf$upr)) + 
  geom_line(aes(x, y), data.frame(x = x, y = yPred$lwr)) + 
  geom_line(aes(x, y), data.frame(x = x, y = yPred$upr)) + 
  geom_line(aes(x, y), data.frame(x = x, y = yConf$fit))
 
# 输出:

## Estimate Std. Error
## (Intercept)   2.1424     0.2491
## x             0.9888     0.0774

# 估计值a为0.988,b为2.1424和人为设定的12非常接近
# 完成了估计任务

4.2 一般函数模型

相当于估计以下函数中的未知数a
y ( x ) = x a   y (x) = x^{a}\, y(x)=xa

使用函数拟合函数nls()进行拟合,估计参数
在这里插入图片描述

len <- 24
x <- runif(len, 0.1, 1)
a <- 3
y <- x^a + rnorm(len, 0, 0.06) # 加入随机噪声作为原始数据
ds <- data.frame(x = x, y = y)
s <- seq(0, 1, length = 100)
ggplot(ds, aes(x, y)) +
  geom_point() + 
  ggtitle("加入噪声的立方曲线数据") +
  geom_line(aes(x, y), data.frame(x = s, y = s^3), color = "green") +
  theme(plot.title = element_text( hjust = 0.5))
m <- nls(y ~ I(x^power), data = ds, start = list(power = 1), trace = T)
summary(m)

# 输出

## Parameters:
##   Estimate Std. Error t value
## power   2.8844     0.1845   15.63

# 估计的次方数为2.8844,和设定的3比较接近

4.3 概率分布模型

对于概率分布模型参数的估计,一般都采用矩估计法或者最大似然估计法,对于Gumbel分布而言,相当于估计以下函数中的a和b

G u m b e l ( x ) = e − e − ( x − a ) / b   Gumbel (x) = e^{-e^{-(x-a)/b}}\, Gumbel(x)=ee(xa)/b

对于单未知参数采用optimize()函数求最大似然估计值,对于多未知参数则采用optim(), nlm(), nlminb() 三个函数求最大似然估计值,但是对于Gumbel分布已经有做成的参数估计函数,即evd包中的fgev()函数
在这里插入图片描述

# 广义极值分布式Gunmel分布以及另外两种分布的一般形式,表达式为:
# G(x) = exp[-{
    
    1+s(z-a)/b}^(-1/s)]
# 其中s=0时退化为Gunmel分布
# 其中s>0时退化为Weibull分布
# 其中s<0时退化为Frechet分布

# 广义极值分布随机生成100个数据
# a,b,s三个参数设定为0.131.10.2
uvdata <- rgev(100, loc = 0.13, scale = 1.1, shape = 0.2)

# 生成-0.490.5之间100个数据
trend <- (-49:50)/100

# 采用广义极值分布,并设置标签
M1 <- fgev(uvdata, nsloc = trend, control = list(trace = 1))

# 采用广义极值分布
M2 <- fgev(uvdata)

# 采用Gumbel分布进行拟合
M3 <- fgev(uvdata, shape = 0)

# 采用Gumbel分布进行拟合,并将b设置为1
M4 <- fgev(uvdata, scale = 1, shape = 0)
anova(M1, M2, M3, M4)
par(mfrow = c(2,2))
M1
M2
M3
M4

# > anova(M1, M2, M3, M4)
# Analysis of Deviance Table
# 
# M.Df Deviance Df   Chisq Pr(>chisq)
# M1    4   410.08
# M2    3   410.28  1  0.1982     0.6562
# M3    2   447.55  1 37.2674  1.030e-09 ***
#   M4    1   497.21  1 49.6647  1.824e-12 ***
#   ---
#   Signif. codes:
#   0***0.001**0.01*0.05.0.1 ‘ ’ 1
# > par(mfrow = c(2,2))
# > M1
# 
# Call: fgev(x = uvdata, control = list(trace = 1), nsloc = trend)
# Deviance: 410.0805
# 
# Estimates
# loc  loctrend     scale     shape
# 0.2237    0.1718    1.2970    0.3681
# 
# Standard Errors
# loc  loctrend     scale     shape
# 0.14775   0.39136   0.12939   0.08959
# 
# Optimization Information
# Convergence: successful
# Function Evaluations: 32
# Gradient Evaluations: 12
# 
# > M2
# 
# Call: fgev(x = uvdata)
# Deviance: 410.2787
# 
# Estimates
# loc   scale   shape
# 0.2172  1.2940  0.3748
# 
# Standard Errors
# loc    scale    shape
# 0.14701  0.12948  0.08963
# 
# Optimization Information
# Convergence: successful
# Function Evaluations: 45
# Gradient Evaluations: 14
# 
# > M3
# 
# Call: fgev(x = uvdata, shape = 0)
# Deviance: 447.5461
# 
# Estimates
# loc   scale
# 0.5324  1.7070
# 
# Standard Errors
# loc   scale
# 0.1762  0.1464
# 
# Optimization Information
# Convergence: successful
# Function Evaluations: 42
# Gradient Evaluations: 10
# 
# > M4
# 
# Call: fgev(x = uvdata, scale = 1, shape = 0)
# Deviance: 497.2108
# 
# Estimates
# loc
# 0.2463
# 
# Standard Errors
# loc
# 0.1
# 
# Optimization Information
# Convergence: successful
# Function Evaluations: 11
# Gradient Evaluations: 4

# 从图形和输出参数都能看出M2的参数分别为:0.2172  1.2940  0.3748
# 最接近认为设定值:0.13  1.1  0.2
# 参数估值成功

猜你喜欢

转载自blog.csdn.net/qq_42318112/article/details/107090710
今日推荐