如何使用`cor.test`来确定特定列的相关性?

时间:2015-06-01 12:28:37

标签: r correlation

我有以下数据示例:

A<-rnorm(100)
B<-rnorm(100)
C<-rnorm(100)

v1<-as.numeric(c(1:100))
v2<-as.numeric(c(2:101))
v3<-as.numeric(c(3:102))
v2[50]<-NA
v3[60]<-NA
v3[61]<-NA

df<-data.frame(A,B,C,v1,v2,v3)

正如您所见,df在第5列中有1个NA,在第6列中有2个NA。 现在我想一方面建立col1和3的相关矩阵,另一方面建立col2,4,5,6。在R中使用cor函数:

cor(df[ , c(1,3)], df[ , c(2,4,5,6)], use="complete.obs")

#             B         v1         v2         v3
# A -0.007565203 -0.2985090 -0.2985090 -0.2985090
# C  0.032485874  0.1043763  0.1043763  0.1043763

这很有效。然而,我想要估计和p.value,因此我切换到cor.test。

cor.test(df[ ,c(1,3)], df[ , c(2,4,5,6)], na.action = "na.exclude")$estimate

这不起作用,因为'x'和'y'必须具有相同的长度。 实际上,无论数据中是否存在NA,都会发生此错误。似乎cor.test不理解(与cor不同)关联特定列的请求。有没有解决这个问题的方法?

1 个答案:

答案 0 :(得分:3)

您可以使用X在所有列对之间执行测试。此处Ydf是从outer(df[, c(1,3)], df[, c(2,4,5,6)], function(X, Y){ mapply(function(...) cor.test(..., na.action = "na.exclude")$estimate, X, Y) }) 扩展而来的数据框,每个数据框由8列组成。

cor

您甚至可以在与 B v1 v2 v3 A 0.07844426 0.01829566 0.01931412 0.01528329 C 0.11487140 -0.14827859 -0.14900301 -0.15534569 相同的表单上获得输出:

<?php

$first_array = array(...);
$second_array = array(...);

// Anonymous function to extract the IDskills from the second array:
$get_IDs = function($element) {
    return($element->IDskill);
};

// Array of (just) IDskills of the second array:
$IDs = array_map($get_IDs, array_filter($second_array, function($element) {
    // Anonymous function to filter $second_array elements without IDskill:
    return(isset($element->IDskill));
}));

// Another anonymous function that returns a new array with elements from
// $first_array with the new MATCH property.
// use(&$IDs) makes $IDs available inside the function scope:
$check_match = function($element) use(&$IDs) {

    // We use clone because we don't want to modify the original array values:
    $match_element = clone $element;

    if(isset($match_element->ID))
        $match_element->MATCH = in_array($match_element->ID, $IDs);
    else
        $match_element->MATCH = false;

    return($match_element);
};

$match = array_map($check_match, $first_array);

?>