Advertisement
Guest User

Untitled

a guest
Jan 23rd, 2020
234
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.92 KB | None | 0 0
  1. ---
  2. title: "Projet étude de régression et sélection de gènes pour le cancer de la vessie"
  3. output: html_document
  4. ---
  5.  
  6. ```{r setup, include = FALSE, warning=FALSE}
  7. knitr::opts_chunk$set(echo=TRUE)
  8.  
  9. ```
  10.  
  11.  
  12. ```{r}
  13. library('pls')
  14. library('curatedBladderData')
  15. library('Biobase')
  16. library('glmnet')
  17. data(package="curatedBladderData")
  18.  
  19. ```
  20.  
  21. ```{r}
  22. data(GSE89_eset)
  23. expressionData <- exprs(GSE89_eset)
  24. ```
  25. Préparation de données :
  26.  
  27.  
  28. ```{r}
  29. X <- t(expressionData)
  30. otherData <- pData(GSE89_eset@phenoData)
  31. Y <- (otherData$summarystage == "invasive")*1
  32. ```
  33.  
  34.  
  35. ```{r}
  36. Data = data.frame(X = I(t(expressionData)), Y = Y)
  37. train <- rbinom(length(Data$Y),1,0.8)
  38. Data.train <- c()
  39. Data.test <- c()
  40. Data.train$X <- Data$X[train==1,]
  41. Data.train$Y <- Data$Y[train==1]
  42. Data.test$X <- Data$X[train==0,]
  43. Data.test$Y <- Data$Y[train==0]
  44. Data.train <- as.data.frame(Data.train)
  45. Data.test <- as.data.frame(Data.test)
  46.  
  47.  
  48. ```
  49.  
  50. ```{r}
  51. gene_names <- colnames(Data$X)
  52. ```
  53.  
  54. 2. Fonction Bootstrap qui génère un échantillon bootstrap à partir du jeu initial.
  55.  
  56. ```{r}
  57. bootstrap <- function(Data) {
  58. indice <- sample(1:nrow(Data) ,nrow(Data) ,replace = TRUE)
  59. return(Data[indice, ])
  60. }
  61.  
  62. ```
  63.  
  64. On note n le nombre de valeur que l'on va retenir.
  65. ```{r}
  66. fit_function <- function(Data){
  67. pcrbladder <- pcr(Data$Y ~ Data$X , validation="CV")
  68. ncomponent <- pcrbladder$ncomp
  69. reduction.matrix <- pcrbladder$loadings[,1:ncomponent]
  70. Data$reducedX <- Data$X%*%reduction.matrix
  71. pcr.model <- glm(Data$Y~Data$reducedX ,data = Data
  72. ,family =
  73. binomial(link="logit"))
  74. matricecoeff <- pcr.model$coefficients
  75. return(matricecoeff)
  76. }
  77. ```
  78.  
  79. ###Méthode PCR : ###
  80. ```{r}
  81. Selection_Pcr <- function(Data, n){
  82. pcrbladder <- pcr(Data$Y ~ Data$X , validation="CV")
  83. ncomponent <- pcrbladder$ncomp
  84. reduction.matrix <- pcrbladder$loadings[,1:ncomponent]
  85. Data$reducedX <- Data$X%*%reduction.matrix
  86. pcr.model <- glm(Data$Y~Data$reducedX ,data = Data
  87. ,family =
  88. binomial(link="logit"))
  89. matricecoeff <- pcr.model$coefficients
  90. matricecoeff[is.na(matricecoeff)] <- 0
  91. coeff_finaux <- reduction.matrix%*%matricecoeff[seq(2,ncomponent+1)]
  92. result <- order(abs(coeff_finaux) ,decreasing
  93. = TRUE)
  94. result <- result[seq(1, n)]
  95. gene <- colnames(pcrbladder$model$`Data$X`)
  96. Data$reducedX <- NULL
  97. gene_selected <- gene[result]
  98. return(gene_selected)
  99. }
  100.  
  101. ```
  102.  
  103.  
  104.  
  105. ### Méthode PLS : ###
  106.  
  107. ```{r}
  108. Selection_Pls <- function(Data, n){
  109. plsbladder <- plsr(Data$Y ~ Data$X ,
  110. validation="CV")
  111. ncomponent <- plsbladder$ncomp
  112. reduction.matrix <- plsbladder$loadings[,1:ncomponent]
  113. Data$reducedXpls <- Data$X%*%reduction.matrix
  114. plsr.model <- glm(Data$Y~Data$reducedXpls ,data = Data
  115. ,family =
  116. binomial(link="logit"))
  117. matricecoeff <- plsr.model$coefficients
  118. matricecoeff[is.na(matricecoeff)] <- 0
  119. coeff_finaux <- reduction.matrix%*%matricecoeff[seq(2, ncomponent+1)]
  120. result <- order(abs(coeff_finaux) ,decreasing
  121. = TRUE)
  122. result <- result[seq(1, n)]
  123. gene <- colnames(plsbladder$model$`Data$X`)
  124. Data$reducedX <- NULL
  125. gene_selected <- gene[result]
  126. return(gene_selected)
  127. }
  128.  
  129.  
  130. ```
  131.  
  132.  
  133. Un nombre B fois :
  134. <ol>
  135. <li> on génére un jeu de données bootstrap <li>
  136. <li> on applique la fonction de la question précédente <li>
  137. On retient pour chaque gène un score d'apparition.
  138.  
  139. On retourne une liste qui contient tous les gènes retenue + les scores des n gènes séléctionner.
  140. écrire une fonction teste qui vérifie si un gène appartient à mon data frame ou pas.
  141.  
  142. En appliquant GLM après le bootstrap, on observe l'apparition de valeur NA dans notre matrice de coeffiscient, Le modèle est inutilisable. Certains coefficients n’ont pas été estimés et correspondent à la valeur NA (not available). Nous ne pouvons ni les interpréter, ni les déployer sur des
  143. individus supplémentaires néanmoins on comprends que cela veut dire que les directions de valeurs associées NA sont colinèaire à une autre direction, elle n'apporte pas de nouvelle information. On choisit de leurs associer un coeffiscient nul.
  144. Puisqu'elle n'apporte aucunes informations et de procèder. Ainsi, on tue l'information apporté par l'axe puisque dejà présente dans un autre
  145. Néanmoins, on ne comprend pas, pourquoi cette direction a été retenu par l'acp...
  146.  
  147.  
  148. Gènes retenue par la méthode pls et leurs scores respectifs :
  149.  
  150. ```{r}
  151. B <- 20
  152. test_pls <- NULL
  153. for(i in seq(1:B)){
  154. Data_boots <- bootstrap(Data)
  155. test_pls <- c(test_pls,
  156. Selection_Pls(Data_boots,50))
  157. }
  158. result_pls <- table(test_pls)/B
  159. gene_pls <- result_pls[result_pls > 0.85]
  160. sort(gene_pls, decreasing = TRUE)
  161. ```
  162.  
  163. Gènes retenue par la méthode pcr et leurs scores respectifs :
  164.  
  165. ```{r}
  166. B <- 20
  167. test_pcr <- NULL
  168. for(i in seq(1:B)){
  169. Data_boots <- bootstrap(Data)
  170. test_pcr <- c(test_pcr,
  171. Selection_Pcr(Data_boots,50))
  172. }
  173. result_pcr <- table(test_pcr)/B
  174. gene_pcr <- result_pcr[result_pcr > 0.95]
  175. sort(gene_pcr, decreasing = TRUE)
  176. ```
  177.  
  178.  
  179.  
  180. Certains gènes vous semblent-ils candidats pour
  181. faire partie d’une signature à valider biologiquement? Proposer une manière
  182. de sélectionner les candidats potentiels.
  183.  
  184. Les gènes qui ont été sélectionnées par les deux méthodes, pourraient éventuellement être intéressant à étudier.
  185.  
  186.  
  187. 5. Que peut-on reprocher à cette méthode en terme d’interprétation?
  188. En termes de prise en compte de la colinéarité?
  189.  
  190. On peut repprocher à cette méthode son manque d'interprétabilité, comment fixer le seuil. si X_1 et X_2 sont colinéaire ben il y en a qu'une seule qui va apparaitre dans la selection de composante. Comment privilégier l'un ou l'autre.
  191. Certains gènes sont toujours sélectionner, malgré le bootstrap
  192. QUESTION :
  193. Que peut-on de plus reprocher à l’utilisation de la PLS dans le cas d’une variable à expliquer binaire ?
  194.  
  195. ça reste très heurestique comme approche, on détruit les directions colinéraires dans glm. On fait pas mal d'hypothèses et appriori
  196.  
  197.  
  198. \textbf{Question 6}
  199.  
  200. L’introduction de pénalisations en norme L1 induit une sélection de variables optimale en régression Cette démarche conduit à la définition de versions parcimonieuses de l’Analyse en Composantes Principales et de la régression PLS pour différents objectifs : exploration, comparaison ou intégration de deux jeux de données en version régression ou canonique, analyse discriminante PLS.
  201.  
  202.  
  203.  
  204. ### 5. Sans réduction de dimension préalable:###
  205.  
  206. _La librairie "glmnet"_ est connue pour son efficacité (rapidité
  207. des calculs, qualité des résultats).
  208.  
  209.  
  210. 7. Une troisième manière de faire est de s'affranchir de la réduction de dimension en utilisant une régression pénalisée en utilisant la fonction _glmnet_ du package _glmnet_
  211. Pour avoir des résultats parcimonieux.
  212.  
  213. Lors de l'appel de la fonction, on précise la valeur 1 pour alpha pour avoir une régression de Lasso ce qui permettra de fixer selectivement les coeffiscient à la valeur 0 et réaliser une selection de variable et nous laissons R choisir la valeur adéquat pour lambda
  214.  
  215. ```{r}
  216. fit <- glmnet(Data.train$X, Data.train$Y,family = "binomial", standardize = FALSE, alpha = 1)
  217. ```
  218.  
  219. ```{r}
  220. fit
  221. ```
  222.  
  223. ```{r}
  224. plot(fit, xvar = "lambda")
  225. ```
  226.  
  227. Identification de la valeur « optimale » de λ. Nous avons les logarithmes des λi en abscisse
  228. de notre graphique. Ils varient de log(0.008982)=-4.7124 à log(89.825)=4.4978. Une règle
  229. empirique consiste à choisir la valeur de λ à partir de laquelle les coefficients commencent
  230. « à se stabiliser ».
  231. La solution viable consiste à passer par la validation croisée,
  232. qui ne fait intervenir que l’échantillon d’apprentissage. Nous faisons appel à la fonction
  233. cv.glmnet()
  234.  
  235. Fonction sélection de gène par méthode glmnet :
  236.  
  237. ```{r}
  238. Selection_glmnet <- function(Data){
  239. model.glmnet <- cv.glmnet(Data$X, Data$Y,family = "binomial", type.measure="class",
  240. nfolds=10,alpha=1,keep=TRUE)
  241. lambda_min <- model.glmnet$lambda.min
  242. Coeff_sparse <- coef(model.glmnet, s = lambda_min)
  243. result_l <- order(abs(Coeff_sparse), decreasing = TRUE)
  244. l <- length(Coeff_sparse[Coeff_sparse >0])
  245. resultt_l <- result_l[seq(2,l)] # On récupère les coeffiscient non nulles de la matrice
  246. gene <- colnames(Data$X)
  247. gene_selection <- gene[resultt_l]
  248. return(gene_selection)
  249. }
  250. ```
  251.  
  252.  
  253. Selection de gènes par méthode bootstrap :
  254.  
  255. ```{r results='hide', message=FALSE, warning=FALSE}
  256. B <- 20
  257. test_glmnet <- NULL
  258. result_glmnet <- NULL
  259. gene_glmnet <- NULL
  260.  
  261. for(i in seq(1:B)){
  262. Data_boots <- bootstrap(Data)
  263. test_glmnet <- c(test_glmnet,
  264. Selection_glmnet(Data_boots))
  265. }
  266.  
  267. result_glmnet <- table(test_glmnet)/B
  268. quantile_glmnet <- quantile(result_glmnet)[4]
  269. gene_glmnet <- result_glmnet[result_glmnet > quantile_glmnet]
  270. gene_glmnet
  271.  
  272.  
  273. ```
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement