library(prospectr)
library(resemble)
library(ggplot2)
library(gridExtra)

1. Load Data


load("IS_Refl.rda") #"observed" spectra
load("G_Refl.rda")  #reference spectra

IS_Refl[1:3, 1:5] #"observed" spectra
                  Reflectance.350 Reflectance.351 Reflectance.352 Reflectance.353 Reflectance.354
IS-03.IS-03_01a.1      0.07266829      0.06986278      0.06873384      0.07570227      0.07288244
IS-03.IS-03_01a.2      0.06574845      0.06434544      0.06420722      0.06560403      0.06362657
IS-03.IS-03_01a.3      0.09143127      0.09247673      0.09320479      0.09260173      0.09185399
G_Refl[1:3, 1:5]  #reference spectra
          Reflectance.350 Reflectance.351 Reflectance.352 Reflectance.353 Reflectance.354
rh01_core      0.06313507      0.06242771      0.06323991      0.06122314      0.06041997
rh01_rim       0.07792549      0.07626121      0.07553060      0.07374593      0.07261300
rh02_core      0.11810216      0.11717834      0.11674443      0.11524004      0.11522657
#Just to get the wavelength values:
load("gsli.lf.rda")
a <- gsli.lf[gsli.lf$Sample=="rh01_core",]
wl <-a$Wavelength
rm(a)

2.Calculate PCA dissimilarity

dsm_pca <- dissimilarity(
  Xr = IS_Refl, Xu = G_Refl,
  diss_method = c("pca"),
  gh = FALSE,
  pc_selection = list("cumvar", 0.99),
  return_projection = TRUE)

Calculate 1st nearest neighbor of each IS_Refl spectrum to each G_Refl spectrum

knn_pc <- search_neighbors(Xr = G_Refl, Xu = IS_Refl,
                           diss_method = c("pca"),
                           k = 1,
                           pc_selection = list("cumvar", 0.99),
                           scale = TRUE)
hist(knn_pc$neighbors_diss)

knn.pc.df <- data.frame(point.index=1:nrow(IS_Refl),
                        point=rownames(IS_Refl),
                        GNN.index=as.vector(knn_pc$neighbors),
                        GNN=rownames(G_Refl)[as.vector(knn_pc$neighbors)],
                        GNN.diss=as.vector(knn_pc$neighbors_diss))

3.Calculate Correlation dissimilarity

knn_c <- search_neighbors(Xr = G_Refl, Xu = IS_Refl,
                          diss_method = c("cor"),
                          k = 1,
                          scale = TRUE)
hist(knn_c$neighbors_diss)

knn.c.df <- data.frame(point.index=1:nrow(IS_Refl),
                       point=rownames(IS_Refl),
                       GNN.index=as.vector(knn_c$neighbors),
                       GNN=rownames(G_Refl)[as.vector(knn_c$neighbors)],
                       GNN.diss=as.vector(knn_c$neighbors_diss))

4.Display couples of most similar spectra

We select the couples with maximum and minimum dissimilarity, and 13 more randomly selected couples for each dissimilarity metric

4.1 PCA dissimilarity

knn.df <- knn.pc.df
metric <- "PCdissim"

knn.sel <- rbind(knn.df[which.min(knn.df$GNN.diss),],
                 knn.df[which.max(knn.df$GNN.diss),],
                 knn.df[sample(1:nrow(knn.df),13),])
knn.sel <- knn.sel[order(knn.sel$GNN.diss),]

l <- list(1:nrow(knn.sel))
for (i in 1:nrow(knn.sel)){
  df= data.frame(Wavelength=wl, 
                 IS.Refl= IS_Refl[knn.sel$point.index[i],],
                 G.Refl= G_Refl[knn.sel$GNN.index[i],])
  g <- ggplot(data=df) +
    geom_line(aes(x=Wavelength,y=IS.Refl),color="red") +
    geom_line(aes(x=Wavelength,y=G.Refl),color="blue") +
    ggtitle(paste(knn.sel$point[i], knn.sel$GNN[i],round(knn.sel$GNN.diss[i],3)))
  l[[i]] <- g
}
grid.arrange(grobs=l,ncol=3,nrow=5)

4.2 Correlation dissimilarity


knn.df <- knn.c.df
metric <- "Correlation"

