如何在R中执行不同类型的引导程序?

时间:2019-01-24 20:30:13

标签: statistics-bootstrap

我在R中的引导程序代码给出了一个错误,我看不出它有什么问题。有人看到吗?

B <- 10000
bootstrap.results <- matrix(nrow=B,ncol=3)
colnames(bootstrap.results) <- c("mu","sigma","convergence")
for (b in 1:B){
sample.b <- rnorm(n,mean=1,sd=1.5)
m.b <- optim(c(mu=0,sd=1),loglik,control=list(fnscale=-1),z=sample.b)
bootstrap.results[b,] <- c(m.b$par,m.b$convergence)
}

有人有他们总是使用的用于引导程序(参数/非参数)的通用代码吗?

1 个答案:

答案 0 :(得分:0)

我始终使用以下代码,在该代码中,从μ= 1且σ2 = 2.25的正态分布生成n = 30个观测值的B = 10000个样本。对于每个样本,估计参数μ和σ并将其存储在矩阵中。希望对您有所帮助。

B <- 10000
bootstrap.results <- matrix(NA,nrow=B,ncol=3)
colnames(bootstrap.results) <- c("mu","sigma","convergence")
for (b in 1:B){
  sample.b <- rnorm(n,mean=1,sd=1.5)
  m.b <- optim(c(mu=0,sd=1),loglik,control=list(fnscale=-1),z=sample.b)
  bootstrap.results[b,] <- c(m.b$par,m.b$convergence)
}

loglik <- function(p,z){
  sum(dnorm(z,mean=p[1],sd=p[2],log=TRUE))
}
set.seed(45)
n <- 30
x <- rnorm(n,mean=1,sd=1.5)
optim(c(mu=0,sd=1),loglik,control=list(fnscale=-1),z=x)

还可以获取λ的ML估计值,并使用自举程序来估计估计值的偏差和标准误差。首先计算λ的MLE,然后通过非参数自举估计λˆ的偏差和标准误差。

B <- 9999
lambda.B <- rep(NA,B)
n <- length(w.time)
for (b in 1:B){
  b.sample <- sample(1:n,n,replace=TRUE)
  lambda.B[b] <- 1/mean(w.time[b.sample])
}
bias <- mean(lambda.B-m$estimate)
sd(lambda.B)
In the second part we calculate a 95% confidence interval for the mean time between failures.

n <- length(w.time)
m <- mean(w.time)
se <- sd(w.time)/sqrt(n)
interval.1 <- m + se * qnorm(c(0.025,0.975))
interval.1

但是我们也可以使用以下假设:数据来自指数分布。在这种情况下,我们有varX¯= 1 /(nλ^ 2)=θ^ {2} / n,可以通过X¯^ {2} / n估计。

sd.m <- sqrt(m^2/n)
interval.2 <- m + sd.m * qnorm(c(0.025,0.975))
interval.2
We can also estimate the standard error of ˆθ by means of a boostrap procedure. We use the nonparametric bootstrap, that is, we sample from the original sample with replacement.

B <- 9999
m.star <- rep(NA,B)
for (b in 1:B){
  m.star[b] <- mean(sample(w.time,replace=TRUE))
}
sd.m.star <- sd(m.star)
interval.3 <- m + sd.m.star * qnorm(c(0.025,0.975))
interval.3
An interval not based on the assumption of normality of ˆθ is obtained by the percentile method:

  interval.4 <- quantile(m.star, probs=c(0.025,0.975))
interval.4

-

要使引导程序正常工作,重要的是观察结果必须独立, 分布均匀,并且您的估计分布收敛到 相应的人口分布。在下面的示例中,我估计了回归模型 有20个观察结果。现在假设由于某种原因每个观察都输入了两次。 在这种情况下,我需要重新引导原始观察结果, 以获得适当的标准误差。

set.seed(45)
x <- 2*rnorm(20)
epsilon <- rnorm(20)
y <- 1 - 0.5*x + epsilon # y variable is the regression
data1 <- data.frame(y=y,x=x,obs.id=1:20)
summary(lm(y~x,data=data1))
now the dataset is entered twice but we know the id's of the original observations

