【问题标题】:Programming a Bivariate Normal CDF in R在 R 中编程二元正态 CDF
【发布时间】:2011-06-03 17:51:57
【问题描述】:

我有一个关于在 R 中编写包含二元正态 CDF 的函数的问题。我尝试编写的函数需要一个二元正态 CDF,应根据观察结果进行不同的计算。具体来说,根据某个变量的值,相关性应该在正负之间“切换”,但调用中应该没有差异。

这种风格的函数已在 LIMDEP 中编码,我正在尝试复制它,但无法让它在 R 中工作。LIMDEP 中计算二元正态 CDF 的命令是“BVN(x1, x2 , r)",它明确需要用于计算的两个变量 (x1, x2) 和相关性 (r)。 LIMDEP 使用 Gauss-Laguerre 15 点求积来计算二元正态 CDF。

在 R 中,似乎有两个包计算多元正态 CDF。我一直在尝试使用 Genz 方法的 mnormt 包(虽然也有 mvtnorm 包——我没有看到主要区别),这似乎是相似的,但比使用的 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

感谢您的帮助!

【问题讨论】:

  • 那么到底是什么不适合您?你说命令 pmnorm(),需要格式:pmnorm(data, mean, varcov),我无法为相关切换编写代码。
  • 每次我尝试在似然函数中编写 var/cov 矩阵时,它都不会以与底层分布一致的方式正确收集值。例如,如果 A=0,那么相关性应该是负的,但如果 A=1,它应该是正的,并且根据每个观察结果而变化。我认为答案可以帮助我,让我比以前更接近!
  • 您是否将进一步的计算从 LIMDEP/NLOGIT 转移到 R?

标签: r statistics


【解决方案1】:

听起来您所需要的只是 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 中一样?不会有太大的不同。

【讨论】:

  • 非常感谢。我对 R 还是比较陌生,我了解基本内容的“应用”内容,但不知道它们在函数中有用(就高效编码而言)。我认为这将提供我修复代码所需的内容。需要确定的一个问题:这些类型的函数可以在其他函数中正确吗?
  • 我不确定 'apply' 是否比您编写的 'for' 版本好得多。是的,一旦你初始化函数(IE 运行第 1:14 行),你就可以在另一个函数中调用它(第 18 行)。
  • 好吧,我们会看看情况如何。它现在正在运行。优化例程需要一些时间,因此代码可能效率不高,但我们将是下一步。首先,我需要确保它有效!我将看看“已知”数据和参数的结果如何。感谢您的帮助。
猜你喜欢
  • 2017-03-20
  • 1970-01-01
  • 2012-12-20
  • 1970-01-01
  • 2018-04-22
  • 1970-01-01
  • 2015-08-14
  • 2012-06-21
  • 2020-02-22
相关资源
最近更新 更多