knn.sel <- rbind(knn.df[which.min(knn.df$GNN.diss),],
                 knn.df[which.max(knn.df$GNN.diss),],
                 knn.df[sample(1:nrow(knn.df),13),])
knn.sel <- knn.sel[order(knn.sel$GNN.diss),]

l <- list(1:nrow(knn.sel))
for (i in 1:nrow(knn.sel)){
  df= data.frame(Wavelength=wl, 
                 IS.Refl= IS_Refl[knn.sel$point.index[i],],
                 G.Refl= G_Refl[knn.sel$GNN.index[i],])
  g <- ggplot(data=df) +
    geom_line(aes(x=Wavelength,y=IS.Refl),color="red") +
    geom_line(aes(x=Wavelength,y=G.Refl),color="blue") +
    ggtitle(paste(knn.sel$point[i], knn.sel$GNN[i],round(knn.sel$GNN.diss[i],3)))
  #print(g)
  l[[i]] <- g
  #readline("Waiting...")
}
grid.arrange(grobs=l,ncol=3,nrow=5)

In both cases, I do not see a clear relationship between dissimiarity values and the visual inspection the couples of spectra.

LS0tCnRpdGxlOiAiQ2FsY3VsYXRlIGFuZCBEaXNwbGF5IGRpc3NpbWlsYXJpdHkgYmV0d2VlbiAyIHNldHMgb2YgUmVmbGVjdGFuY2Ugc3BlY3RyYSIKb3V0cHV0OgogIGh0bWxfbm90ZWJvb2s6IAogIGNvZGVfZm9sZGluZzogc2hvdwpmaWdfY2FwdGlvbjogeWVzCi0tLQoKLSAgIFtBZ3VzdGluLkxvYm9cQGdlbzNiY24uY3NpYy5lc10obWFpbHRvOkFndXN0aW4uTG9ib0BnZW8zYmNuLmNzaWMuZXMpey5lbWFpbH0KLSAgIDIwMjMxMTA3CgpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpsaWJyYXJ5KHByb3NwZWN0cikKbGlicmFyeShyZXNlbWJsZSkKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KGdyaWRFeHRyYSkKYGBgCgojIyAxLiBMb2FkIERhdGEKCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9Cgpsb2FkKCJJU19SZWZsLnJkYSIpICMib2JzZXJ2ZWQiIHNwZWN0cmEKbG9hZCgiR19SZWZsLnJkYSIpICAjcmVmZXJlbmNlIHNwZWN0cmEKCklTX1JlZmxbMTozLCAxOjVdICMib2JzZXJ2ZWQiIHNwZWN0cmEKR19SZWZsWzE6MywgMTo1XSAgI3JlZmVyZW5jZSBzcGVjdHJhCgojSnVzdCB0byBnZXQgdGhlIHdhdmVsZW5ndGggdmFsdWVzOgpsb2FkKCJnc2xpLmxmLnJkYSIpCmEgPC0gZ3NsaS5sZltnc2xpLmxmJFNhbXBsZT09InJoMDFfY29yZSIsXQp3bCA8LWEkV2F2ZWxlbmd0aApybShhKQpgYGAKCiMjIDIuQ2FsY3VsYXRlIFBDQSBkaXNzaW1pbGFyaXR5CgpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpkc21fcGNhIDwtIGRpc3NpbWlsYXJpdHkoCiAgWHIgPSBJU19SZWZsLCBYdSA9IEdfUmVmbCwKICBkaXNzX21ldGhvZCA9IGMoInBjYSIpLAogIGdoID0gRkFMU0UsCiAgcGNfc2VsZWN0aW9uID0gbGlzdCgiY3VtdmFyIiwgMC45OSksCiAgcmV0dXJuX3Byb2plY3Rpb24gPSBUUlVFKQpgYGAKCkNhbGN1bGF0ZSAxc3QgbmVhcmVzdCBuZWlnaGJvciBvZiBlYWNoIElTX1JlZmwgc3BlY3RydW0gdG8gZWFjaCBHX1JlZmwgc3BlY3RydW0KCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9Cmtubl9wYyA8LSBzZWFyY2hfbmVpZ2hib3JzKFhyID0gR19SZWZsLCBYdSA9IElTX1JlZmwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3NfbWV0aG9kID0gYygicGNhIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGsgPSAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICBwY19zZWxlY3Rpb24gPSBsaXN0KCJjdW12YXIiLCAwLjk5KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGUgPSBUUlVFKQpoaXN0KGtubl9wYyRuZWlnaGJvcnNfZGlzcykKa25uLnBjLmRmIDwtIGRhdGEuZnJhbWUocG9pbnQuaW5kZXg9MTpucm93KElTX1JlZmwpLAogICAgICAgICAgICAgICAgICAgICAgICBwb2ludD1yb3duYW1lcyhJU19SZWZsKSwKICAgICAgICAgICAgICAgICAgICAgICAgR05OLmluZGV4PWFzLnZlY3Rvcihrbm5fcGMkbmVpZ2hib3JzKSwKICAgICAgICAgICAgICAgICAgICAgICAgR05OPXJvd25hbWVzKEdfUmVmbClbYXMudmVjdG9yKGtubl9wYyRuZWlnaGJvcnMpXSwKICAgICAgICAgICAgICAgICAgICAgICAgR05OLmRpc3M9YXMudmVjdG9yKGtubl9wYyRuZWlnaGJvcnNfZGlzcykpCmBgYAoKIyMgMy5DYWxjdWxhdGUgQ29ycmVsYXRpb24gZGlzc2ltaWxhcml0eQoKYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0Ka25uX2MgPC0gc2VhcmNoX25laWdoYm9ycyhYciA9IEdfUmVmbCwgWHUgPSBJU19SZWZsLAogICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3NfbWV0aG9kID0gYygiY29yIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgayA9IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGUgPSBUUlVFKQpoaXN0KGtubl9jJG5laWdoYm9yc19kaXNzKQprbm4uYy5kZiA8LSBkYXRhLmZyYW1lKHBvaW50LmluZGV4PTE6bnJvdyhJU19SZWZsKSwKICAgICAgICAgICAgICAgICAgICAgICBwb2ludD1yb3duYW1lcyhJU19SZWZsKSwKICAgICAgICAgICAgICAgICAgICAgICBHTk4uaW5kZXg9YXMudmVjdG9yKGtubl9jJG5laWdoYm9ycyksCiAgICAgICAgICAgICAgICAgICAgICAgR05OPXJvd25hbWVzKEdfUmVmbClbYXMudmVjdG9yKGtubl9jJG5laWdoYm9ycyldLAogICAgICAgICAgICAgICAgICAgICAgIEdOTi5kaXNzPWFzLnZlY3Rvcihrbm5fYyRuZWlnaGJvcnNfZGlzcykpCmBgYAoKIyMgNC5EaXNwbGF5IGNvdXBsZXMgb2YgbW9zdCBzaW1pbGFyIHNwZWN0cmEKCldlIHNlbGVjdCB0aGUgY291cGxlcyB3aXRoIG1heGltdW0gYW5kIG1pbmltdW0gZGlzc2ltaWxhcml0eSwgYW5kIDEzIG1vcmUgcmFuZG9tbHkgc2VsZWN0ZWQgY291cGxlcyBmb3IgZWFjaCBkaXNzaW1pbGFyaXR5IG1ldHJpYwoKIyMjIDQuMSBQQ0EgZGlzc2ltaWxhcml0eQoKYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgZmlnLmhlaWdodD0xMCwgZmlnLndpZHRoPTEyfQprbm4uZGYgPC0ga25uLnBjLmRmCm1ldHJpYyA8LSAiUENkaXNzaW0iCgprbm4uc2VsIDwtIHJiaW5kKGtubi5kZlt3aGljaC5taW4oa25uLmRmJEdOTi5kaXNzKSxdLAogICAgICAgICAgICAgICAgIGtubi5kZlt3aGljaC5tYXgoa25uLmRmJEdOTi5kaXNzKSxdLAogICAgICAgICAgICAgICAgIGtubi5kZltzYW1wbGUoMTpucm93KGtubi5kZiksMTMpLF0pCmtubi5zZWwgPC0ga25uLnNlbFtvcmRlcihrbm4uc2VsJEdOTi5kaXNzKSxdCgpsIDwtIGxpc3QoMTpucm93KGtubi5zZWwpKQpmb3IgKGkgaW4gMTpucm93KGtubi5zZWwpKXsKICBkZj0gZGF0YS5mcmFtZShXYXZlbGVuZ3RoPXdsLCAKICAgICAgICAgICAgICAgICBJUy5SZWZsPSBJU19SZWZsW2tubi5zZWwkcG9pbnQuaW5kZXhbaV0sXSwKICAgICAgICAgICAgICAgICBHLlJlZmw9IEdfUmVmbFtrbm4uc2VsJEdOTi5pbmRleFtpXSxdKQogIGcgPC0gZ2dwbG90KGRhdGE9ZGYpICsKICAgIGdlb21fbGluZShhZXMoeD1XYXZlbGVuZ3RoLHk9SVMuUmVmbCksY29sb3I9InJlZCIpICsKICAgIGdlb21fbGluZShhZXMoeD1XYXZlbGVuZ3RoLHk9Ry5SZWZsKSxjb2xvcj0iYmx1ZSIpICsKICAgIGdndGl0bGUocGFzdGUoa25uLnNlbCRwb2ludFtpXSwga25uLnNlbCRHTk5baV0scm91bmQoa25uLnNlbCRHTk4uZGlzc1tpXSwzKSkpCiAgbFtbaV1dIDwtIGcKfQpncmlkLmFycmFuZ2UoZ3JvYnM9bCxuY29sPTMsbnJvdz01KQoKYGBgCgojIyMgNC4yIENvcnJlbGF0aW9uIGRpc3NpbWlsYXJpdHkKCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGZpZy5oZWlnaHQ9MTAsIGZpZy53aWR0aD0xMn0KCmtubi5kZiA8LSBrbm4uYy5kZgptZXRyaWMgPC0gIkNvcnJlbGF0aW9uIgoKa25uLnNlbCA8LSByYmluZChrbm4uZGZbd2hpY2gubWluKGtubi5kZiRHTk4uZGlzcyksXSwKICAgICAgICAgICAgICAgICBrbm4uZGZbd2hpY2gubWF4KGtubi5kZiRHTk4uZGlzcyksXSwKICAgICAgICAgICAgICAgICBrbm4uZGZbc2FtcGxlKDE6bnJvdyhrbm4uZGYpLDEzKSxdKQprbm4uc2VsIDwtIGtubi5zZWxbb3JkZXIoa25uLnNlbCRHTk4uZGlzcyksXQoKbCA8LSBsaXN0KDE6bnJvdyhrbm4uc2VsKSkKZm9yIChpIGluIDE6bnJvdyhrbm4uc2VsKSl7CiAgZGY9IGRhdGEuZnJhbWUoV2F2ZWxlbmd0aD13bCwgCiAgICAgICAgICAgICAgICAgSVMuUmVmbD0gSVNfUmVmbFtrbm4uc2VsJHBvaW50LmluZGV4W2ldLF0sCiAgICAgICAgICAgICAgICAgRy5SZWZsPSBHX1JlZmxba25uLnNlbCRHTk4uaW5kZXhbaV0sXSkKICBnIDwtIGdncGxvdChkYXRhPWRmKSArCiAgICBnZW9tX2xpbmUoYWVzKHg9V2F2ZWxlbmd0aCx5PUlTLlJlZmwpLGNvbG9yPSJyZWQiKSArCiAgICBnZW9tX2xpbmUoYWVzKHg9V2F2ZWxlbmd0aCx5PUcuUmVmbCksY29sb3I9ImJsdWUiKSArCiAgICBnZ3RpdGxlKHBhc3RlKGtubi5zZWwkcG9pbnRbaV0sIGtubi5zZWwkR05OW2ldLHJvdW5kKGtubi5zZWwkR05OLmRpc3NbaV0sMykpKQogICNwcmludChnKQogIGxbW2ldXSA8LSBnCiAgI3JlYWRsaW5lKCJXYWl0aW5nLi4uIikKfQpncmlkLmFycmFuZ2UoZ3JvYnM9bCxuY29sPTMsbnJvdz01KQpgYGAKCkluIGJvdGggY2FzZXMsIEkgZG8gbm90IHNlZSBhIGNsZWFyIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGRpc3NpbWlhcml0eSB2YWx1ZXMgYW5kIHRoZSB2aXN1YWwgaW5zcGVjdGlvbiB0aGUgY291cGxlcyBvZiBzcGVjdHJhLgo=