library(mdatools)
library(kableExtra)
library(tidyverse)
library(pracma) #per detrend
library(plotly)
library(neuralnet)
dftr = read.csv('KS_oregano_TR.csv', sep = ';')
dftr = dftr[,-ncol(dftr)]
dftrdata = dftr[,-c(1:9)]

variabilix = colnames(dftrdata)
variabili = gsub("X", "", colnames(dftrdata))

colnames(dftrdata) = variabili
dfks = read.csv('Origano_KS.csv')
dfks = dfks[-1,]
dftable = table(dftr$Info.contaminante, dftr$Tipologia.reale) %>% data.frame()
dftable %>% pivot_wider(names_from = Var2, values_from = Freq)
## # A tibble: 6 ร— 3
##   Var1            Adulterant Oregano
##   <fct>                <int>   <int>
## 1 Inflorescences           0     200
## 2 Myrtle pure           1200       0
## 3 Olives pure           1200       0
## 4 Oregano pure             0    4600
## 5 Strawberry pure       1200       0
## 6 Sumac pure            1200       0


dftr %>% group_by('T' = Contaminante) %>% summarise(Count = n())
## # A tibble: 5 ร— 2
##   T          Count
##   <chr>      <int>
## 1 Myrtle      1200
## 2 Olives      1200
## 3 Oregano     4800
## 4 Strawberry  1200
## 5 Sumac       1200
attr(dftrdata, "xaxis.name") = "Wavelength"
attr(dftrdata, "xaxis.values") = colnames(dftrdata) %>% as.numeric()

mdaplot(dftrdata, type = 'l', main = 'Raw data', cgroup = as.factor(dftr$Contaminante))


dftrdatadetrend = detrend(dftrdata %>% t(), tt = 'linear')

attr(dftrdatadetrend, "xaxis.name") = "Wavelength"
attr(dftrdatadetrend, "xaxis.values") = colnames(dftrdata) %>% as.numeric()


mdaplot(t(dftrdatadetrend), type = 'l', main = 'Detrend', cgroup = as.factor(dftr$Contaminante))

dftrdata2 = scale(t(dftrdatadetrend), scale = F)

attr(dftrdata2, "xaxis.name") = "Wavelength"
attr(dftrdata2, "xaxis.values") = colnames(dftrdata) %>% as.numeric()

mdaplot(dftrdata2, type = 'l', main = 'Detrend + Mean center', cgroup = as.factor(dftr$Contaminante))


PCA


par(mfcol= c(1,1))
pc = pca(dftrdata2, ncomp = 10)

plotVariance(pc)


scorevec = pc$res$cal$scores[,2]
indexvec = c(1:length(scorevec))

dfscore = data.frame('PC2' = scorevec, 'Index' = indexvec)
dfscore = cbind(dftr[,1:8],dfscore)
ggplot(dfscore, aes(x=Index, y=PC2, color = Contaminante))+ geom_point(size = 1)+
  theme_bw()+
  geom_hline(yintercept = 0, linetype ='dashed', alpha = 0.5)

classes = as.numeric(dftr$Tipologia.reale == 'Oregano') %>% factor()


PLS-DA


model = plsda(dftrdata2, dftr$Tipologia.reale, cv = dftr$CV_TR, center = F, lim.type = 'jm')
par(mfrow = c(1,1))
plotRMSE(model)

model = selectCompNum(model , 10)
plotPredictions(model)

predvec = model$res$cv$y.pred[,10,2]+0.5
dfpred = data.frame(index = c(1:length(predvec)), Origano = predvec, Contaminante = dftr$Contaminante, Tipologia = dftr$Tipologia.reale )

ggplot(dfpred, aes(index, Origano, color = Tipologia)) + geom_point()+
  scale_color_manual(values = c('brown3', 'forestgreen'))+
  theme_bw()+
  labs(color = 'Contaminante')+
  scale_y_continuous(breaks=seq(-2,4,0.5))+
  geom_hline(yintercept = 0.5, linetype = 'dashed', alpha = 0.6)


