估计某些分布的参数生成随机数

时间:2016-05-05 13:13:03

标签: r parameters statistics distribution estimation

我刚刚在R中解决我的统计问题。目前,我正在使用我使用R生成的200个随机数(RN)来估计分布的参数。我在100次中生成200个RN。所以这意味着将有100种200 RN,我估计这100种RN。这也意味着将有100种估计结果。 所以这是我用来生成RN的代码:

#Generate random numbers U~(0, 1)
rep <-100 #total replication
unif <-matrix(0, 200, rep)
for (k in 1: rep)
{
  unif[,k] <- runif(200, min = 0, max = 1)
}

# Based on the 100 kinds of generated random numbers that follow U ~ (0.1), I will generate again 100 kinds of random numbers which follow the estimated distribution:
# Define parameters
a <- 49.05 #1st parameter
b <- 3.148 #2nd parameter
c <- 0.145 #3rd parameter
d <- 0.00007181 #4th parameter

X <-matrix(0, 200, rep)
for (k in 1: rep)
{
  X[,k] <- a*(log(1-((log(1-((unif[,k])^(1/c))))/(a*d))))^(1/b)
}

# Sorting the generated RN from the smallest to the largest
X_sort <-matrix(0, 200, rep)
for (k in 1: rep)
{
  X_sort[,k] <- sort(X[,k])
}

在这里,我设法生成了100种估计的RN。但是,我现在面临的问题是如何估计这100种RN。我只估计一个。以下是我使用maxLik包估算参数的代码,估算方法为BHHH

xi = X_sort[,1]
log_likelihood<-function(theta,xi){
  p1 <- theta[1] #1st parameter
  p2 <- theta[2] #2nd parameter
  p3 <- theta[3] #3rd parameter
  p4 <- theta[4] #4th parameter
  logL=log((p4*p2*p3*((xi/p1)^(p2-1))*(exp(((xi/p1)^(p2))+(p4*p1*(1-(exp((xi/p1)^(p2)))))))*((1-(exp((p4*p1*(1-(exp((xi/p1)^(p2))))))))^(p3-1))))
  return(logL)
}
library(maxLik);
# Initial parameters
a <- 49.05 #1st parameter
b <- 3.148 #2nd parameter
c <- 0.145 #3rd parameter
d <- 0.00007181 #4th parameter
m <- maxLik(log_likelihood, start=c(a,b,c,d), xi = xi, method="bhhh");
summary(m)

结果如下:

--------------------------------------------
Maximum Likelihood estimation
BHHH maximisation, 5 iterations
Return code 2: successive function values within tolerance limit
Log-Likelihood: -874.0024 
4  free parameters
Estimates:
      Estimate Std. error t value  Pr(> t)    
[1,] 4.790e+01  1.846e+00  25.953  < 2e-16 ***
[2,] 3.015e+00  1.252e-01  24.091  < 2e-16 ***
[3,] 1.717e-01  2.964e-02   5.793 6.91e-09 ***
[4,] 7.751e-05  6.909e-05   1.122    0.262    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
--------------------------------------------

为了估计另外99个RN,我必须手动更改xi = X_sort[,k]以获得k = 1,2,...,100,因此对于第二个RN,它应该变为X_sort[,2],并且所以直到第100个RN。我认为这样做效率不高,因为需要很长时间才能逐一更换它们。那么有没有办法修改这个代码,以便估计其他RN不需要很长时间?

1 个答案:

答案 0 :(得分:3)

首先,我建议您以更紧凑的方式重写代码。

<强> 1。生成随机数。不需要生成100个长度为200的向量,而我们可以生成长度为100 * 200的向量,然后将此向量逐列写入矩阵。这可以通过以下方式完成:

rep <-100
n <-  200
unif <- matrix(runif(rep*n, min = 0, max = 1), n, rep)

<强> 2。计算矩阵的函数。在R中,可以将向量函数应用于矩阵。所以在你的情况下它将是:

X <- a*(log(1-((log(1-((unif)^(1/c))))/(a*d))))^(1/b)

第3。逐列矩阵排序我们可以使用apply函数轻松对矩阵的每一列进行排序。参数2表示我们按列进行(1表示行)。

X_sort <- apply(X, 2, sort)

<强> 4。执行估算。同样,我们可以在这里使用apply

estimations <- apply(X_sort, 2, function(x) maxLik(log_likelihood, start=c(a,b,c,d),
                                          xi = x, method="bhhh"))

然后要打印所有摘要,您可以执行以下操作:

lapply(estimations, summary)