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