2017-03-08 2 views
0

Basé sur Unable to writeRaster for signature "rasterPCA", "character", j'ai obtenu deux rasters qui sont PC1 et PC2 d'un tas de variables climatiques. Cependant, indépendamment de la même étendue et de la même résolution, le nombre de cellules diffère dans mon environnement global, lorsqu'il est chargé dans R.erreur: nrow (ref) et nrow (cible) doivent être> 0?

Ci-dessous le code que j'utilise, qui est de l'annexe de Hamann et al., 2015 et je reçois cette erreur:

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 
} 
} 

a la fin de la boucle, je reçois l'erreur suivante:

Error in ann(as.matrix(pxy[, -1]), as.matrix(lxy[, -1]), k = 1) : 
error: nrow(ref) and nrow(target) must be > 0 

Je ne sais pas si cette erreur a quelque chose à voir avec la différence en nombre de cellules? Aucune suggestion?

EDIT:

Basé sur le commentaire de Bastien, j'ai étudié la structure et je reçois ceci:

> 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" 

Suggestions?

+0

l'erreur est dans 'ann' fonction de yaImpute qui disent que soit votre ref ou votre ensemble cible sont de taille 0. Run str (as.matrix (pxy [-1]))' et 'str (as.matrix (lxy [, -1]))' pour être sûr que la structure est ok. Vous pouvez avoir un problème plus haut dans votre gestion de données – Bastien

+0

@Bastien C'est intéressant. Tu as raison. Je reçois ce qui précède actuellement. Ajouté aux modifications. Voir au dessus. –

+0

Avez-vous vérifié ce que vous avez dans 'l1' et' l2'? – lbusett

Répondre

0

LoBu est correct que votre tableau lxy est vide. Il n'est pas clair où cela s'est mal passé - votre PCA a peut-être échoué, le calcul de la taille de votre bac de b a peut-être échoué. Votre base de données pxy est également beaucoup trop courte, si vous essayez de faire correspondre des valeurs climatiques binned comme dans Hamann et al. 2015. Sans voir vos données de près, il n'est pas possible de dire comment résoudre ce problème - je vous recommande de vérifier vos sorties PCA et les rasters climatiques sous-jacents.

Quelle est la taille de votre zone d'étude? L'Appendice 3 est de loin la méthode analogique climatique la plus compliquée. Je suggère d'essayer l'annexe 2, qui est plus lente mais fonctionne très bien si vous ne travaillez pas en haute résolution. Voici le code, pour une référence rapide.

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) 
+0

Merci @QBarber. Voici la chose. J'ai plusieurs variables climatiques et la résolution n'est pas très élevée. C'est environ 5 km par 5 km. Fondamentalement le code courant de l'annexe 2 serait fait une seule variable à la fois droite? Comment vous «moyenne» sur toutes les prédictions de la vitesse du climat alors?De plus, en ce qui concerne les PCA et la taille des bacs, cela fonctionne bien pour moi. La seule différence entre vos données d'échantillon et mes données est que j'ai environ 50 000 éléments, et vous avez commencé avec 815345 nombre d'éléments. Est-ce important? –

+0

Seriez-vous prêt à jeter un oeil aux données Quinn? Je peux vous l'envoyer par courriel. –

+0

J'ai commencé à travailler. Il semble y avoir eu une erreur mineure dans ma boucle for :) –