文章目录
- 说明
- 1、极值统计
- 2、用到的包
- 3、已知模型参数求点
- 4、已知点数据求模型参数
- 4.1 线性分布模型
- 4.2 一般函数模型
- 4.3 概率分布模型
说明
在学习过程中参考了以下文章:
R语言与点估计学习笔记(矩估计与MLE)(CSDN)
R语言与函数估计学习笔记(函数模型的参数估计)(CSDN)
R 基本函数总结(博客园)
1、极值统计
所谓极值,指的是数据集合当中的最大值或者最小值,极值统计理论研究的就是数据集当中极值分布模型的理论。
用R语言进行极值统计,最简单的需求无非是两种:
- 已知极值分布的模型和参数,预测未知点;
- 已知若干数据点,求最拟合这些数据点的分布函数及分布函数的参数。
第一种需求比较简单,很容易实现;第二种需求比较困难,但是如果有已经编好的程序,直接用也很简单,而且往往用第二种需求得出来的分布模型和参数,预测未知点,回到了第一种需求。
接下来的内容都是为了完成最终的任务,即在已知数据点,并且假定数据符合Gumbel分布的基础上,估计模型参数。
Gumbel(x)=e?e?(x?a)/b
2、用到的包
1 2 3 4 5 | # 在RGui中输入以下命令,选择一个国内镜像,然后会自动安装成功 # 常用极值分布包 install.packages("evd") |
3、已知模型参数求点
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | # 在该包中实现了四个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、已知点数据求模型参数
根据未知模型的类别不同,可采取不同的方法对模型参数进行估计,可分为以下几类:
- 线性函数模型
- 一般函数模型
- 概率分布模型
4.1 线性分布模型
相当于估计以下函数中的未知数a和b
y(x)=ax+b
使用lm()函数进行线性回归,估计参数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | 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和人为设定的1和2非常接近 # 完成了估计任务 |
4.2 一般函数模型
相当于估计以下函数中的未知数a
y(x)=xa
使用函数拟合函数nls()进行拟合,估计参数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | 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
Gumbel(x)=e?e?(x?a)/b
对于单未知参数采用optimize()函数求最大似然估计值,对于多未知参数则采用optim(), nlm(), nlminb() 三个函数求最大似然估计值,但是对于Gumbel分布已经有做成的参数估计函数,即evd包中的fgev()函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 | # 广义极值分布式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.13,1.1,0.2 uvdata <- rgev(100, loc = 0.13, scale = 1.1, shape = 0.2) # 生成-0.49到0.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 # 参数估值成功 |