# Functions to calculate correlation and corresponding p-values. Geared towards cor p-values of large
# matrices where varying numbers of missing data make the number of observations vary for each pair of
# columns.
corAndPvalue = function(x, y = NULL,
use = "pairwise.complete.obs",
alternative = c("two.sided", "less", "greater"),
...)
{
ia = match.arg(alternative);
cor = cor(x, y, use = use, ...);
x = as.matrix(x);
finMat = !is.na(x)
if (is.null(y))
{
np = t(finMat) %*% finMat;
} else {
y = as.matrix(y);
np = t(finMat) %*% (!is.na(y));
}
Z = 0.5 * log( (1+cor)/(1-cor) ) * sqrt(np-2);
if (ia=="two.sided")
{
T = sqrt(np - 2) * abs(cor)/sqrt(1 - cor^2)
p = 2*pt(T, np - 2, lower.tail = FALSE);
} else if (ia=="less")
{
T = sqrt(np - 2) * cor/sqrt(1 - cor^2)
p = pt(T, np - 2, lower.tail = TRUE)
} else if (ia=="greater")
{
T = sqrt(np - 2) * cor/sqrt(1 - cor^2)
p = pt(T, np - 2, lower.tail = FALSE)
}
list(cor = cor, p = p, Z = Z, t = T, nObs = np);
}
bicorAndPvalue = function(x, y = NULL, use = "pairwise.complete.obs",
alternative = c("two.sided", "less", "greater"),
...)
{
ia = match.arg(alternative);
cor = bicor(x, y, use = use, ...);
x = as.matrix(x);
finMat = !is.na(x)
if (is.null(y))
{
np = t(finMat) %*% finMat;
} else {
y = as.matrix(y);
np = t(finMat) %*% (!is.na(y));
}
Z = 0.5 * log( (1+cor)/(1-cor) ) * sqrt(np-2);
if (ia=="two.sided")
{
T = sqrt(np - 2) * abs(cor)/sqrt(1 - cor^2)
p = 2*pt(T, np - 2, lower.tail = FALSE);
} else if (ia=="less")
{
T = sqrt(np - 2) * cor/sqrt(1 - cor^2)
p = pt(T, np - 2, lower.tail = TRUE)
} else if (ia=="greater")
{
#Z = 0.5 * log( (1+cor)/(1-cor) ) * sqrt(np-3);
T = sqrt(np - 2) * cor/sqrt(1 - cor^2)
p = pt(T, np - 2, lower.tail = FALSE)
}
list(bicor = cor, p = p, Z = Z, t = T, nObs = np);
}
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.