用于循环并存储迭代算法的结果值

时间:2018-08-06 07:50:50

标签: r optimization statistics mle

H,我是R的初学者,在处理for循环时遇到问题。 我正在尝试存储25个tau,b0和b1值。为了找到b1,我们必须在代码中找到Out函数的最小值(b1应该接近值1),我想在for循环中使用此b1来找到b0和b1,并且应该将其存储在向量中长度为25(我应该有b0,b1 tau的列表)。 请帮助并提前致谢!  我已经添加了我打算做的事

我想要

 b1[1], b1[2],..., b1[25]

t[1],t[2],...,t[25]

b0[1],b0[2],...,b0[25] 

通过解决图片中的问题

enter image description here

set.seed(22)
#Inverse Transformation on CDF
Simburr.f1 <- function(n, tau) {
  u=runif(n)
  x<- runif(n)
  lambda = exp(1+x)
  y= (1/(u^(1/lambda))-1)^(1/tau)
  y
}
y33 = Simburr.f1(25,0.5)
#------------------------------------
# We fix Tau = 0.5
est3 = function(m) {
  x=runif(25)
  Out = rep(0,m)
  k= seq(0.05,2,l=m)
   for ( i in 1:m){
    Out[i]=  log(mean(x)) -log(mean(exp(k[i]*x)*log(1+y33^0.5)*x) )    +  log(mean(log(1+y33^0.5)*exp(k[i]*x)))  
     }
  Out
}
p=est3(200)
k[which.min(abs(p-0))] # = B1
#--------------------------------------
x =runif(25)
tau[1]= 0.5  
b0[1] = 1
b1[1] = 1
# Iterative process
for ( i in 2:25){
  b0[i]= -log(mean(log(1+y33^(tau[i-1]))*exp(b1[i-1]*x)))
  tau[i] =1/( mean((exp(b0[i-1]+b1[i-1]*x)+1)*(y33^tau[i-1])*log(y33)/(1+y33^tau[i-1])) -mean(log(y33)))
}

3 个答案:

答案 0 :(得分:0)

就您的原始问题而言,您已经快到了。但是您不能通过使用[1]专门定义变量的第一个元素来声明变量。相反,您需要声明一个空数组然后写入它:

b0 = NULL
b0[1] = 1

或者您可以通过向其写入b0来简单声明1

b0 = 1

在两种情况下,这都会产生一个长度为1的向量。您使用的代码将在运行时扩展向量的长度。

注意:由于引用了变量k(仅存在于函数范围内),您的代码仍无法运行,您也需要对其进行更正。但是我不确定您想k[which.min(abs(p-0))] # = B1实现什么,所以我对此无能为力。

答案 1 :(得分:0)

我不太明白问题是什么。 但是,我清楚地了解到您的代码无法正常工作,因为您不能在显式地将变量声明为列表或矩阵之前放置tau[1]b0[1]b1[1]的值。 在将值放入第一个索引之前,需要添加以下代码:

tau <- matrix(c(0),ncol=1,nrow=25)
b0 <- matrix(c(0),ncol=1,nrow=25)
b1 <- matrix(c(0),ncol=1,nrow=25)
tau[1]= 0.5  
b0[1] = 1
b1[1] = 1

这可能是您要寻找的:

for ( i in 2:25){
  p <- est3(200)
  b1[i] = p[which(abs(p-0)==min(abs(p-0)))]
  b0[i]= -log(mean(log(1+y33^(tau[i-1]))*exp(b1[i-1]*x)))
  tau[i] =1/( mean((exp(b0[i-1]+b1[i-1]*x)+1)*(y33^tau[i-1])*log(y33)/(1+y33^tau[i-1])) -mean(log(y33)))
}

b1值来自最接近零的est3(200)值

完整代码:

set.seed(22)
#Inverse Transformation on CDF
Simburr.f1 <- function(n, tau) {
  u=runif(n)
  x<- runif(n)
  lambda = exp(1+x)
  y= (1/(u^(1/lambda))-1)^(1/tau)
  y
}
y33 = Simburr.f1(25,0.5)
#------------------------------------
# We fix Tau = 0.5
est3 = function(m) {
  x=runif(25)
  Out = rep(0,m)
  k= seq(0.05,2,l=m)
   for ( i in 1:m){
    Out[i]=  log(mean(x)) -log(mean(exp(k[i]*x)*log(1+y33^0.5)*x) )    +  log(mean(log(1+y33^0.5)*exp(k[i]*x)))  
     }
  Out
}


#--------------------------------------
x =runif(25)
tau <- matrix(c(0),ncol=1,nrow=25)
b0 <- matrix(c(0),ncol=1,nrow=25)
b1 <- matrix(c(0),ncol=1,nrow=25)
tau[1]= 0.5  
b0[1] = 1
b1[1] = 1


# Iterative process
for ( i in 2:25){
  p=est3(200)
  b1[i] = p[which(abs(p-0)==min(abs(p-0)))]
  b0[i]= -log(mean(log(1+y33^(tau[i-1]))*exp(b1[i-1]*x)))
  tau[i] =1/abs(( mean((exp(b0[i-1]+b1[i-1]*x)+1)*(y33^tau[i-1])*log(y33)/(1+y33^tau[i-1])) -mean(log(y33))))
}

答案 2 :(得分:0)

在声明初始taub0b1值之前,需要通过添加以下行来声明变量: tau <- b0 <- b1 <- vector("numeric", 25L)

编辑

set.seed(22)
#Inverse Transformation on CDF
Simburr.f1 <- function(n, tau) {
  u=runif(n)
  x<- runif(n)
  lambda = exp(1+x)
  y= (1/(u^(1/lambda))-1)^(1/tau)
  y
}
y33 = Simburr.f1(25,0.5)
#------------------------------------
# We fix Tau = 0.5
est3 = function(m) {
  x=runif(25)
  Out = rep(0,m)
  k= seq(0.05,2,l=m)
  for ( i in 1:m){
    Out[i]=  log(mean(x)) -log(mean(exp(k[i]*x)*log(1+y33^0.5)*x) )    +  log(mean(log(1+y33^0.5)*exp(k[i]*x)))  
  }
  Out
}
p=est3(200)
k <- seq(0.05,2, length.out = 200)
k[which.min(abs(p-0))] # = B1
#--------------------------------------
x =runif(25)
tau <- b0 <- b1 <- vector("numeric", 25)
tau[1]= 0.5  
b0[1] = 1
b1[1] = 1
# Iterative process
for ( i in 2:25){
  b0[i]= -log(mean(log(1+y33^(tau[i-1]))*exp(b1[i-1]*x)))
  tau[i] =1/( mean((exp(b0[i-1]+b1[i-1]*x)+1)*(y33^tau[i-1])*log(y33)/(1+y33^tau[i-1])) -mean(log(y33)))
}