Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在R中生成具有一定相关性和特定条件的两个序列_R_If Statement_Conditional Statements - Fatal编程技术网

在R中生成具有一定相关性和特定条件的两个序列

在R中生成具有一定相关性和特定条件的两个序列,r,if-statement,conditional-statements,R,If Statement,Conditional Statements,我想用R生成两个大小为100的数据系列,其中一个是缓解时间,tr,来自Exp(平均值=1)分布,另一个是生存时间,t,来自Exp(平均值=2.5)分布。我希望它们是负相关的(比如,相关性是-0.5)。但同时我希望R避免数据点I小于tr[I]的t[I]值,因为生存时间应该大于缓解时间。我已经能够使用以下代码在两个变量之间产生一些相关性(尽管相关性没有精确再现): rho <- -0.5 mu <- rep(0,2) Sigma <- matrix(rho, nrow=2, nco

我想用R生成两个大小为100的数据系列,其中一个是缓解时间,tr,来自Exp(平均值=1)分布,另一个是生存时间,t,来自Exp(平均值=2.5)分布。我希望它们是负相关的(比如,相关性是-0.5)。但同时我希望R避免数据点I小于tr[I]t[I]值,因为生存时间应该大于缓解时间。我已经能够使用以下代码在两个变量之间产生一些相关性(尽管相关性没有精确再现):

rho <- -0.5
mu <- rep(0,2)
Sigma <- matrix(rho, nrow=2, ncol=2) + diag(2)*(1 - rho)

library(MASS)

rawvars <- mvrnorm(100, mu=mu, Sigma=Sigma)

pvars <- pnorm(rawvars)

tr<-rep(0,100)
for(i in 1:100){
tr[i] <- qexp(pvars[,1][i], 1/1)
    }

t<-rep(0,100)
for(i in 1:100){
repeat { 
    t[i] <- qexp(pvars[,2][i], 1/2) 
    if (t[i]>tr[i]) break
}
}


cor(tr,t)

sum(tr>t) # shows number of invalid cases

rho这里的问题是
qexp
是分位数函数,对于相同的概率
pvars[,2][i]
返回相同的值。因此,当
pvar[i,]
中的任何一个都是向量化的
t[i]
时,代码很容易进入无限循环。以下代码符合您的要求:

rho <- -0.5
mu <- rep(0,2)
Sigma <- matrix(rho, nrow=2, ncol=2) + diag(2)*(1 - rho)

library(MASS)
set.seed(1)  ## so that results are repeatable

compute.tr.t <- function(n, paccept) {
  n <- round(n / paccept)
  rawvars <- mvrnorm(n, mu=mu, Sigma=Sigma)
  pvars <- pnorm(rawvars)
  tr <- qexp(pvars[,1], 1/1)
  t <- qexp(pvars[,2], 1/2)
  keep <- which(t > tr)
  return(data.frame(t=t[keep],tr=tr[keep]))
}

n <- 10000  ## generating 10000 instead of 100, this can now be large
paccept <- 1
res <- data.frame()
while (n > 0) {
  new.res <- compute.tr.t(n, paccept)
  res <- rbind(res, new.res)
  paccept <- nrow(new.res) / n
  n <- n - nrow(res)
}
我们注意到,反相关性明显弱于预期。这是由于你的情况。如果我们通过将
compute.tr.t
修改为删除此条件:

compute.tr.t <- function(n, paccept) {
  n <- round(n / paccept)
  rawvars <- mvrnorm(n, mu=mu, Sigma=Sigma)
  pvars <- pnorm(rawvars)
  tr <- qexp(pvars[,1], 1/1)
  t <- qexp(pvars[,2], 1/2)
  return(data.frame(t=t,tr=tr))
}

这种相关性现在更为合理,但无效病例的数量非常显著。

感谢您对问题所在的明确解释和指示。虽然相关性没有被精确地再现,但我可以通过调节rho来获得所需的相关性。非常感谢。一个问题是结果数据有时包含的数据少于所需的样本数。@BlainWaan:您是说while循环在生成符合您条件的n个样本之前完成?是的,但现在我已经能够解决这个问题。谢谢你的帮助@BlainWaan:只是想让你知道,有一种低概率的边缘情况,
n
compute.tr.t <- function(n, paccept) {
  n <- round(n / paccept)
  rawvars <- mvrnorm(n, mu=mu, Sigma=Sigma)
  pvars <- pnorm(rawvars)
  tr <- qexp(pvars[,1], 1/1)
  t <- qexp(pvars[,2], 1/2)
  return(data.frame(t=t,tr=tr))
}
print(cor(res$tr,res$t))
##[1] -0.3814602
print(sum(res$tr>res$t)) # shows number of invalid cases
##[1] 3676