我有一个关于在R中编码包含双变量正常CDF的函数的问题。我尝试编码的函数需要一个双变量正常CDF,应该根据观察结果进行不同的计算。具体来说,根据某个变量的值,相关性应该在正面和负面之间“切换”,但是在呼叫中应该没有差别。
这种功能的样式已在LIMDEP中编码,我正在尝试复制它,但无法让它在R中工作.LIMDEP中用于计算双变量正常CDF的命令是“BVN(x1,x2) ,r)“,它明确要求用于计算的两个变量(x1,x2)和相关性(r)。 LIMDEP使用Gauss-Laguerre 15点积分来计算双变量正常CDF。
在R中,似乎两个包计算多变量正常CDF。我一直在尝试mnormt包(虽然有mvtnorm包也没有看到 - 但我没有看到主要的区别)使用Genz方法,它看起来很相似,但比使用的Gauss-Laguerre 15求积法更通用在LIMDEP中(参考?pmnorm下的论文)。
每次我尝试使用mnormt包时,命令pmnorm()都需要以下形式:pmnorm(data,mean,varcov),我无法对相关切换进行编码。
任何想法如何让这个工作?
这是一个简单的代码示例,用于解释我在谈论我想做什么(除了没有for循环的函数内部):
library(mnormt)
A <- c(0,1, 1, 1, 0, 1, 0, 1, 0, 1)
q <- 2*A-1
set.seed(1234)
x <- rnorm(10)
y <- rnorm(10, 2, 2)
#Need to return a value of the CDF for each row of data:
cdf.results <- 0
for(i in 1:length(A)){
vc.mat <- matrix(c(1, q[i]*.7, q[i]*.7, 1.3), 2, 2)
cdf.results[i] <- pmnorm(cbind(x[i], y[i]), c(0, 0), vc.mat)
}
cdf.results
感谢您的帮助!
答案 0 :(得分:2)
听起来你只需要1)使你的脚本成为一个函数,这样它就可以应用于任意的x,y和q和2)来摆脱for循环。如果是这种情况?function
,则?apply
应该为您提供所需的内容。
BVN=function(x,y,q) {
cdf.results=apply(cbind(x,y,q),1,FUN=function(X)
{
x=X[1]
y=X[2]
q=X[3]
vc.mat <- matrix(c(1, q*.7, q*.7, 1.3), 2, 2)
pmnorm(cbind(x, y), c(0, 0), vc.mat)
# I think you may want c(0,2) but not sure
}
)
cdf.results
}
BVN(x,y,q)
这里x,y和q是你上面写的。也许你想要函数采用矩阵r,就像在limdep中一样?它没有太大的不同。