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=