对于作业,我必须创建一个随机向量theta,一个向量p包含theta的每个元素的相关概率,以及另一个随机向量u。到目前为止没有任何问题,但我仍然坚持下面的报告:
如果pi≥ui,则生成位置i为1的向量r1,如果pi
theta=rnorm(1000,0,1)
p=(exp(theta-1))/(1+exp(theta-1))
u=runif(1000,0,1)
我尝试了以下代码,但它不起作用。
r1<-for(i in 1:1000){
if(p[i]<u[i]){
return("0")
} else {
return("1")}
}
答案 0 :(得分:1)
您可以使用ifelse功能:
r1 <- ifelse(p >= u, 1, 0)
或者您可以简单地将逻辑比较转换为数字向量,将TRUE
转换为1,将FALSE
转换为0:
r1 <- as.numeric(p >= u)
答案 1 :(得分:1)
r1<-for(i in 1:1000){
if(p[i]<u[i]){
return("0")
} else {
return("1")}
}
我们遇到了一些问题,其中最大的一个问题就是你通过分配和使用for
将return()
循环与一般函数混淆。当您使用return()
编写自己的函数时,将使用function() <- ...
。在for
循环内部,不需要它。 for
循环只运行其中的代码一定次数,它不能返回类似函数的东西。
你做需要一种存储结果的方法。最好通过预先分配结果向量,然后将其填充到for
循环内来完成。
r1 <- rep(NA, length(p)) # create a vector as long as p
for (i in 1:1000) {
if (p[i] < u[i]) { # compare the ith element of p and u
r1[i] <- 0 # put the answer in the ith element of r1
} else {
r1[i] <- 1
}
}
我们可以简化一下。您可以将if
作为全0开始,而不是使用else
和 r1
,而只需p[i] >= u[i]
将其更改为1 }。为了安全起见,我认为最好使for语句类似for (i in 1:length(p))
,或者最好for (i in seq_along(p))
,但R的优点是需要多少循环,而@ DavidRobinson的矢量化建议是远的清洁剂。