2016-06-09 1 views

ответ

4

В настоящее время в Rcpp отсутствует функция fisher.test. Конкретный component of the test в функции R записывается в C из-за его вычислительной интенсивности. Вы более чем можете переопределить тест в Rcpp.

Несколько примечаний на этом, однако, нет изображения factor в объекте SEXP. Таким образом, factor не поддерживает Rcpp. В результате вам придется преобразовать объект в тип integer или character, прежде чем передавать его на C++.

Чтобы использовать его для Rcpp, вам нужно будет вызвать функцию fisher.test R из C++. То есть вам придется перенести данные обратно в 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) 

*/ 

Примечание функция каст возвращает объекты в виде списка под:

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]; 

И так далее ...