【问题标题】:Rcpp: Is there an implementation fisher.test() in Rcpp [closed]Rcpp:Rcpp中是否有实现fisher.test()[关闭]
【发布时间】:2016-06-09 22:38:14
【问题描述】:

Rcpp 是否有fisher.test 的实现?

【问题讨论】:

  • fisher.test 已经在 c 中实现
  • @rawr 如何在 Rcpp 中调用它?

标签: r rcpp


【解决方案1】:

Rcpp 中没有fisher.test 函数的当前实现。由于计算强度,R 函数中的特定component of the test 是用 C 编写的。非常欢迎您在 Rcpp 中重新实现测试。

对此有几点说明,factor 对象中没有 factor 的表示形式。因此,factor 不是 Rcpp 支持的东西。因此,您必须先将对象转换为 integercharacter 类型,然后再将其传递给 C++。

为了将它用于 Rcpp,您必须从 C++ 调用 fisher.test R 函数。也就是说,您必须将数据传输回 R。

例如

#include <Rcpp.h>

//' @title Accessing R's fisher.test function from Rcpp
// [[Rcpp::export]]
Rcpp::List fisher_test_cpp(const Rcpp::NumericMatrix& x, double conf_level = 0.95){

  // Obtain environment containing function
  Rcpp::Environment base("package:stats"); 

  // Make function callable from C++
  Rcpp::Function fisher_test = base["fisher.test"];    

  // Call the function and receive its list output
  Rcpp::List test_out = fisher_test(Rcpp::_["x"] = x,
                                    Rcpp::_["conf.level"]  = conf_level);

  // Return test object in list structure
  return test_out;
}

/***R

Job = matrix(c(1,2,1,0, 3,3,6,1, 10,10,14,9, 6,7,12,11), 4, 4,
              dimnames = list(income = c("< 15k", "15-25k", "25-40k", "> 40k"),
                              satisfaction = c("VeryD", "LittleD", "ModerateS", "VeryS")))
fisher.test(Job)

fisher_test_cpp(Job)

*/

注意cpp函数以列表形式返回对象:

List of 7
 $ p.value    : num 0.783
 $ alternative: chr "two.sided"
 $ method     : chr "Fisher's Exact Test for Count Data"
 $ data.name1 : chr "structure(c(1, 2, 1, 0, 3, 3, 6, 1, 10, 10, 14, 9, 6, 7, 12, "
 $ data.name2 : chr "11), .Dim = c(4L, 4L), .Dimnames = structure(list(income = c(\"< 15k\", "
 $ data.name3 : chr "\"15-25k\", \"25-40k\", \"> 40k\"), satisfaction = c(\"VeryD\", \"LittleD\", "
 $ data.name4 : chr "\"ModerateS\", \"VeryS\")), .Names = c(\"income\", \"satisfaction\")))"
 - attr(*, "class")= chr "htest"

可以使用以下方式访问这些值:

 double p_value = test_out[0];
 std::string alternative = test_out[1];
 std::string method = test_out[2];

等等……

【讨论】:

  • 如何修改它以接受因子向量矩阵作为x(每列是一个向量)并循环遍历每个向量?我的C++知识不多,但是需要在class big.matrix的每一列上计算fisher.test,只能通过Rcpp访问,同时维护class big.matrix。我也将y 作为因子向量存储在 R 中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-29
  • 1970-01-01
  • 2011-11-14
  • 2011-10-12
  • 2017-01-08
相关资源
最近更新 更多