簡體   English   中英

cor.test 中的柵格相關性和 p 值

[英]Raster correlation and p-values from cor.test

我正在嘗試使用corcor.test兩個光柵磚之間的像素級相關性和顯着性(p 值)。 我的數據在這里:

它們都相當小,總共不到 2MB。

我在之前關於 StackOverflow 和 r-sig-geo 的討論中發現了以下兩個代碼(均來自 Robert Hijmans):

#load data
require(raster)
sa <- brick("rain.grd")
sb <- brick("pet.grd")

# code 1
funcal <- function(xy) {
    xy <- na.omit(matrix(xy, ncol=2))
    if (ncol(xy) < 2) {
        NA
    } else {
        cor(xy[, 1], xy[, 2])
    }
}
s <- stack(sa, sb)
calc(s, funcal)
# code 2
stackcor <- function(s1, s2, method='spearman') { 
        mycor <- function(v) { 
                x <- v[1:split] 
                y <- v[(split+1):(2*split)] 
                cor(x, y, method=method) 
        } 
        s <- stack(s1, s2) 
        split <- nlayers(s)/2 
        calc(s, fun=mycor ) 
} 

兩個代碼都按預期使用cor函數生成相關網格。 但是,我嘗試用cor.test替換cor以提取 p 值:

# using the first code
funcal <- function(xy) {
    xy <- na.omit(matrix(xy, ncol=2))
    if (ncol(xy) < 2) {
        NA
    } else {
        cor.test(xy[, 1], xy[, 2],method="pearson")$p.value
    }
}
s <- stack(sa, sb)
calc(s, funcal)

我遇到了以下錯誤(在 RStudio 中有引用):

Error in cor.test.default(xy[, 1], xy[, 2], method = "pearson") : 
  not enough finite observations 
8 stop("not enough finite observations") 
7 cor.test.default(xy[, 1], xy[, 2], method = "pearson") 
6 cor.test(xy[, 1], xy[, 2], method = "pearson") 
5 FUN(newX[, i], ...) 
4 apply(v, 1, fun) 
3 .local(x, fun, ...) 
2 calc(meistack, brick.cor.pval) 
1 calc(meistack, brick.cor.pval) 

在之前的 r-sig-geo 討論中,用戶曾詢問過此錯誤,但未得到答復。 所以我再次詢問並收到了對我的詢問的回復,其中一位用戶指出cor能夠輸入矩陣而cor.test不能,但即使在將數據轉換為數字向量之后:

cor.pval <- function(xy) { # Pearson product moment correlation
  xy <- na.omit(as.matrix(xy, ncol=2))
  x <- xy[,1:11]
  y <- xy[,12:22]
  #  if (ncol(xy) < 2) {
   # NA
  #} else {
    cor.test(x[1,], y[1,])$p.value
  #}
}
calc(s, cor.pval)

我面臨以下錯誤:

Error in .calcTest(x[1:5], fun, na.rm, forcefun, forceapply) : 
  cannot use this function

我想知道是否有人可以幫助解決這個問題?

我的 sessionInfo() 如下:

R version 3.0.1 (2013-05-16)
Platform: x86_64-w64-mingw32/x64 (64-bit)

locale:
[1] LC_COLLATE=English_United States.1252  LC_CTYPE=English_United States.1252   
[3] LC_MONETARY=English_United States.1252 LC_NUMERIC=C                          
[5] LC_TIME=English_United States.1252    

attached base packages:
[1] grid      stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
 [1] car_2.0-18          nnet_7.3-7          MASS_7.3-29         rgdal_0.8-11       
 [5] plyr_1.8            rasterVis_0.21      hexbin_1.26.2       latticeExtra_0.6-26
 [9] RColorBrewer_1.0-5  lattice_0.20-23     raster_2.1-49       maptools_0.8-27    
[13] sp_1.0-13          

loaded via a namespace (and not attached):
[1] foreign_0.8-55 tools_3.0.1    zoo_1.7-10    

謝謝!

使用raster包中的corLocal函數。

corLocal(堆棧1,堆棧2,測試= T)

返回的結果是具有兩層的 rasterBrick,第一個 'r' 值和第二個 p.value 在此處輸入圖片說明

此處的區別在於,它們與空向量的行為不同。

cor(numeric(0), numeric(0))
# -> NA
cor.test(numeric(0), numeric(0))
#->   Error in cor.test.default(numeric(0), numeric(0)) : 
#       not enough finite observations

您的na.omit似乎可以從某些組合中刪除所有記錄。 現在,您只需要檢查列數,還應該檢查是否有行。

這個

funcal <- function(xy) {    
    xy <- na.omit(matrix(xy, ncol=2))
    if (ncol(xy) < 2 | nrow(xy)<1) {
        NA
    } else {
        cor.test(xy[, 1], xy[, 2], method="pearson")$p.value
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM