logit的R代码生成大于1的值?

时间:2015-06-15 00:57:36

标签: r

逻辑变换应该在(0,1)中生成值。但是如果你看一下下面的逻辑转换,你会发现它创建了大于1的值。我哪里出错?

lambda1=0
out=matrix(NA,400,1)
for (i in 1:400){
  lambda1[i+1]=((exp(0.8*lambda1[i]+rnorm(1)))/(1+exp(0.8*lambda1[i]+rnorm(1))))
  out[i]=lambda1[i]
}

2 个答案:

答案 0 :(得分:3)

每次调用rnorm(1)时,您都会得到不同的随机抽取,因此分子和分母中的随机值可能会有所不同。

请注意,exp(x) / (1+exp(x))相当于1 / (1 + exp(-x)),因此您可以这样做:

lambda1=0
out=matrix(NA,400,1)
for (i in 1:400){
  lambda1[i+1]=(1/(1+exp(-(0.8*lambda1[i]+rnorm(1)))))
  out[i]=lambda1[i]
}
summary(lambda1)
#    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
#  0.0000  0.4523  0.6352  0.6119  0.7719  0.9682 

注意:对于非常大的向量,您可能会发现在一次性预分配lambda1和计算out时效率更高(我假设您实际上需要元素2到401在out而不是元素1到400):

lambda1 <- rep(0, 401)
for (i in 1:400) lambda1[i+1]=(1/(1+exp(-(0.8*lambda1[i]+rnorm(1)))))
out <- matrix(tail(lambda1, -1))

答案 1 :(得分:1)

我并不完全清楚你想要在这里完成什么。但是你得到超出区间[0,1]的值的原因是你有两次调用rnorm(),这会给你两个不同的值。

你可以通过替换

来解决这个问题(我认为得到(接近)你想要的东西)
lambda1[i+1]=((exp(0.8*lambda1[i]+rnorm(1)))/(1+exp(0.8*lambda1[i]+rnorm(1))))

r = exp(0.8*lambda1[i] + rnorm(1))
lambda1[i+1] = r/(1+r)