Ошибка: nrow(ref) и nrow(target) должны быть> 0?
Основываясь на Unable to writeRaster для сигнатуры "rasterPCA", "персонаж", я получил два растра, которые являются PC1 и PC2 группы климатических переменных. Тем не менее, независимо от наличия одинакового экстента и разрешения, количество ячеек в моей глобальной среде различается при загрузке в R.
Ниже приведен код, который я использую, взятый из приложения Hamann et al., 2015, и я получаю эту ошибку:
library(SDMTools) # install package to read and write ESRI ASCII grids
library(yaImpute) # install package for k-nearest neighbour (kNN) search
lg1 <- asc2dataframe("C:\\Users\\rameshv\\LGM\\4_PCAforR\\PC_1.asc") # principal component grids
lg2 <- asc2dataframe("C:\\Users\\rameshv\\LGM\\4_PCAforR\\PC_2.asc")
present1 <-asc2dataframe("C:\\Users\\rameshv\\Present\\4_PCAforR\\PC_1.asc")
present2 <- asc2dataframe("C:\\Users\\rameshv\\Present\\4_PCAforR\\PC_2.asc")
idxy <- cbind(id=1:nrow(lg1),lg1[,1:2]) # data frame of IDs and XY coords
b <- (max(lg1$var.1)-min(lg1$var.1))/120 # bin size for 120 PC1 bins
l1 <- round(lg1$var.1/b) # convert PC1 to 120 bins via rounding
l2 <- round(lg2$var.1/b) # convert PC2 to <120 bins via rounding
p1 <- round(present1$var.1/b) # same for present PC1
p2 <- round(present2$var.1/b) # same for present PC2
l <- paste(l1,l2) # PC1/PC2 combinations in LGM climate
p <- paste(p1,p2) # PC1/PC2 combinations in present climate
u <- unique(p)[order(unique(p))] # list of unique PC1/PC2 combinations
sid <- c() # empty vector for source IDs
tid <- c() # empty vector for target IDs
d <- c() # empty vector for distances
for(i in u){ # loop for each unique PC1/PC2 combination
lxy <- idxy[which(l==i),] # coordinates of i-th combination in LGM
pxy <- idxy[which(p==i),] # coordinates of i-th combination in present
sid <- c(sid, lxy$id) # append i-th PC1/PC2 combination to previous
if(nrow(pxy)>0){ # kNN search unless no-analogue climate
knn <- data.frame(ann(as.matrix(pxy[,-1]), as.matrix(lxy[,-1]), k=1)$knnIndexDist)
tid <- c(tid, pxy[knn[,1],"id"]) # the IDs of the closest matches
d <- c(d, sqrt(knn[,2])) # their corresponding geographic distances
}
else { # else statement for no-analogue climates
tid <- c(tid, rep(NA,nrow(lxy))) # flag destinations as missing for no analogues
d <- c(d, rep(Inf,nrow(lxy))) # flag distances as infinity for no analogues
}
}
В конце цикла for я получаю ошибку ниже:
Error in ann(as.matrix(pxy[, -1]), as.matrix(lxy[, -1]), k = 1) :
error: nrow(ref) and nrow(target) must be > 0
Я не уверен, что эта ошибка связана с разницей в количестве ячеек? Какие-либо предложения?
РЕДАКТИРОВАТЬ:
Основываясь на комментарии Бастиена, я исследовал структуру и получаю следующее:
> str(as.matrix(pxy[,-1]))
num [1:27, 1:2] 8.1 8.14 8.22 8.97 9.01 ...
- attr(*, "dimnames")=List of 2
..$ : chr [1:27] "1" "8" "33" "583" ...
..$ : chr [1:2] "y" "x"
> str(as.matrix(lxy[,-1]))
logi[0 , 1:2]
- attr(*, "dimnames")=List of 2
..$ : NULL
..$ : chr [1:2] "y" "x"
Предложения?
1 ответ
LoBu правильно, что ваш lxy
массив пуст. Непонятно, где это пошло не так - возможно, ваш PCA вышел из строя, расчет размера корзины b
возможно, не удалось. Ваш pxy
фрейм данных также слишком короткий, если вы пытаетесь сопоставить бинарные значения климата, как в Hamann et al. 2015. Не видя ваших данных близко, невозможно сказать, как решить эту проблему - я бы порекомендовал проверить ваши результаты PCA и соответствующие климатические растры.
Насколько велика ваша область обучения? Приложение 3 является безусловно самым сложным климатическим аналоговым методом. Я бы предложил попробовать Приложение 2, которое работает медленнее, но работает отлично, если вы не работаете с высоким разрешением. Вот код, для быстрого ознакомления.
library(SDMTools) # install package to read and write ESRI ASCII grids
present <- asc2dataframe("C:\Your Path\MAT6190.asc")
future <- asc2dataframe("C:\Your Path\MAT2020s.asc")
t <- 0.25 # plus/minus threshold to define climate match
t <- 1/(t*2) # inverse for rounding, double for plus/minus
x <- present$x # vector of grid cell x coordinates
y <- present$y # vector of grid cell y coordinates
p <- round(present$var.1*t)/t # vector of rounded present climate values
f <- round(future$var.1*t)/t # vector of rounded future climate values
d <- vector(length=length(p)) # empty vector to write distance to climate match
u <- unique(p)[order(unique(p))] # list of unique climate values in p
match <- function(u){c(which(u==f))} # function finding climate matches of u with f
m <- sapply(u, match) # list of climate matches for unique values
for(i in 1:length(p)){ # loop for all grid cells of p
mi <- m[[which(u==p[i])]] # recalls list of climate matches for p[i]
d[i] <- sqrt(min((x[i]-x[mi])^2 + (y[i]-y[mi])^2)) # distance to closest match
}
# writes out log10 speed and distance multiplied by 100 in ESRI ASCII format
# conversion: -200=0.01km, -100=0.1km, 0=1km, 100=10km, 200=100km etc.
d[d==Inf] <- 100000 # sets no analogue to 10,000km
out=cbind(y,x,logDist=round(log10(d)*100),logSpeed=round(log10(d/50)*100))
dataframe2asc(out)