在R中编程双变量正常CDF

时间:2011-06-03 17:51:58

标签: r statistics

我有一个关于在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

感谢您的帮助!

1 个答案:

答案 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中一样?它没有太大的不同。