Есть ли функция для вычисления p-значения растров методом Спирмена?

Мне не удается вычислить значение p для корреляции Спирмена для серии из нескольких растров. Я создал код для корреляции Спирмена. Это работает, но если я хочу показать мне значение p, используя cor.test(), у меня возникает ошибка.

Воспроизводимый пример использования растра с 6 слоями для вычисления корреляции между ячейками слоев 1,2,3 и 4,5,6.

library(raster)
set.seed(89)
z <- brick(nrow=10, ncol=10, nl=6)
values(z) <- runif(600)

### Spearman correlation 
r <- calc(z, fun=function(x) cor(x[1:3], x[4:6], method='spearman'))

### p-value -- here I have the error
r.pvalue <- calc(z, fun=function(x) cor.test(x[1:3], x[4:6], method='spearman'))
#Error in setValues(out, x) : 
#  values must be numeric, integer, logical or factor

person Alex.V    schedule 16.11.2020    source источник
comment
Не могли бы вы отредактировать свой вопрос и предоставить минимальный, автономный, воспроизводимый пример?   -  person Robert Hijmans    schedule 16.11.2020
comment
Привет, Роберт. Был сделан воспроизводимый пример.   -  person Alex.V    schedule 16.11.2020
comment
Спасибо, еще больше упростил.   -  person Robert Hijmans    schedule 17.11.2020


Ответы (1)


Функция, используемая в calc, должна возвращать число (или числа). cor возвращает число, а cor.test нет.

cor(1:3, 3:1)
#[1] -1

x <- cor.test(1:3, 3:1)
class(x)
#[1] "htest"
x
#        Pearson's product-moment correlation
#
#data:  1:3 and 3:1
#t = -Inf, df = 1, p-value < 2.2e-16
#alternative hypothesis: true correlation is not equal to 0
#sample estimates:
#cor 
# -1 

Итак, нам нужно извлечь значение p из объекта, возвращаемого cor.test. Если вы посмотрите на ?cor.test или осмотрите str(x), вы увидите, что можете использовать

cor.test(1:3, 3:1)$p.value
#[1] 0

И таким образом вы можете сделать

r.pvalue <- calc(z, fun=function(x) cor.test(x[1:3], x[4:6], method='spearman')$p.value)
person Robert Hijmans    schedule 16.11.2020