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]
通过解决图片中的问题
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)))
}
答案 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)
在声明初始tau
,b0
和b1
值之前,需要通过添加以下行来声明变量:
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)))
}