meanorigano = mean(predvec[4801:9600])
meanadulterante = mean(predvec[0:4800])

devorigano = sd(predvec[4801:9600])
devadulterante = sd(predvec[0:4800])

normorigano = rnorm(4800, meanorigano, devorigano)
normadult = rnorm(4800, meanadulterante, devadulterante)
normvec = append(normadult, normorigano)

dfnorm = data.frame(normvec, Tipologia = dftr$Tipologia.reale )


ggplot(dfnorm, aes(normvec)) + 
  #geom_histogram(position = position_dodge2())+
  scale_fill_manual(values = c('brown3', 'forestgreen'))+
  #geom_density(alpha = 0.4)+
  stat_function(fun= dnorm,args = list(mean = meanorigano, sd = devorigano),geom = 'polygon', fill = 'green4', alpha = 0.5)+
  stat_function(fun= dnorm,args = list(mean = meanadulterante, sd = devadulterante),geom = 'polygon', fill = 'brown3', alpha = 0.5)+
  scale_x_continuous(breaks=seq(-2,3.5,0.5))+
  theme_bw()+
  coord_flip(xlim = c(-2,3.5), ylim = c(0,1))+
  xlab('')+
  ylab('')


model$cvres$c.pred[,8,2] %>% table()
## .
##   -1    1 
## 4801 4799


SVM


library('e1071')
## 
## Caricamento pacchetto: 'e1071'
## Il seguente oggetto รจ mascherato da 'package:pracma':
## 
##     sigmoid
classes = as.numeric(dftr$Tipologia.reale == 'Oregano')

classifier = svm(formula = classes ~ .,
                 data = scale(dftrdata),
                 type = 'C-classification',
                 kernel = 'linear')
y_cv = predict(classifier, newdata = scale(dftrdata))

dfpred = data.frame(index = c(1:length(y_cv)), Origano = y_cv, Contaminante = dftr$Contaminante, Tipologia = dftr$Tipologia.reale )
ggplot(dfpred, aes(index, Origano, color = Tipologia)) + geom_point()+
  scale_color_manual(values = c('brown3', 'forestgreen'))+
  theme_bw()+
  labs(color = 'Contaminante')+
  geom_hline(yintercept = 0, linetype = 'dashed', alpha = 0.4)+
  ggtitle('SVM')

table(classes, y_cv)
##        y_cv
## classes    0    1
##       0 4578  222
##       1  202 4598


Artificial neural network


classes = as.numeric(dftr$Tipologia.reale == 'Oregano')
colnames(dftrdata2) = variabilix

dftrdata3 = cbind('Tipologia' = classes, dftrdata2) %>% as.data.frame()