data2 <- rbind(data1,data1)
summary(lm(y~x,data=data2))

系数完全相同,但是估计的标准误差是错误的 由于数据集重复。数据是依赖的 独立的观察单位是id

B <- 10000
boot.b <- matrix(NA,nrow=B,ncol=2)
all.ids <- cbind(1:20,line1=1:20,line2=21:40)
for (b in 1:B){
  ids.b <- sample(all.ids[,1],20,replace=TRUE)
  lines.b <- c(all.ids[ids.b,2],all.ids[ids.b,3])
  data.b <- data2[lines.b,]
  boot.b[b,] <- coef(lm(y~x,data=data.b))
}
colMeans(boot.b)

coef(lm(y~x,data=data1))

var(boot.b)

vcov(lm(y~x,data=data1))

vcov(lm(y~x,data=data2))

引导程序标准错误接近正确数据集的错误, 因为在for循环中指定的引导程序采用了 观察到的结果。

-

具有置信带的正常99%损失分位数 增量法

quantile(aex$d.return.aex,probs=0.99)

library(MASS)
m.n <- fitdistr(aex$d.return.aex,"normal")
m.n$estimate
m.n$vcov
q.hat <- m.n$estimate[1]+m.n$estimate[2]*qnorm(0.99)
q.hat
var.q.hat <- t(c(1,qnorm(0.99))) %*% m.n$vcov %*% c(1,qnorm(0.99))
sqrt(var.q.hat)
normal.interval <-q.hat + sqrt(c(var.q.hat))*qnorm(c(0.025,0.975))
normal.interval

参数引导程序1

B <- 9999
n.obs <- nrow(aex)
q.star1 <- rep(NA,B)
for (b in 1:B){
  sample.b <- rnorm(n.obs,mean=m.n$estimate[1],sd=m.n$estimate[2])
  m.b <- fitdistr(sample.b,"normal")
  q.star1[b] <- m.b$estimate[1]+m.b$estimate[2]*qnorm(0.99)
}
q1 <- quantile(q.star1,probs=c(0.025,0.975))
q1

参数引导程序2

q.star2 <- rep(NA,B)
for (b in 1:B){
  theta.b <- mvrnorm(1,mu=m.n$estimate,Sigma=m.n$vcov)
  q.star2[b] <- theta.b[1]+theta.b[2]*qnorm(0.99)
}
q2 <- quantile(q.star2,probs=c(0.025,0.975))
q2

t分布

m.t <- fitdistr(aex$d.return.aex,"t")
m.t$estimate
m.t$vcov
q.hat <- m.t$estimate[1]+m.t$estimate[2]*qt(0.99,m.t$estimate[3])
q.hat

delta方法....

library(numDeriv)

参数引导程序3

B <- 99
q.star3 <- rep(NA,B)
for (b in 1:B){
  sample.b <- m.t$estimate[1]+m.t$estimate[2]*rt(n.obs,df=m.t$estimate[3])
  m.b <- fitdistr(sample.b,"t")
  q.star3[b] <- m.b$estimate[1]+m.b$estimate[2]*qt(0.99,m.b$estimate[3])
}
q3 <- quantile(q.star3,probs=c(0.025,0.975))
q3

参数引导程序4

B <- 9999
q.star4 <- rep(NA,B)
for (b in 1:B){
  theta.b <- mvrnorm(1,mu=m.t$estimate,Sigma=m.t$vcov)
  q.star4[b] <- theta.b[1]+theta.b[2]*qt(0.99,theta.b[3])
}
q4 <- quantile(q.star4,probs=c(0.025,0.975))
q4

具有百分位数方法的非参数引导程序

B <- 99
q.star5 <- rep(NA,B)
for (b in 1:B){
  sample.b <- sample(aex$d.return.aex,size=n.obs,replace=TRUE)
  m.b <- fitdistr(sample.b,"t")
  q.star5[b] <- quantile(sample.b,probs=0.99)
}
q5 <- quantile(q.star5,probs=c(0.025,0.975))
q5

rbind(delta=normal.interval,normal.par.1=q1,normal.par.2=q2,
      delta.t=normal.interval.t,
      t.par.1=q3,
      t.par.2=q4,non.par=q5)