formula <- as.formula(paste("Tipologia ~ ", paste(variabilix, collapse = " + ")))
LS0tDQp0aXRsZTogIlBMUy1EQSBPcmlnYW5vIg0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50Og0KICAgIHRoZW1lOiBjZXJ1bGVhbg0KICAgIHRvYzogVHJ1ZQ0KICAgIGNvZGVfZm9sZGluZzogaGlkZQ0KICAgIGNvZGVfZG93bmxvYWQ6IHRydWUNCi0tLQ0KDQpgYGB7ciAsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQoNCmxpYnJhcnkobWRhdG9vbHMpDQpsaWJyYXJ5KGthYmxlRXh0cmEpDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkocHJhY21hKSAjcGVyIGRldHJlbmQNCmxpYnJhcnkocGxvdGx5KQ0KbGlicmFyeShuZXVyYWxuZXQpDQoNCmBgYA0KDQpgYGB7cn0NCg0KZGZ0ciA9IHJlYWQuY3N2KCdLU19vcmVnYW5vX1RSLmNzdicsIHNlcCA9ICc7JykNCmRmdHIgPSBkZnRyWywtbmNvbChkZnRyKV0NCmRmdHJkYXRhID0gZGZ0clssLWMoMTo5KV0NCg0KdmFyaWFiaWxpeCA9IGNvbG5hbWVzKGRmdHJkYXRhKQ0KdmFyaWFiaWxpID0gZ3N1YigiWCIsICIiLCBjb2xuYW1lcyhkZnRyZGF0YSkpDQoNCmNvbG5hbWVzKGRmdHJkYXRhKSA9IHZhcmlhYmlsaQ0KDQoNCmBgYA0KDQoNCmBgYHtyfQ0KZGZrcyA9IHJlYWQuY3N2KCdPcmlnYW5vX0tTLmNzdicpDQpkZmtzID0gZGZrc1stMSxdDQoNCmBgYA0KDQpgYGB7cn0NCmRmdGFibGUgPSB0YWJsZShkZnRyJEluZm8uY29udGFtaW5hbnRlLCBkZnRyJFRpcG9sb2dpYS5yZWFsZSkgJT4lIGRhdGEuZnJhbWUoKQ0KZGZ0YWJsZSAlPiUgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IFZhcjIsIHZhbHVlc19mcm9tID0gRnJlcSkNCg0KYGBgDQoNCg0KDQo8YnIvPg0KDQpgYGB7cn0NCg0KZGZ0ciAlPiUgZ3JvdXBfYnkoJ1QnID0gQ29udGFtaW5hbnRlKSAlPiUgc3VtbWFyaXNlKENvdW50ID0gbigpKQ0KDQpgYGANCg0KYGBge3IsIGZpZy5hbGlnbj0nY2VudGVyJ30NCg0KYXR0cihkZnRyZGF0YSwgInhheGlzLm5hbWUiKSA9ICJXYXZlbGVuZ3RoIg0KYXR0cihkZnRyZGF0YSwgInhheGlzLnZhbHVlcyIpID0gY29sbmFtZXMoZGZ0cmRhdGEpICU+JSBhcy5udW1lcmljKCkNCg0KbWRhcGxvdChkZnRyZGF0YSwgdHlwZSA9ICdsJywgbWFpbiA9ICdSYXcgZGF0YScsIGNncm91cCA9IGFzLmZhY3RvcihkZnRyJENvbnRhbWluYW50ZSkpDQoNCmBgYA0KPGJyLz4NCg0KYGBge3IsIGZpZy5hbGlnbj0nY2VudGVyJ30NCg0KZGZ0cmRhdGFkZXRyZW5kID0gZGV0cmVuZChkZnRyZGF0YSAlPiUgdCgpLCB0dCA9ICdsaW5lYXInKQ0KDQphdHRyKGRmdHJkYXRhZGV0cmVuZCwgInhheGlzLm5hbWUiKSA9ICJXYXZlbGVuZ3RoIg0KYXR0cihkZnRyZGF0YWRldHJlbmQsICJ4YXhpcy52YWx1ZXMiKSA9IGNvbG5hbWVzKGRmdHJkYXRhKSAlPiUgYXMubnVtZXJpYygpDQoNCg0KbWRhcGxvdCh0KGRmdHJkYXRhZGV0cmVuZCksIHR5cGUgPSAnbCcsIG1haW4gPSAnRGV0cmVuZCcsIGNncm91cCA9IGFzLmZhY3RvcihkZnRyJENvbnRhbWluYW50ZSkpDQoNCmBgYA0KDQpgYGB7ciwgZmlnLmFsaWduPSdjZW50ZXInfQ0KDQpkZnRyZGF0YTIgPSBzY2FsZSh0KGRmdHJkYXRhZGV0cmVuZCksIHNjYWxlID0gRikNCg0KYXR0cihkZnRyZGF0YTIsICJ4YXhpcy5uYW1lIikgPSAiV2F2ZWxlbmd0aCINCmF0dHIoZGZ0cmRhdGEyLCAieGF4aXMudmFsdWVzIikgPSBjb2xuYW1lcyhkZnRyZGF0YSkgJT4lIGFzLm51bWVyaWMoKQ0KDQptZGFwbG90KGRmdHJkYXRhMiwgdHlwZSA9ICdsJywgbWFpbiA9ICdEZXRyZW5kICsgTWVhbiBjZW50ZXInLCBjZ3JvdXAgPSBhcy5mYWN0b3IoZGZ0ciRDb250YW1pbmFudGUpKQ0KDQoNCmBgYA0KPGJyLz4NCg0KDQojIFBDQQ0KDQo8YnIvPg0KDQpgYGB7cn0NCg0KcGFyKG1mY29sPSBjKDEsMSkpDQpwYyA9IHBjYShkZnRyZGF0YTIsIG5jb21wID0gMTApDQoNCnBsb3RWYXJpYW5jZShwYykNCg0KDQpgYGANCjxici8+DQoNCmBgYHtyfQ0KDQpzY29yZXZlYyA9IHBjJHJlcyRjYWwkc2NvcmVzWywyXQ0KaW5kZXh2ZWMgPSBjKDE6bGVuZ3RoKHNjb3JldmVjKSkNCg0KZGZzY29yZSA9IGRhdGEuZnJhbWUoJ1BDMicgPSBzY29yZXZlYywgJ0luZGV4JyA9IGluZGV4dmVjKQ0KZGZzY29yZSA9IGNiaW5kKGRmdHJbLDE6OF0sZGZzY29yZSkNCg0KDQpgYGANCg0KYGBge3J9DQpnZ3Bsb3QoZGZzY29yZSwgYWVzKHg9SW5kZXgsIHk9UEMyLCBjb2xvciA9IENvbnRhbWluYW50ZSkpKyBnZW9tX3BvaW50KHNpemUgPSAxKSsNCiAgdGhlbWVfYncoKSsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgbGluZXR5cGUgPSdkYXNoZWQnLCBhbHBoYSA9IDAuNSkNCg0KDQpgYGANCg0KDQoNCmBgYHtyfQ0KY2xhc3NlcyA9IGFzLm51bWVyaWMoZGZ0ciRUaXBvbG9naWEucmVhbGUgPT0gJ09yZWdhbm8nKSAlPiUgZmFjdG9yKCkNCg0KYGBgDQoNCjxici8+DQoNCiMgUExTLURBDQoNCjxici8+DQoNCmBgYHtyfQ0KbW9kZWwgPSBwbHNkYShkZnRyZGF0YTIsIGRmdHIkVGlwb2xvZ2lhLnJlYWxlLCBjdiA9IGRmdHIkQ1ZfVFIsIGNlbnRlciA9IEYsIGxpbS50eXBlID0gJ2ptJykNCg0KYGBgDQoNCmBgYHtyLCBmaWcuYWxpZ249J2NlbnRlcid9DQoNCnBhcihtZnJvdyA9IGMoMSwxKSkNCnBsb3RSTVNFKG1vZGVsKQ0KDQpgYGANCg0KYGBge3IsIGZpZy5hbGlnbj0nY2VudGVyJ30NCg0KbW9kZWwgPSBzZWxlY3RDb21wTnVtKG1vZGVsICwgMTApDQpwbG90UHJlZGljdGlvbnMobW9kZWwpDQoNCmBgYA0KDQpgYGB7ciwgZmlnLmFsaWduPSdjZW50ZXInLCBmaWcud2lkdGg9IDd9DQoNCg0KcHJlZHZlYyA9IG1vZGVsJHJlcyRjdiR5LnByZWRbLDEwLDJdKzAuNQ0KZGZwcmVkID0gZGF0YS5mcmFtZShpbmRleCA9IGMoMTpsZW5ndGgocHJlZHZlYykpLCBPcmlnYW5vID0gcHJlZHZlYywgQ29udGFtaW5hbnRlID0gZGZ0ciRDb250YW1pbmFudGUsIFRpcG9sb2dpYSA9IGRmdHIkVGlwb2xvZ2lhLnJlYWxlICkNCg0KZ2dwbG90KGRmcHJlZCwgYWVzKGluZGV4LCBPcmlnYW5vLCBjb2xvciA9IFRpcG9sb2dpYSkpICsgZ2VvbV9wb2ludCgpKw0KICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygnYnJvd24zJywgJ2ZvcmVzdGdyZWVuJykpKw0KICB0aGVtZV9idygpKw0KICBsYWJzKGNvbG9yID0gJ0NvbnRhbWluYW50ZScpKw0KICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzPXNlcSgtMiw0LDAuNSkpKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLjUsIGxpbmV0eXBlID0gJ2Rhc2hlZCcsIGFscGhhID0gMC42KQ0KDQoNCmBgYA0KPGJyLz4NCg0KYGBge3J9DQptZWFub3JpZ2FubyA9IG1lYW4ocHJlZHZlY1s0ODAxOjk2MDBdKQ0KbWVhbmFkdWx0ZXJhbnRlID0gbWVhbihwcmVkdmVjWzA6NDgwMF0pDQoNCmRldm9yaWdhbm8gPSBzZChwcmVkdmVjWzQ4MDE6OTYwMF0pDQpkZXZhZHVsdGVyYW50ZSA9IHNkKHByZWR2ZWNbMDo0ODAwXSkNCg0Kbm9ybW9yaWdhbm8gPSBybm9ybSg0ODAwLCBtZWFub3JpZ2FubywgZGV2b3JpZ2FubykNCm5vcm1hZHVsdCA9IHJub3JtKDQ4MDAsIG1lYW5hZHVsdGVyYW50ZSwgZGV2YWR1bHRlcmFudGUpDQpub3JtdmVjID0gYXBwZW5kKG5vcm1hZHVsdCwgbm9ybW9yaWdhbm8pDQoNCmRmbm9ybSA9IGRhdGEuZnJhbWUobm9ybXZlYywgVGlwb2xvZ2lhID0gZGZ0ciRUaXBvbG9naWEucmVhbGUgKQ0KDQpgYGANCg0KPGJyLz4NCg0KYGBge3IsIGZpZy5hbGlnbj0nY2VudGVyJywgZmlnLmFzcD0gMS41LCBmaWcud2lkdGg9IDN9DQoNCmdncGxvdChkZm5vcm0sIGFlcyhub3JtdmVjKSkgKyANCiAgI2dlb21faGlzdG9ncmFtKHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2UyKCkpKw0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCdicm93bjMnLCAnZm9yZXN0Z3JlZW4nKSkrDQogICNnZW9tX2RlbnNpdHkoYWxwaGEgPSAwLjQpKw0KICBzdGF0X2Z1bmN0aW9uKGZ1bj0gZG5vcm0sYXJncyA9IGxpc3QobWVhbiA9IG1lYW5vcmlnYW5vLCBzZCA9IGRldm9yaWdhbm8pLGdlb20gPSAncG9seWdvbicsIGZpbGwgPSAnZ3JlZW40JywgYWxwaGEgPSAwLjUpKw0KICBzdGF0X2Z1bmN0aW9uKGZ1bj0gZG5vcm0sYXJncyA9IGxpc3QobWVhbiA9IG1lYW5hZHVsdGVyYW50ZSwgc2QgPSBkZXZhZHVsdGVyYW50ZSksZ2VvbSA9ICdwb2x5Z29uJywgZmlsbCA9ICdicm93bjMnLCBhbHBoYSA9IDAuNSkrDQogIHNjYWxlX3hfY29udGludW91cyhicmVha3M9c2VxKC0yLDMuNSwwLjUpKSsNCiAgdGhlbWVfYncoKSsNCiAgY29vcmRfZmxpcCh4bGltID0gYygtMiwzLjUpLCB5bGltID0gYygwLDEpKSsNCiAgeGxhYignJykrDQogIHlsYWIoJycpDQoNCg0KDQoNCg0KYGBgDQoNCg0KDQo8YnIvPg0KDQpgYGB7cn0NCg0KbW9kZWwkY3ZyZXMkYy5wcmVkWyw4LDJdICU+JSB0YWJsZSgpDQoNCmBgYA0KPGJyLz4NCg0KIyBTVk0NCg0KPGJyLz4NCg0KDQpgYGB7ciB3YXJuaW5nPUZBTFNFfQ0KbGlicmFyeSgnZTEwNzEnKQ0KDQpjbGFzc2VzID0gYXMubnVtZXJpYyhkZnRyJFRpcG9sb2dpYS5yZWFsZSA9PSAnT3JlZ2FubycpDQoNCmNsYXNzaWZpZXIgPSBzdm0oZm9ybXVsYSA9IGNsYXNzZXMgfiAuLA0KICAgICAgICAgICAgICAgICBkYXRhID0gc2NhbGUoZGZ0cmRhdGEpLA0KICAgICAgICAgICAgICAgICB0eXBlID0gJ0MtY2xhc3NpZmljYXRpb24nLA0KICAgICAgICAgICAgICAgICBrZXJuZWwgPSAnbGluZWFyJykNCg0KYGBgDQoNCg0KYGBge3J9DQoNCnlfY3YgPSBwcmVkaWN0KGNsYXNzaWZpZXIsIG5ld2RhdGEgPSBzY2FsZShkZnRyZGF0YSkpDQoNCmRmcHJlZCA9IGRhdGEuZnJhbWUoaW5kZXggPSBjKDE6bGVuZ3RoKHlfY3YpKSwgT3JpZ2FubyA9IHlfY3YsIENvbnRhbWluYW50ZSA9IGRmdHIkQ29udGFtaW5hbnRlLCBUaXBvbG9naWEgPSBkZnRyJFRpcG9sb2dpYS5yZWFsZSApDQoNCmBgYA0KDQoNCmBgYHtyfQ0KDQpnZ3Bsb3QoZGZwcmVkLCBhZXMoaW5kZXgsIE9yaWdhbm8sIGNvbG9yID0gVGlwb2xvZ2lhKSkgKyBnZW9tX3BvaW50KCkrDQogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCdicm93bjMnLCAnZm9yZXN0Z3JlZW4nKSkrDQogIHRoZW1lX2J3KCkrDQogIGxhYnMoY29sb3IgPSAnQ29udGFtaW5hbnRlJykrDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGxpbmV0eXBlID0gJ2Rhc2hlZCcsIGFscGhhID0gMC40KSsNCiAgZ2d0aXRsZSgnU1ZNJykNCg0KYGBgDQpgYGB7cn0NCg0KdGFibGUoY2xhc3NlcywgeV9jdikNCg0KYGBgDQoNCjxici8+DQoNCiMgQXJ0aWZpY2lhbCBuZXVyYWwgbmV0d29yaw0KDQo8YnIvPg0KDQpgYGB7cn0NCg0KDQpjbGFzc2VzID0gYXMubnVtZXJpYyhkZnRyJFRpcG9sb2dpYS5yZWFsZSA9PSAnT3JlZ2FubycpDQpjb2xuYW1lcyhkZnRyZGF0YTIpID0gdmFyaWFiaWxpeA0KDQpkZnRyZGF0YTMgPSBjYmluZCgnVGlwb2xvZ2lhJyA9IGNsYXNzZXMsIGRmdHJkYXRhMikgJT4lIGFzLmRhdGEuZnJhbWUoKQ0KDQoNCg0KZm9ybXVsYSA8LSBhcy5mb3JtdWxhKHBhc3RlKCJUaXBvbG9naWEgfiAiLCBwYXN0ZSh2YXJpYWJpbGl4LCBjb2xsYXBzZSA9ICIgKyAiKSkpDQoNCg0KDQoNCg0KDQoNCmBgYA0KDQoNCg0KDQoNCg0KDQoNCg0KDQo=