From b886908c0c9072013328746a5ccd24c4a2d9a6ef Mon Sep 17 00:00:00 2001 From: jorainer Date: Mon, 21 Oct 2024 23:07:35 +0000 Subject: [PATCH] =?UTF-8?q?Deploying=20to=20gh-pages=20from=20@=20rformass?= =?UTF-8?q?spectrometry/metabonaut@2c423164c217fc57630cbecdb08bfec77da1cc4?= =?UTF-8?q?c=20=F0=9F=9A=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../a-end-to-end-untargeted-metabolomics.html | 73 ++++++++---------- .../figure-html/histogram-1.png | Bin 23682 -> 23745 bytes .../figure-html/unnamed-chunk-49-1.png | Bin 48013 -> 47055 bytes .../figure-html/unnamed-chunk-50-1.png | Bin 47457 -> 47593 bytes .../figure-html/unnamed-chunk-58-1.png | Bin 32692 -> 32294 bytes .../figure-html/unnamed-chunk-59-1.png | Bin 33965 -> 33041 bytes .../figure-html/unnamed-chunk-62-1.png | Bin 122076 -> 106603 bytes .../figure-html/unsupervised-checks1-1.png | Bin 51497 -> 51238 bytes .../figure-html/volcano-1.png | Bin 67489 -> 67990 bytes articles/install_v0.html | 3 - pkgdown.yml | 2 +- search.json | 2 +- 12 files changed, 33 insertions(+), 47 deletions(-) diff --git a/articles/a-end-to-end-untargeted-metabolomics.html b/articles/a-end-to-end-untargeted-metabolomics.html index aa5e66b..a439083 100644 --- a/articles/a-end-to-end-untargeted-metabolomics.html +++ b/articles/a-end-to-end-untargeted-metabolomics.html @@ -1881,7 +1881,7 @@

Complete end-to-end LC-MS/MS Metabolomic Data analysis

Object of class "XProcessHistory"
  type: Peak detection
- date: Mon Oct 21 15:53:03 2024
+ date: Mon Oct 21 23:01:56 2024
  info:
  fileIndex: 1,2,3,4,5,6,7,8,9,10
  Parameter class: CentWaveParam
@@ -2365,7 +2365,7 @@ 

Complete end-to-end LC-MS/MS Metabolomic Data analysis

mad = TRUE) res <- filterFeatures(res, filter = filter_dratio, assay = "norm_imputed")
-
2981 features were removed
+
2983 features were removed

The Dratio filter is a powerful tool to identify features that exhibit high variability in the data, relating the variance observed in QC samples with that in study samples. By setting a threshold of 0.4, we remove features that have a high degree of variability between the QC and study samples. In this example, any feature in which the deviation at the QC is higher than 40% (threshold = 0.4)of the deviation on the study samples is removed. This filtering step ensures that only features are retained that have considerably lower technical than biological variance.

@@ -2376,16 +2376,16 @@

Complete end-to-end LC-MS/MS Metabolomic Data analysis

#' Number of features after analysis nrow(res)
-
[1] 4279
+
[1] 4277
 #' Percentage left: end/beginning
 nrow(res)/nrow(res_unfilt) * 100
-
[1] 47.18791
+
[1] 47.16586
-

The dataset has been reduced from 9068 to 4279 features. We did remove a considerable amount of features but this is expected as we want to focus on the most reliable features for our analysis. For the rest of our analysis we need to separate the QC samples from the study samples. We will store the QC samples in a separate object for later use.

+

The dataset has been reduced from 9068 to 4277 features. We did remove a considerable amount of features but this is expected as we want to focus on the most reliable features for our analysis. For the rest of our analysis we need to separate the QC samples from the study samples. We will store the QC samples in a separate object for later use.

 res_qc <- res[, res$phenotype == "QC"]
@@ -2553,10 +2553,10 @@ 

Complete end-to-end LC-MS/MS Metabolomic Data analysis

FT0732 182.0749 34.83789 --8.558218 -0.0055407 +-8.671950 +0.0130751 12.226462 -3.782311 +3.721209 0.2102895 @@ -2564,7 +2564,7 @@

Complete end-to-end LC-MS/MS Metabolomic Data analysis

195.0877 32.65668 -6.334251 -0.0308651 +0.0371528 16.902516 10.449738 0.0296079 @@ -2573,42 +2573,32 @@

Complete end-to-end LC-MS/MS Metabolomic Data analysis

FT0565 161.0400 162.13668 --5.495938 -0.0265415 +-5.574178 +0.0274043 10.284250 -4.571728 +4.501914 0.0359696 FT1171 229.1299 181.08828 --5.440532 -0.0172406 +-5.238624 +0.0130751 10.718371 -5.474917 +5.636550 0.0707526 FT0371 138.0547 148.39599 --5.236420 -0.0172406 +-5.238580 +0.0137310 9.912038 -4.350530 +4.347691 0.5555981 - -FT5606 -560.3603 -33.54917 --3.621250 -0.0308651 -8.883094 -5.076666 -1.2154388 -
@@ -2726,7 +2716,7 @@

Complete end-to-end LC-MS/MS Metabolomic Data analysis

Object of class Matched
 Total number of matches: 237
-Number of query objects: 6 (4 matched)
+Number of query objects: 5 (4 matched)
 Number of target objects: 117732 (237 matched)
@@ -2740,7 +2730,7 @@

Complete end-to-end LC-MS/MS Metabolomic Data analysis

"target_inchikey")) mtch_res
-
DataFrame with 239 rows and 8 columns
+
DataFrame with 238 rows and 8 columns
         feature_id     mzmed     rtmed      adduct ppm_error target_formula
        <character> <numeric> <numeric> <character> <numeric>    <character>
 FT0371      FT0371   138.055   148.396      [M+H]+   2.08055        C7H7NO2
@@ -2749,11 +2739,11 @@ 

Complete end-to-end LC-MS/MS Metabolomic Data analysis

FT0371 FT0371 138.055 148.396 [M+H]+ 1.93568 C7H7NO2 FT0371 FT0371 138.055 148.396 [M+H]+ 2.08055 C7H7NO2 ... ... ... ... ... ... ... -FT1171 FT1171 229.13 181.0883 [M+Na]+ 3.07708 C12H18N2O -FT1171 FT1171 229.13 181.0883 [M+Na]+ 3.07708 C12H18N2O -FT1171 FT1171 229.13 181.0883 [M+Na]+ 3.07708 C12H18N2O -FT1171 FT1171 229.13 181.0883 [M+Na]+ 3.07708 C12H18N2O -FT5606 FT5606 560.36 33.5492 NA NA NA +FT1171 FT1171 229.13 181.088 [M+Na]+ 3.07708 C12H18N2O +FT1171 FT1171 229.13 181.088 [M+Na]+ 3.07708 C12H18N2O +FT1171 FT1171 229.13 181.088 [M+Na]+ 3.07708 C12H18N2O +FT1171 FT1171 229.13 181.088 [M+Na]+ 3.07708 C12H18N2O +FT1171 FT1171 229.13 181.088 [M+Na]+ 3.07708 C12H18N2O target_name target_inchikey <character> <character> FT0371 Benzohydro... VDEUYMSGMP... @@ -2766,7 +2756,7 @@

Complete end-to-end LC-MS/MS Metabolomic Data analysis

FT1171 Isoproturo... PUIYMUZLKQ... FT1171 Isoproturo... PUIYMUZLKQ... FT1171 Isoproturo... PUIYMUZLKQ... -FT5606 NA NA
+FT1171 Isoproturo... PUIYMUZLKQ...

Thus, in total 237 ions of compounds in MassBank were matched to our significant features based on the specified tolerance settings. Many compounds, while having a different structure and thus function/chemical property, have an identical chemical formula and thus mass. Matching exclusively on the m/z of features will hence result in many potentially false positive hits and is thus considered to provide only low confidence annotation. An additional complication is that some annotation resources, like MassBank, being community maintained, contain a large amount of redundant information. To reduce redundancy in the result table we below iterate over the hits of a feature and keep only matches to unique compounds (identified by their INCHIKEY). The INCHI or INCHIKEY combine information from compound’s chemical formula and structure, so while different compounds can share the same chemical formula, they should have a different structure and thus INCHI.

@@ -3193,8 +3183,7 @@

Complete end-to-end LC-MS/MS Metabolomic Data analysis

FT0565 161.0391 161.0407 159.00234 164.30799 FT0732 182.0726 182.0756 32.71242 42.28755 FT0845 195.0799 195.0887 30.73235 35.67337 -FT1171 229.1282 229.1335 178.01450 183.35303 -FT5606 560.3539 560.3656 32.06570 35.33456 +FT1171 229.1282 229.1335 178.01450 183.35303

We next identify the fragment spectra with their precursor m/z and retention times within these ranges. We use the filterRanges() function that allows to filter a Spectra object using multiple ranges simultaneously. We apply this function separately to each feature (row in the above matrix) to extract the MS2 spectra representing fragmentation information of the presumed feature’s ions.

@@ -3207,8 +3196,8 @@

Complete end-to-end LC-MS/MS Metabolomic Data analysis

spectraVariables = c("rtime", "precursorMz")) lengths(ms2_ctr_fts)
-
FT0371 FT0565 FT0732 FT0845 FT1171 FT5606
-    38     36    135     68     38      0 
+
FT0371 FT0565 FT0732 FT0845 FT1171
+    38     36    135     68     38 

The result from this apply() call is a list of Spectra, each element representing the result for one feature. With the exception of the last feature, multiple MS2 spectra could be identified. We next combine the list of Spectra into a single Spectra object using the concatenateSpectra() function and add an additional spectra variable containing the respective feature identifier.

@@ -3339,7 +3328,7 @@

Complete end-to-end LC-MS/MS Metabolomic Data analysis

-

Thus, from the 6 significant features, only one could be annotated to a compound based on the MS2-based approach. There could be many reasons for the failure to find matches for the other features. Although MS2 spectra were selected for each feature, most appear to only represent noise, as for most features, in the LC-MS/MS run, no or only very low MS1 signal was recorded, indicating that in that selected sample the original compound might not (or no longer) be present. Also, most reference databases contain predominantly fragment spectra for protonated ([M+H]+) ions of compounds, while some of the features might represent signal from other types of ions which would result in a different fragmentation pattern. Finally, fragment spectra of compounds of interest might also simply not be present in the used reference database.

+

Thus, from the 5 significant features, only one could be annotated to a compound based on the MS2-based approach. There could be many reasons for the failure to find matches for the other features. Although MS2 spectra were selected for each feature, most appear to only represent noise, as for most features, in the LC-MS/MS run, no or only very low MS1 signal was recorded, indicating that in that selected sample the original compound might not (or no longer) be present. Also, most reference databases contain predominantly fragment spectra for protonated ([M+H]+) ions of compounds, while some of the features might represent signal from other types of ions which would result in a different fragmentation pattern. Finally, fragment spectra of compounds of interest might also simply not be present in the used reference database.

Thus, combining the information from the MS1- and MS2 based annotation we can only annotate one feature with a considerable confidence. The feature with the m/z of 195.0879 and a retention time of 32 seconds seems to be an ion of caffeine. While the result is somewhat disappointing it also clearly shows the importance of proper experimental planning and the need to control for all potential confounding factors. For the present experiment, no disease-specific biomarker could be identified, but a life-style property of individuals suffering from this disease: coffee consumption was probably contraindicated to patients of the CVD group to reduce the risk of heart arrhythmia.

We below plot the EIC for this feature highlighting the retention time at which the highest scoring MS2 spectra was recorded and create a mirror plot comparing this MS2 spectra to the reference fragment spectra for caffeine.

@@ -3463,7 +3452,7 @@

Complete end-to-end LC-MS/MS Metabolomic Data analysis

[15] magrittr_2.0.3 rmarkdown_2.28 [17] yaml_2.3.10 MsCoreUtils_1.17.2 [19] DBI_1.2.3 abind_1.4-8 - [21] zlibbioc_1.51.1 purrr_1.0.2 + [21] zlibbioc_1.51.2 purrr_1.0.2 [23] RCurl_1.98-1.16 rappdirs_0.3.3 [25] GenomeInfoDbData_1.2.13 MSnbase_2.31.1 [27] ncdf4_1.23 codetools_0.2-20 diff --git a/articles/a-end-to-end-untargeted-metabolomics_files/figure-html/histogram-1.png b/articles/a-end-to-end-untargeted-metabolomics_files/figure-html/histogram-1.png index 28e179818d0064659011b79eb480a0d04908c045..6925c380b44e32d770e84f7ebba271b4c8179e25 100644 GIT binary patch literal 23745 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 K=;~7!Z~qAlg`CU) literal 23682 zcmeFZc{J30_&?kXvP1~U9wP(h9yq4+>U0eoqCFSrQ&as;Y>Lksv71OkDjGmsJfq~)p@#Bn)j7&^S%*@OuPMlz2VPR!uWn*JIdGaJXJNv0qr#Lt` zI5|1FxVX5vxp{baczJpG`1nqrKF!b1FCZWwC@6U5%o!meAz@)*5fKqlQPHz!&x(nO ziHnP$J9kb(LPAnfQc6nd{Q2`2E?kh7mX?u`k(HIbc=4i~oSeM8{H05m6ciK`6&00~ zl$4c~Ra8_|RaMp0)F2SZ<;$1V)zvjLG&D6ewY0RfwY7D0bgo>vqN}TW_3BkUJw1JW zeFFmnLqkI&BO@pjdhOb^>({Rv8ynxaal^#K#MIQ(%*^cO&70=t<`xzfmX?;cZr!r7 zva+_ewz09fefzept?ivVckJx!?%us?Z*TA5;Na-!=;Y+&?Ck8~;^OM+>gML=?(Xj4 z;o<4&dGFpmFE1}|Z*LzTA75WzKR-Wze}5PZcK`nUfPerv93B`L7!(u~92^`H5`sV= zkVxc%2M-=Td>9%U`smT4u&}Vlj~|DJhd+7pBqAarGBWb%)2C5UQPI)SF)=Z*v9Zsd zJ&TKrd;a`+e0=USoSc%9lA4;DmX?;Do}Q7BfkL6sX!NUB zuU@}?otc@Lm6es9ot=}Dlbf5HmzS5HpI=Z=P*_;_=FOX;qN3vB;*ye*w{PFRd-txi zw6v_Oth~IuqN1X*va+hG>izro)z#HCH8r)hwRLrM_4V})4GoQrjUPUI`1tYTr%#`n znwma;{`}?3m#<&HHa9o7w6wIgwzjpkwYRr-baZrfc6N1jVK5jh7W?hnx9;xlo}QlG z-rl~xzW)CHfq{YV-@gwI4h{_s4G#~GjEszqj*g9ujgOE2`0-<6V&dn|pOcf5Q&UsZ z)6+9EGqba^b8~a^^YaS}3yX`3OG``3%gZY(E32!kzkdB%TU%RSU*Fi+*xcOQ+S=OQ z-rm{S+1=g6;c$37ouHG#y*f&muO)7bh8eEu>gi zGl$@t*DWhdgX&$1nisb0=(#!uG9dB=bdNb-DX<#XIiIrh(SXg zhH@Cg#Ky)^gVM4)pd;m1MyQV*>5D{yk-}iQBPleZN1O!EN6-=f`yt1LX3qI%!D2Te zR&Pvyl{ayy%m^LUU3I_5da3d@HS=C3+fLFNmwfs7+0Rr>Z=Dwmd0BQYzYP6Y*6=oV z*Co)^*TwG6ljgXxpeJIAUrgAb*~@3g6>FdB_q%T^H6&Ll{o-~kVp-=N&s}MM_Uj}) z6=>`BuT2VzA2QeO;h31Q++zxc(eW}ZCMwMuGz7xJ!zSB&u*1 z5j5@}?=e9ckH#V^b6mjqq~5PXT8(9D3f=w@^#mBZmG3vJ{VLI4B}oloUEJ(AC(d5x zJ;n0rPwEhrQ+01X5mo)TtCB)Az%DTz+_^#PR)lE2O7Ewp`&+&6g=;K!3_Y9snnUpxYQU3E`y`1MbY`__lUu9@W`s{aiAzCiK{plM<$KxXn(ZGiHZLM`5DxY|}I$qlq;_AK7X1%TLlhoUPGjQ>2 zVDy{VZU2SS!fKAAYojZR49Q#Y75=@hkk!ESQTE{`EeiHQK7v%Bl0nWXrhDKz9>m&7hHC2N@hYv9@n00GR$gb1t}sfS7p2{ z6LFR%En%+ib4x8tNXt6LAe6cSawQQrTwka*+hE+T*j(^V_R(Jm9l_2mjZ7A% zO=4;8RaLwTh4)7uNYBPyfS*Nj(U zoyCWac>R=iX}~NrlL*rSA5;|^w*ImXt zy11_PPUpQDE)0AdIAbb58+39!+cifU`dhASyKas}@yU~Xg{jAfU^gwdI7q_8%h%ysW_CSti^HG5@=%>;8_*lu zaSbj~y$(ws17T&bk(V|88@btGKT2y1HcIsPm(@x6`IN-j%CN?}r`po_$Yxnz+>fclmL&a8n^< zV88WMPkMgQKxIWq{n?Gn{s@V!=-2qcsrjYMo%#nD?!cJd{fPQWQnr6czgmS~-E`2# zTl)oXSHGp6bFRt3)#n$tyXM?$T1r(k$``wbUoYG!$k)(L$(&Iw#rI_gI%Dek7{)D zlZ`o~*y^zZx|g5TC~GdmzmHXX*kM7PtGI9<=W||Vl+|@~CixTFF{gJJ&Ha&GNtCHO zS?a;stC2bN1beodJD_JL%}sgAWvuqwxx9lvej$e6VWo*NQxa{bC+=XT_CUKrnLEfaCOH9K;_&xg>QE>rYW(|`AL#nwwaLxNJ7C&{Hh zyt2_IfxSL+zzu=%iQeGrcO%7KySus1Z%vI0`5B+BeN+l|JY~5pZRXY%EYJq9;dQbN zlcswL+#?I6(6HR_^BZ$`wJLX9R1_h$Uc@m*%G+}xd6FwVcwv5-bT&AKpw})RvcSBI zfU92F=O&DO@Qf*o?X8jD(6oo2Tav1-{m!BC(R%%1U%u3P2JuqQl9dMpC3wmAVOXG! zkxKsgE_{vM!cVpXx@M-M#x9K;1(lM$Lf6OH?P*N<;=ZeA)&9Ali32T5{noNdOUUBc z_6@p8DiQjt2s${zAwjNrR*8^NRz;e_xk+_(Xg%*Ex#*3Pf7L}4@BGNy# zY|65s&B+B5D6|ZKC?6%8rFM*S@DuE z4XnDlT(`K{OR~E5!|uK|hR_Pl+<$~=jG6s&VQ$+P-YeeIn6c?+!H!Hy>?Qw723*yF znkCSvf`RW{9G=&ZGz-IP=;n+vtWAl@wn;A%zu;5XtiorFmcKG-htN>nR z7umUHv~1O7WJ`LdHl10|cLos??1{Y!X?#~zQc*Rw`iyq&T;L5&ykg0fa_U(j%yM6y zY{B>?^W~krY=%Cs#J?YcfMg;Lgi;={RP02LuV$keOx!}Q4RZdUO zbT=DkwZyuy_{6Qg>YwS8X3AB7b1?CCBn)_^n+;g45>Mj*afh0M@nJ+GXEiolYsPch zJopu>W$R394hgP{fgY=M4?Q+WWp5b!#OFd%b|QjgD&DAEu4ToaN?t7rQsvnGzH=Yb zu)ZZBKkC~<2qH%X7IIWLwrmw_JkEp22?@S9>+7%DZ251$Y5-ZLmh5gUo9WQSZ)An2 zxld*qs%@bemLv#;t*GT_mVIZEgX@ICNsjl?c&iECg`KLec~MyH_kPMdADQ8Z(OiDTJ_&((2lxI-j7ANU$mgsR9AZ+=vqI`aZCKU2V$p;0AvEf$Mm{QW-K_ z8$QL5hgmyG(4WFYudX}y$$c?l!JZ>1F)n4P8HrbQHFy^g-IEC=SnuoH?LNmYY8fP_ zUSf<_wn+*JgyPH6>kVgYrWdVBRfmpt%^!>GdN;V8wM zo{->}syRmiPmiFa-}t6dNpSX!Nq?=Kj9I^dU&Ec{`27KKkJ6IcAgeHIl)`U6c+EQZPiRg#i(Ar^3y}lb$K}@qITsAh9 zR=LM5GuDbpx!tOv#&{EdRX)K*Lwu0*8!1VS(K7edYdtnCZ<2N*j9zeZC^woDeimFC zO*xwWtKTJX0JWrIj_7Xkl#2`!4w?~0;L2T6f4b0!UVXk*Du3E7ZqIx&2rw2(*$V~k zn@|&)JSlL>sXjS)o>(wV9^dbu1=P6hjRrv95NMawJAb})84oyWk{$pth}P-Ojp4ah zk$FhDhLc3@qxv#5N%C>q9^g77*1D14`B-vdqvUSk3?a z@c)H8jQyy5`{PP;Y}w4&-h?^<3Jmce8(C#waDGcSuiXT{PqkWX^ZnI{-@6zarn*$tz4LXQ*T!mi(e*edYYT#|K8V9%}YFLu2q9%=yvmJ~$Ff|6;AW)}a-B zDTeZu?sbUZE}apCImP+<&J!3$Jbfzfehd}=Ki{dgx_txs<5OHc79_W%KEsr0F8|r- zSK3(to*l)V90DI|=SLCyifiNC%A5DGw9|i=zt-cbZ=Cyf-+4smk+jfRG;>gx2%4s6 zeKN3Os%+M4Pb{cU?*^oaL?)rw@99ie@*6D%eX(nIua&y4sDA7)*hkL zy9H^|f-oy~T|u2DD>xGBrHy~2>jW8)sN0wcS3QT|0Y@?c-#!CWu%ElRI_KB>5^bDSm-=jO72SYxa_bc%r9w7yxrnCQb0B>PW8cwQ&>Swk9#{K{L;B^gaF+& zam=%bJ^=BEre4g2xl3fyHIldnW~=eL80A%U2s0-@IE0qoDNx~3+2XxH^e+O!D2RJL zfE`c`KpW-N+mOIEj$|uGUE_%zgg-o^Xc~;EW%^AZm_pGargceC{V27?oy7Y#yPAJ@ zoU`v1A>N%$QN^iUWCJ9`101B>O6Sy^KRdSH-CS>9Sv$LlE-4d4KVfprGD^EkbtB(Z z#5nZK3yu^8?%IseFPA<^45qcH)O z>PKVw9GtS=`J6h$f6pU$VF@Y8HeY}G$1<&Gl-INI_9eqeLf((Kx5%1?J<% zk?}NFHc;3F53XvvVry@Q5gn@7yGL(ufwZRD012-I33yQUh9U*7+h@dOAX9{$LBxeY z!hW(}+uMPY5_G;k;7FQ;U~M?qCFL&F=J1AM*4NT@Et?!z)brbXF-QT$Y1F~GYapUi zIU#|lG+%~10X-%7NT!trJ;3xTRw}6cJ^yxWtb>uTA5aC4$ZYxSbu)RU?eh zduBJ3+N>-I{Cg-izGk-XYr)6veS-=uh;0;8*A*j(L3|c6Ch^@$|Aya6z)65*=1&~+ zw0X|Jb@Y%HuMc=8d+wdoe?Id{Bv_7_9xwmz*Yvw39ouIGHqL?RLLc2bVC@XmCUv*) zM$J@$%3W+OC9CjRQq(48udFWJoN^o}85K7Z8D*{uv3*{O`Avugb(VuSA#>Gd?2>8L zDw_t4DE;-719DEVVRs%6`BXPQfX!Ak0Na0LX9|;2;laVRLIlo(0-oQ^N?- zdd&pLNF04ukN3V6kD+6>0qI3Asy#Mchh{Js_LkrR5In(4( zgS75`{`W6%ChXL~MsemlEvEUmJ>$p{VeP%#q z3)_Rl(}%}C2iIh75``THPH`M~s+O=_G3L(_x}arY8E=@C_$Y-0*+)II5qkI@2s8%X z@Rj0mJpx3J392c&X%=zX12_}HfvR;)q$i)H<@*VdK=U&(3uzc%qf-}XJ%2`r%HknX zK$^MkDy5em5IcJHdZx`Os%LUmu9MUOdlnU7`BvfVb?$vlJ1+TSH|x$dk z$E!_8BJa=*ZsVA@Eyf=3FMcp^j6fcEeK1gS@3&xp6|_1B9?V-Ceuf)R=yURfYYc!7 zet70A`Z8i*cS*5TzGp)cKoCEpHfaH8ca&%~*%OREtF~Tu45al0nEDf#NHnWu`$2eU&QOB(C)`tyOr#3`*F%_s=Z1emAd74x&WV)MfU$znQMvlj) z>1YN#qB&;{nvU8$Z-zCC7*UnP2wz5Isee9k654fz(GG}6lvi&-+BG1|9OP{e{Dd?) z@;*O_Ey<`~MVU*n1-O5E4Urc?KRFIWwv6BL;qiasgF3Lp3vh|C+O?s$^n?{&z+C|G zHcR&gB$m~=Y%w;coQ0#Je^3KrdlES39AGYcit~Q&x-vf-9HL%=n4+z0fi;21}r6pho(ogY9Fldk2jz149&8Q2qt^( zomIuasFkE4EF;8H+zPvTt{y@u_}RLSq}&YBQA|?h7PipBJYhp$KuX> z2Oq`&!%{N`0&85rNl=(>$cn>8TewyY-@X19y|7mSvyNghK-|;?5g(Md?u9-29YK!b z-j?-}eihr$C**`k<3oF6gems07@g?n#|NhK@qKRGH$5vbP+i;g ztc!f-b97B1#)-!CKkn-aTrK+evkU8d0wT4w+wl{J(+({oxhZQDvD7}P z_4rZ=np79g%}XYm^YF5WXjT%FD)5m@>tkutzZOJ($G zs|=m7Bw}jlc%X9N$k+6#0J&Mn;=t`GgWh`{uX#Nbf27j!TssMld`O=LjJ-q_r_0-E zI4T<9TzxiJ!et|GU3(?irVg3Fbl@~cI%wtw7)B-`DP!)Vo<9jy8PZnx{_x--t-JQ#_?j2w*QrF8XJ|5`~qr(`yREM>=ce@ewj z1Ll6}1h!(paHykU&-5s&Iw!5qMintz+$El_6rD!&{sCaGU0Qe5c1=L9+K}-v-Mbor zlfyS~l{Uro+lzrun^i9-37~&5_Xj0LBU8RULCP_*ILm0c8;nEmvX5rZ!paK&nD`)+9qQE)E1 zVl*=-{oEqrMSz`wjRM4T`VWZk$BtJCqFdOzgL1-l&m5SGe3D@4SPH-8Vo_b@W~WMH z({D@>#NU}KF(snFEH4NiI#X6Qrf4&?STthbFtt)+T0>1n2R2tWI6lUwJxOH-EuW>f zulIYh*=t#?Yls=$A|RU#52%Uyp=(IC;FyHy#BF?#Z1bYLUlM+= z48p4MpQ9~ErAB6!Ro`NWT-TEfFbk5w4h#MN&DGU@`kKB4+;h+)nL}!lnW2lLnF~D_ z{S_Pn?`ktN7o1qO){Q&{Tqjz4Rl)nufvb83ow&8mShak;YV3mspM>k$bn}i&t0QI- zOzM{gg*7tG$UGzq&<@O*`0so^YYpZ|O9oJY>@0tREqD)r5}*$418~o>PnIb^D0r1I zx3gniyPEIr=qDx5kh!KGfbxE^bO$}&C+kidLhAjZbhE^{sP6Vk0$cs3(L2}E6ON?)#O%7eXH^Zzfk#v7MR2sW8A5>k<>RPNcuN{YkCkrDcQB~H``)kkAFqc1r8@%<ApQ8alK-m7xW`}I-m1J&Y6pn83L7RItR$7rASUZmLODN#_7^F+t* z;}rwevxEt=$*RsN;(C8d4>AbNwavHtlFFbWd;U&GtV}mz`+f#-N~}IM`U!B!>!<}T zn)&xuuvB-31bzeMzaj|$L7Ek(o`OL;W}y~#P7x>Id|b?Ak@(CPDZ6(6kXv~T`c?a!WWb^F)id|v#hYB`z$TbMfMk~jB zeDe#Ws@$jj+ILUiaEXlCyqf%_1(^^}!%anPM%Z0}I9{TtXu(If=w1k6zY3WUc|#u1 z1-v7MC7%lsqk?8EXG=DDCAdbm+0W#`);mB*bb4lO^u5H)`o$2hSoDL&^Wl&G`f9AX z0HgT|(!#SUfkn($G(<-o64!nh1m^DHVrsM*@+umaURSMCH;{21*(G*tf3d3?!NvYy z%sFx3NIkj+d|?nwoOOyg;UEDb8@T;`>+B%A4QjNDx6^=^1`Z%mPQdql#KpU>ATz9& zc0!-d1NlbSvzZ<5hBuhq&{IlrPRblxGHsy zja*40`%=IAF3PcH;#Vd!a?|Qu(_6lLGzE|yphO+r$;LOE$o<-M?ws1~SwYQ}Z)&n& zIyL^zSs8)R)vLkn0ZA>;K$XST=v;1XM2u)*kWg`G7 zo9Ah}^Wy85t_+bgB-U4C9C`|HWlV9!vnmqnKbmG?CkHhUYZX8V|J5-^)v6b*3#E?j z&db{E&klBe$&Bp_bWmB8+3S%u9e;on@SW&zjNiLyCD*1qZzYp$cTmdcpvki*dLflE z>O%_GxI85O6drcz>{J5_9iN?Z)liVEU(_kJKA5ggn^!T@V9faP(pHwzLt^s4TW09) zFyjAAiouu-TA7{q7rDKY^Z5pw>giS%^5h zkg(%Ie1JQ{&iKsdrH#vE?7P1uV^!dKtdx|XuD#M|)d4K#Gp-KiUE3iY9jMB(IRp5; zqesgPQjrK}aZU0?OvhkQwfjpfu^DTVD3zQw`1J!z!QUFv7~t+cotvF;sFE^ z1g9*I54SOj`K@sTpF04$jVyGX2x#om~L>@h*hKjo2;&#^qeH%pcgZ|Gkyke z+~?5)dgE8Q!==EH{V!!vPf{O%h}E(tKQ9F_L(9Kr0gLGA=O{UD{CkZgdffVSshNGu zXQ0^R<eN4h zUdKPk$cG8~G76dU7zzKs`+;owTQG;P7*QY}{sUsG9ryf4um1<4&2i+GI5OVt`4F?M zRkCTeyCd$aX$~NOWF>$%W>7^j%iymzSc=4AC>LHgmWoaB1Ro`<{u21lLqA#clQ99V}1}e;)gnAMA1OtNoU_ zdbxBwS5^N3%>z4WwqBm*CI6kfoW0oA!G&@^tpPY1+&`qMm`w$C&dYDJDZKjc0+K)5 z;Iw%KZs3AIbcyL46u@nNtiVMDD=NShtKjQqLoib*esduCU$#qtG8`y-;r^O4@=<}~ zw_Z`KX+S2Ld&%0R&9fhs>E92Y%uur0vk!}DVh4q($&ix-AXnU4rq)v}#9m<4gj{

kas(S zmPvEG#BScmtZ?>g$vP!#h(1~9QOFFD>+<{Dfe=0?ap^*Jou8q|PvP$l0kk}4)&R>k zD#QH1L${0nM?UF7>(8c-=WY30hK3BhM1Gn&faw47&e#8?!EVs92p7YR$H7c%I-9gk z^0TfrO6b`uB~KXtW;Kb&on|{$@%x^i`M&K$ZRX~?rh!zfhIE2x!hQ?5DiLYD|JMCI zyjqXyms9Ha)b=C}i=Nu?0Oz_NSoe z!{6coz+*dp@(4^hkmzsqnVhqQ9ST|q-Je1*RJr}LH-6$oUweO zf1bm7+){a)7Cy!e3{7-84jvBWj%Jh0Y|p7QrdoA+C`F;9?LWQc-S&?SBZr_CmZ6{; z^`IxTUNZdX{-$Mh1>NQUmLsVGv8V&E?|cl$FH8pW7MRU=l?)5>l{WUL+%<}UIvZ|r z;^bgUhMiGA4kz*YK7+sV4v!|h-!vV&h7XA^bB&6kDc5ubr3)|Dh>eoau&6wB0I5(i zUf>5D(hcwVf29|%E08O33ZFAKW0*}uv;J-x)0JK29iNs_ySM|wjDCkh8cB7_=fD;k z06L=Ky`v7~h)!3I{>?8e80S7Ntb@UkXo33xhffvIvuPX6zf3cP{bKL$)ODY|JxAm8 z-C=3&l$_Fv;5X)lAnjjFEI&{BK(u1$|0EW6R}bI&D1n^kv77yjSJUqPacvGD3>=y#=tEi&KHi^%;SS;cGsIjeALF}>2PT`bzNVoVXlv9HzO|G0G^%u3$IOPGh1XK*?Fjr7q*l?Mm4Abpz zA}2td&AbM-5Hi5`(`oSPH_K|UV-|*S z&U#_ll_syTfYIp*89}m$ZX@yCmI`z8pZX=+eON&ZW_{GM2T+jq1yF8PvHH%qr@Hwq z1ICZG7eGsp0qYlTtUPhPhcPZ?0!Eul~^Co{z;MeIv&8~=b8s?k8lP~bB=|_RLo>7XF{CNEB5EJ$!86pGX zX+y1zj5`D4^Po{PD_(s_ed1Lczvhh7=zTz7rA*M+w-os0>K-e```awg zIRJVB4^Ot#o7o*0*J1d7K55MdXShFhn;tZRxQ@l?jPdMg0}zO^S8xyMkzGt;0STe4 z1so|GnGfpa_y;8ry%${A8B0l@y(PabIbfKI39EVKIz;0V&b=BGEWBYWQcy)J3hI10 z%kTZHhMo-OfJ*z2;674SfQ!$5SkK?YQ$!7IRErqE6_fJhX`O7DgC6LN0Q&HYbxYuE zSr&#*DE60Qr47=_b&T0G2*ygD#G_FwQ-m_tfvVvFsw|y=-iS z?i@dXH4T>5y}LwM;ZlxxK|_0NZYW2L(WyR)+rBVKs;!!j&G-^p<>XMt8MJwdla}py%dUIWjQ2xLJ^!oL)n|z4GNarfKGUHu@zBm=4}#o%$XN>5T&hFRh@j`(HNx5eHeQjEkGJz z7TFZ|o5JYjG;xb#b2G_Yb*u|KjRIvW9T1?TpxD3vd7nrDPB{W>x(-^-k|bHfA$-sQ z#4T=IyA0YP~-`1`?9v~Zy3Zt(eIsyVwDNsenOONXw4OB35 z1rd!MtX5aQo`4z@js?t?{iqT+ur^wnIU`h6bi(c2MRy7GPFu0dXyH$~xz%ojWI$DH zn`K_X!HZ=qCFN$)0-p92wJ*$%STadB=aKCBfK*i%R=|0X1YjBFvb*il+ylX!*C5Sp z)eEaao_siD${|XfJG%M3V@HQlwg74B0x>wOGy77&qugMb?l$175J8|i2b7*SDQZ${ zl;e;mur!Cqz6HbMH;EC;)P0;-6Q7WumnPY^{9QryX7D_iS`1P<;s69cV#5w5H)|Hk zqN^NMJ}~wU1ENn#-Vs4FA2Ml6wRvt{rM*(;Cdlf?e)SYD8{M3zeO?VkU>pC!az7Xz z?Q6E$i1>)C^jiIx`5;C-6gdQVRzO4dL8F(gtWTIi)t)S5xR{O;e zh)oN3;|%OIW$z(FQ4Dj!-e`Pa>y`;87T1lAA&JI0j8p9HY!y51F+TgfXZS}@u>P{= zn;~SSanjR8I!fQCo3OmCRh+dE#Qoq-hawX>v5iWIU>y5L3j9l-_JMk8td8)q=b~r{ zj`uXE;y^ZxV2e8t_JQn1JNi@D4!c+Bb%?6!*bd`?9iV6E_bUJ}gCvmNhq4)yy${i; zMpWVSFd!!E^*_VjknsE}DSBRPQlC8ws1HcV041DY#oC-RHl3+!8tz)L=L>|fU<-ba zuwX&+;hbDEfyE>fI3j%~YKyX5>|nFl&y?j!zN>bNr>o$_YUVY0#Pq2Xm=Lf9+o2#I zg5e1@d)C$vBN*dLq$&UJ7Yy3G)`M|sP|*ztSJu-F*mIb5?#VOg>_cZrS$-YVS%NTxaJY66%B0~KCn$9_2w7<0G+^u1iVHpC!m>gp`F)JS} z#)d7lZ_2N{FhR9ByAabmOS!p{U(C_~L>nmAA-$4lLmQ7o)rIwybqaV@%}C`ZkjjM( z20JHEu&I^Y6s2!?2Q@wwh+Ky@9DV`hF0Nxx#Y5tnh3M1H>2r7|xTEqYYKqbdRH16P z!vD++aKb92KL>}_F&5NqsZpQL9;0QVa19TBa_e}k$btCy~FE6a0H>Mc6>~D-%c`pH~pvemWZe=H> zujW{ZHU}5>D&ubh(&?k}b*-N98ukYPoY808UK9@PwP!R251DyfgE^fBZ2{$owVCLJ zSGYy$6IeGBcI=kS_~oMvbGi%OkGM-DVHbta5{*+vkPT+2@zV2TV{l6L0=OoFp2yym z#R3uwMQrVMzXuPA4(BV~FoFa#L5n}fT8XFM)YZ+>;+zlSt)yyyg=?9K{_|{k&3W;bfAks z^alRW&Hff-G0WJI3kcePn5cmdw;?Dmf;yy62oy$3?k2r@;6pD%f|;RU7iq8y9eCj> z&`Sh#ml!iaZ75$H_}zy{ya1ZA7ie_=PGSc(izD2he;uYbHc)f+;2bRoty7lu!DES( zwlAjwVfq80nVi$;1{zUNGJ!|F1TR$!?wfUvGgVL&Mi`@UBlB6$CRo(Tn+Et&t> zVIg(UVZoVXLE}Uz#lnxKl+{da5s zfT9f~C}kfeMKD3Zod2WCaJPu|UqnIU|3ic@KiVrl45|I=PyhhzFNFTHlUUakn`{>W z^hDzUKjfCf0u!#k5($^-HY?!-@|QzOfnLFe$Uc1t#rwcp83t2sN}(b`Pa>a(lR6uoe}L z+lBR~t@Ag_8Szi9-Jwu~Za217UI0ZiIA)dHsbIyL=lgnuv?%mc8d>e1{eFV>_*}q( zH_h+yi-42o%9`{{SuU!r(OXR*zr|C^0!4FxN9e!bK*&r2jfgh&E~01(`?8tM;v##p zB>*=7XhJNp05;n8zUMG7QF{6C>j~hiDeyJJTiap4yqguU@vD%`FM#Nc8K`{Ax#I`@ z9?_F)qe5t)C(SGW71CNbxV!N}74RIPw;FkPB>_`l#>N<9>WSI0fsP?olfLA)hl_1y zn6Vwq8^#K{sL8lo>GdCtY-E@KGerE2KX!~P377{+ zZTJ1H;@o*?ggNehdjzr@@@bKwHTqE`75E2KZ%P{YLHAMLQkl zfI+_S1iBc?CSi-lj?}*SS5~P&o<@Ly`oR^`!}^)LFs`fg~=hr;v^tR!5#yLYWA3`?w+@M&*P->%iuYi0SlSTp)>r;@Lq5 zT~8A1G@8se;F8Pr^+s_)50Tmr58O6Zni=bK=*ukt*CcW1;DIOWOu$D25zZ-@#;F`I z$%`By2^LWF$wS)$67O$^=2WgvDQf}n1i&r;q+^1TaA(Lp=j6EZZ(3fkV+%(&LJb=S15%NRVZX_q zKI&^SqwqSW>o@P@ML8qL;%CBsA=t94)&S~5nF5f%{RJP?QI-7!77D23e{B9QMuGh4 z#zO5-4HFjnn~0q3WSqVr+V&5t5}?r^0mCW|6|aVl9N}Oh|Gxm2DQX%vd7NDJAjIFB z=VVjOluaS!92)$D(5k;hXG{YkE;q?FP;C7Xt2&L-$c8S2odp_CeV~?qQe z4lz_0j2HRIT+~=b`|#-ImyVM6Txuvv-wU9N0T6?eW{`pMO?#`wRd*yBlx_skxJ=gN z&trK?sI3SFr@jsmkd;2ffEU04*b~gy`-h@ffZIdOnja&6)n_2ThLZJWqKNJ^?wuc? zK7L*T-Po>tH{i+Y7NsmN*?``3gRGM0U)X|(Mf#?Q=ab4{7gn-0n$9Cb#CZB}10*MF zNII^rt`B)UU}WvpkkM}&730IE;oejt_mwv!Her1sf34Um`{<_n{H3;oN$r*;F>xdI1>QMic{BU2W9ykp_FC(V*(~tkj8l2H-hfg zwg_x|`hG9r0q@8N!}8lC6+jET;F_1n6lFl%pOE|d>2U#;ULiU}tUh!$V9XQlK)SfF zj1z?2fU{t4{V_k&iy-1>6~?{9m7o}33PoN2m$w&%V1-p?Y7=$iXB4i5`A6O=+D0YQ zy10Ty4Msx@m;bRxlXK|y^kSl}JbF?F)WI+(HLBnPhF_f_rs2{=Q=`kal0sL@8Qkqv zV_QcW9A@H?lEP?V0NMlD5JoAhmi0V3wS|v;NG{&JH~9yb1?}8KX+FGhdnL#tj`mLe zM)iZ5;MJjIqrXhufQ-ji7U(HaGB_CvBgb&(xUnNRVyl5m1A1R-RwFiL>Ut&DiId|ANTcjT^-SHoU3j883b3JL<9 zCCxh{39ip?%?BhMySrynDPbQ~Gh*m(nk0DlQ4P1maAEr>P|_LElQT;qv_bp=-fo&C z_1x9)!)eSHOBy9~Ev$1pmq-E{E-$F|+PILPWo>se-6zv^Z<0c}K z*S_stSFM-PrEudd_yyY_X7 z09&oZ=EC-R!fLT(F8!%O$sLYgR({p1AFTSOcc`OHlL+p39=~dmgJ61lXSmWak9V0q z)zjNu(^&WPcK1qu$*SSD>JeMLS?^t@S??(aLSg$Vy}u-E%va5?y8XjyVY?OeQlVrs z{dXO!m41Y$pF%NdCr#-)qO@itlVrW%joD`zReB#jdptxcn3|Bg`r{=Sc28tBhJkl_ z>?3p6gX0`CV;^}&l-{QYQdfDc{(!FXa06eMS9rLA3F#wBm*CHQsB?J<0S7FLY;ZiB z11p{<^?d}I*6#8hr+I|aqCJO2Vid^M z|AYTIs6Y%|6T>XS#A zuwjXr!2il3+Eg;hOBZ?`H4_0>Efhnuw{+Os;-79Z_|@AFx2wD=hGlRwFThF9wlu6f z2TuivuDm)=vtgbimWB~KHn#*FuoR}yu)^SDIvD-x7wxEEslyghSiLjE#t#$ zGW^~uv#&ffiN>8XX6te^q4MpdC~UI2w_kd1AaE!D-hd_H!|a6Q`}0$c@3zKunygA{ zE}*6h8gRhIV5IKv3$}^TzSJp3oh)uZB;rP@d-6);{ZdxzOg<rthfJ(6G~7YCuRxLc3#nBbjYc5S-38hUocJH6!iy`Z+>pGs&8l0aWH z&h1*+hVwm$lwN1MM=sB}P8OlNyQJHEwY^AdXenT!)owvk8^QGzB-R;!28%pt?&-`J z7t)+AclIJx?xVM3LsnWtE5QrzhO>|VV$9}4FK@hRpeWdqx<2|6bFxASHFI<`y0Uxo z-opA~sMfY5PONB4l9}Vz>-x1@YHEg`AJeJ~ z=ox!oWZfUwI3=iWupKP;#S>DouT{Xck(}*6+cSdXmGVv=x>=v!^7DF0w?#=wi(ps( zL%Gs1vuUY36)n!m`%D5s6sNow&!#cynW-Zb7H;*e0#b^W z00Q-`vV(XgP)cgl(MZJRMU*9w8Pc!88H(v3xQ!VTL6~xJf)e;D-Np08kms|rl z=Vek*tS1V_5!$S=l^$uEa8fz2M&t3N=@_I7 z@#ziunKCU2Ozt~Sz17snroa5W#ZME9MU@KDe)6j{fpttNdwIIZ*2bIDsjTV0^%KF<|E9{acb!bthL*=w&(+iGUe0FDMM={|{@wO|gVZnA@7EKZ z5YIporDIzHW)?7`g;D<|U071ht#6Zot}M>G6MCpd(rhoA%vI}e6Y_s8sC~oP4dNIv zf*RwMDlIQBEbn)H=klmUYnl&jUq5W@Z^P~edHM!c+2Scu8@s9xSBe6*lZRF3pyZO^ zNXbS}AD%tmgKW+jMs^g6R#R)6{tL5-TG>|F71m!jQX``9rF#_R{VM`oL!`*dN6TB_ zB9WU3HR(C1OU2jj&J9fSp(++wVGx4a^@X);+#enM=GLxk-`#j8z?RJHtVPJZ^p=(c zes1&@i}U^N26}0JL5LV6isV3o zjv&W!2;m$h7~~2l5C{;WvIs%YI0%9YigHOfxfY>++hI;41|G%5X6uG;mAH< zrgm%o*#CE5y{h-etNyxQ_pg6d@B6x2$K%^=!TWSPCV~3dp;-QmCEg3S`7_(Vwl;K|Ah`d;(GX|kaj#1s#|i$B?Zn>Lr~-D0+|~3^oqU zi1N*#bF)^_mf7|73@>;ZneG9?8? zMG*$;z&lnNLloS(uXro|vO)9cnXyQ0qsk(bn%Xl|MET+*BK~ZhYme7;6uc?=v+uId zEwiC5h9|0i0is$>)1~ZCjqs_+-!9l0Kvj%$;nC)$7r=x}IyW7hJ!#Wn5INejqU8w?t!92_l5 zJE6y5l(LYYyzvgy^F2e(XdUBg4AVcMBk)ibX)Z{d{AHx&uj`B#wESb2=#tp(0b-TC+0nU&;eYR^J7IMR;@b4?P}h%lrVgfdeAKSlAd!Lmq;(Q8#%G9t z(Piwt+4)jh!)(j)rDb1N4v|3d(h-3Qm9zm0fg4p(WjQOnRt#ht$7i-@4Xhs@I*V!W zABC_66g{{b>7MP-#v^-VQ6dl%9ADv)ZokIC*C;f1j`@lvxk}lwzi+H|w_2xW04lYN z5F9vt2I}z7g7V(;G)l!neH|EHlpDTMULtAnlH^iWBRc-UOo@F( zqb10{lz#HS=P#H@x)U6pvq0vzfG9{>;H~h6C@s?7R-!}5czJ(VT%}fuhPESPgWOK! zom1)c2;-3pL*GH<$5yX$mD+-KFP{&{yVeaxM#=?`KgS;eMs#gvd;esuXUs~$;pccw}8|AD^ zSfGoWZr;5?u+aaOI{%x=C+Asym{Q?DZE3?HuCbz*ak)`IV(lEgR z<4<`mBwuv!Ztn8NzL~pWKm5XyhmN%Vl`Q(9yWzt%q;|H=)UJ1phh53!R-pVGTSB&x z7f3k*MYOS6Seq@n{Cb^KYpJw=R4nf@U!GwSGFt?cTfj*@mi}JadYggPF_inbsB9WA z0AlnEcy(cjBxjjXR;uu&83GTn61KhWzMOWWPY-M;Y`hB`JiPY7f3?ayVzXuVPf zr2(z@EGN*R2KMk;3hMD5gJs?Sd?qDg zkq&Hg%=WcC>U~eCJ8_gT-A6Y@T=l}os--H=Z<%{^V0aj+3fgH&#ldgnad;RzwDHM% zNC!Mqzv>>`S)gt=t@{ESRO*f@d)@ujw@vnx1s8n&%~Scbr4U~HkZeD%JWuEvhQC<1 zB!&ZB*sz2LSmHrkt^ljl0tKr@_K0KJod?jNmAbzOMRB@eae+1U=7Pyx&D^-_&&dd0 z`?L#HMXPr4R1+Pip`d*W+(G;eQTDMqC)q1dXTcUPx8(KG$R6+sU28?zg%=kq5y4>z z7B*$3qj_(Pmdi>P04MBc?IH08H^F0xh(w0qF1 z$<&Cszz7c%4A~Imxs77;LB^OP&S!S_X(Xdnk=ba{S#kf839!@(4(_Qz^!OQfQeAUd z9}K(NksLhlZ;Kikur0*ASIm*wB(xb+|5Hy4}do#RU;(VHMVkz4XMN*dr138Q=QK}LtONooln~-)sTuyZ-kOYfKTXsti<6;MhPW2-YJRN)e zX|P_^65kLiCRzy?(gvA~Kg{bjWAB+xO08MuI3D~4sIP%Ti$WT<7=J>F8ntoYz zpb~(*wd!1qg+tIc+L8RMoT?Fbv2>_7qyioq>696>hyU1nA{i*-y1JT)OLrQ%t-}cU zU<^#~1ST%7B>K7euL|ZAW7Puc=MeYYIT)bnLL=2In`t63|^-22tqwgn__s+nhzHlT8vNgf264w_tH{44Tf zKy@W>1DcBNOm61sih^Kj@`-0AIVp*p^nJolpk4(9Z3P9@Uf`7FzdZhDXZ;q+RhE=1 V9h%R6rEdYQ3)c4N^0PnP`WJp<0KotN diff --git a/articles/a-end-to-end-untargeted-metabolomics_files/figure-html/unnamed-chunk-49-1.png b/articles/a-end-to-end-untargeted-metabolomics_files/figure-html/unnamed-chunk-49-1.png index 4880ea81e5faa430f06be45d2b18604156f44437..a4d948ceee2f268e2c45f7dae469ad39e3246b0a 100644 GIT binary patch literal 47055 zcmeFZ2{e`M-!HzUP$89}2&t!tP%=cOR2q~aW5$vY8IpM}V=Kr}p@ALbg^Iz|I&syid-m}(O=iO^P9&LNy`@XOHy1w7fbnW|!@@HwbFmEA| zNHpiqoxV&WZIULD$UjnTz%x!8Pd~)}Hd~&%a)(4>^&$Qv3+$h~K_cxXoj-k2#s1~* zc89CVsvT>SchZH-p1fg^dnL2|kkjt%WX&g?=}(^|+a7-R-Gh74rb6?Cv78sao_l#`ozcAHe^=k z5O^UYBjZW8u&~hF+$^NkulHhm_8zrv8@m3X1f0?pKw1vvVo*>RN?VJQ)I1nkpY9w9Uoz9;h~=z8X2jZNu;(1 z(HrLaW7OY2NtZAWOwmH$URkd4D*_{Je1L5BFjH| z%?=BvdwY?Q+_y~nMHVgf|6Dtv`uxt1Cc`7lp|cN7r1E2H^y}XWl0x@?B+o1zx->w0 zU|A))W@I*^^Ul#@qIpgJ;boZUgKdw6I2D{%(sl%}We*JS7JaBRntf><_o+hYt#o@y zr<9_cflj$-{_vOC2pgSmV()($TxujIk<1%|m4{;MoHj*nQe>j*x~tiv*SXSj+o^oW z(%fh&Ge4R+i4s?qTo+c^9##BIFQ3ig2R*s857mS;?_4lLn<*)$pe$UgCol!pfWWqY)v5>3fjWg1hX=T$n zK0Gck^dpNp)h0_De<0M>Vp&fAf+#Cek zX+(`NH5FBL)^n@p7Y|B=aC#ouMJ=S(ZRQf~wsI)tCGDkgzb#f97glcyGBcd186`1O zuSseczthOql}Ig!TYWKTOS)T2T)R?{jeXr%K-K6)zUeFeKiaMtj4<?lK6P0hH~Cf2(%w28(te1ER{QYu6)k(kxeq5i z_S`+tVwx;o)I6FiX&NO!9$&?}Grj~LHCl7qT1(k|a$wwb`=gjhT+>$4Wq;Zs+7%w|!0^PNV$#*>hckg%{M8_^qEQF_)Nby(wGK0aGH z+RW`_Wq-7PjjdB24c_);q2R!={AtEgovOBofwCWROI2}0mdEMOlvPwDzne0@U}^cb z`4*$h>$o^4@&5MTYCLL54TkBlvB7qYrxxhXptL1@e&Rm0z3XmE@m0a)Uz5T=96POC zt4bc|3AAq->!Nt5B__PZl;zfucU_xEL4C81JZ>||7lbdf`l-iOZBfl-m5yXitu{Vt z&DPqT2#FmK&i_Qvm_?^=2yBgtt?y=v8NB{rl~7k5FUPHE_EZ5+oh2r=sro0 zW4PmoK;%>=ieua~#mGYy9*<8~Gc_C9U$zJ^2ei<7l^IMq7KFO(8TJU}FCMZMzR40R zsm32r_ow>Nc&(yO@vH8Q39kE?SJfu^NhHPF*Rs7m+nJ+n7)aJWIC}qYp_zWcw5Fud zgp($Z#Y82}Prs_pr(iexj)~(JZLHta+y_s?r7*E>dwO_e%iN9I-QT7GbEL}G-YXL%dboz%VtgY)<+iQAWi z_l5+<22UsN^PKRj?^XXkM9e*D9yB=GvZ`-Iw#y@a13zzlS@B9m9{ZApW4nipj`?r#+i)snR?~Zvx0V0yC^e4tfw!pMhlws9#(P#-+n$$+3=f@W-Ga(*E%+JZ@c`2Z`@%Zs&tgMV{q2qtvTFk z_CeBkJs%_GZnk(D;ziQ@JJuiN&fJocg|~aZ7P=W47&y<=oTa4Q^R2vm%jV5F)0HRK zU1n+?J$e+HNMHRJ4R=ZM_~m^CO9pzCqR%Ik2jax)EmcX0f~Av zl`!eG z>M+$eR2NrVT)Z|DCzUWz(Uhca@vGtmqyLT0LKpQ^?V1@*lAz+FEB3vTshEOMZX4|} zp||pd@Q8?r2nf^~3qGqet9x@v#@D<(_sZe5D?vQRkIz3mF*ac@u9a<`GA2e=aP-Re zrKbyak<#+{n@q@8p8%Kf#Sc`SJ#%KXHQQpOF(rggXUn#2fe#<5|F^D9tkFt}C&OBzMh&2M(N}dgr#b z+MZ{(#JqFoPV|NouFLam5{~h_>S?+RGC>jL4UDtRJ1Sp_rdtoy){ZK_xwv`DmZ`j} z9-sDlq7$0v$&9T3>C@)mLdDl9sJ3c#7_fYedxs+a%pw61zm4|+5mrq>(`T+NA zGe`Xy^Tss2$mh@Jhm+FqTT!Sf%7e&BnhCZ*qxyIyojhBbZQF`0yFVwYCjI%{oQ~fN ze}pES7_6(UJ$*&*gNKKQ7v0d%jXge~B#H|8{MUx-6H1!CP6viY%~ar4xT)UDx_Izu zC3${s$jK4z^12U~3|h&Ko^6T*Ch{n&9(ln>rpD{$*~64SsCYwC&t>enH1C^{HNNkk zxHCzldI7VRjQjrnrp@nf;I=e8W8~Gm7$$7in0)2@`SUz#$gq-` z_6PC)_19ng{Ap29(jzkEjLgj3o|bv-FJ8RRY`P3EV0dI#z22&DvAJn|&T4ZwQ) z<>RU*m~`3Z?P9lnzBNe$U{QJKn5AQ4lGrq&N`K(+;lrY$&HYxvgKuP$CnhFpwcctR zj#X&hDf2ouR`sA$64Nul9Ty7w&ZfVBiU8ik_!S28WYU_n^2N_y*IGKO`D`%e+GJtf z_jdDaN%DM6)f?XNGtJV{nNI{hs&{f{=H%oIREG1k>lV4LjOc{-n~LnB4%PbFts(_QQnh-EYoZpS!o`}^lnj??#xr!Z3vUZ$8I){6b}<^E0u$pwRS2#kxJ$=H$tf`_Dd9VbRLE)r~i= z_0VS>LlPXI~r4aKud+{bM-IA+E;^zWy=e4(_I-9=J5N8X_5{l0z zO*j^Kd3iBEd*!+hRjBSQg?~x(>e$V^BY|ZG0=O#x%^dGPf0m&Mlwk>weOmTBHT}41bQ=hW&UJ8ag~_k6G=xd8Z%0#8QtxKML5LVsDxgc4PVd z&$RHbr;(9vt!CL0(-p^<8@G|9ZJz!;C4Phog-N-&4*ki<5S&$weR1*N?CUnurqmlo zMxA|umxD13TefV$WoB}JvPTVaYSJyiUjBIQipX>N2>&DMp!Z?33noplT z4fj)vii$F)#$3b&tnrs7rw?lCR2M5PaPWj}!Pe4$&Eu`Ls)U!7Aoxf;tIH`7^=b3J-8r5waWkLAEuOc%cE!Hc^#waP#7wM%IHW~{qM!!#;cNGMm7Z{r3 ziLCstJd`CfYp0Oizu>yrCNJ>K)W3-&){9NFz~Aix$Byw#_qW~>Ms-h4PL7U_=1xvb z)HwXCtLrMqX_Qb9X`)FVTOeVe%$oWHS}{c&2)O$2wAq|!D@^R@=QG2DN^pZBvpHZrN+&WrW zUS69>&EeT@K8HKgA;5Y3xQ0Ya@@Rn326FNrhIcR!-a@Fd5^XYH_21!^-<-cazbZ|f z%lyzlBuO%IwT}2y&m8Bz^SHZZ)&-fZ2}o$LlH0vjKffRlUm$ zc7(d_c_{-?&;5e__7lW`NPkJY1N(#KY#`7(9{=^ke~rig&*^ZrHWw4geeJm0>N0$l zs_+wbL$$F$w{I?mNzPQCO3}>Z?%+fV=iqo%5mH)ODq`ODL6&8VGdhOdIj#w56wyNQVBriH}qRU#B zFJJbgTLP*naLP{8(%0{4$uunuWbceQ8(7P-Fj>mZDgRO<*9D+2xM~?y=!sUm`Q5vB z)sj@f0^e|50BccHe1rmAY9Ii$+EnLEbG@mowQdC6K0!g1)(hq8FUV#b3sf~WTb^2H z_{yl=a?cKnS`R9&EY7k!^li^n`k(OBVBO}*QClNJ!)G0ZpRUF)3r%0vwn-b({M zSm|Hy;2<-{Fq|(Qb(|1XtHYOeRi*}CL~}VxuKw~rkjwjo zEcvfYneY%!YwcI@GyJcbMh>jS96Z0Lt142e$g02m&Ol`XQ<0Ea%gieuHj{=#)k(?C z>yI0S;!u8O*c<^1b1;|rw6YFMNVFTKW1cwTev~vNjnpSR9k*WWq1eXuGAPIzNVZm? zyZ@J^#>^qIa!{+|^`S~wj?n(K6NDI`~+}xaC zr(Qw4`}WCDDXFLgJ%0SkhWEyu<9jGPKJ{DO)H&DuQa&=FUGsb+sp!V{X9wh-eP}m-TBeewTfn29`ug?j-yH?S@`#ZQn6k;UpN#fCvw`Fu zc3DGXesLs?^WZ_v!_Tf2drK@&6r=OrOH-Zu9{1*rl{7U;QS1EfuDZIq5MHfcws}6Z ztc&x#fngU929{2bW_R*I$eJB)IC}IbL<&`>#H|f{8gHX!KK*fbcMnZvfyx)zIvOG6 zwp!@2q?v8LvOHZS0xoPFiMt%YBEn4VeV3f_*|{M+WPIb}xoS_4qOw32Eq?-%`yuM?EuqFim=rRZ7|U(a&>`H z;6Xui;pMp^mnCrjix)3ms^3C#XQb9->I%f|-pr9}H?A99fL~>N>*5rW)~s{1(XJmq ze*D@FYNrK=po}lL3Kd6ca8F*PbJxeaGQMa08Ck{c70nJEKD<0rr_hw5#Y9gpXw`Qv zpq!Ev)pFipV<9SuZJva%aMo!jHMM7SpAFL!)>Nt@1O5D3vMo9>c^fjvqGMtxsdp(Z zgcag0aQE5fRlOA5@A+KFRP6=pzWw{5dvSa2`j2^Ey=o~CNAPRviBsOxhbEX0bb;us zX93y=C+*eJba_1|!WH8>IBnNfS5Q6w*vMVHsGVm!IzQP9j-}+d->CAXQqi8EBR9%} zqN1V%{EzNhbz$^qzGZuSkI39pl|$=F*NkQE-5TS1TP{G#UqbV)M>BYf4Fq;mQ~WSh zWCuQ>8Q&MPdeis>J*oULSgCCuPpz_2P}x(?PManjJ+~E`3m5#p_nUO&JNPs5%0Ae& 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 A9RL6T diff --git a/articles/a-end-to-end-untargeted-metabolomics_files/figure-html/unnamed-chunk-50-1.png b/articles/a-end-to-end-untargeted-metabolomics_files/figure-html/unnamed-chunk-50-1.png index 29f8edd2dcd1700a55404bb556d56b990bca318e..bcc24e20b5ef699f70c196115d22ef692de44cc9 100644 GIT binary patch literal 47593 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 literal 47457 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%0A!Zho_Nhmt+~HlwYxSapp8 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 diff --git a/articles/a-end-to-end-untargeted-metabolomics_files/figure-html/unnamed-chunk-58-1.png b/articles/a-end-to-end-untargeted-metabolomics_files/figure-html/unnamed-chunk-58-1.png index 6dfccc8ee2741f22470144229daebe5a18405234..b6c09e7a2ad633f7b479589929958198e41889b7 100644 GIT binary patch literal 32294 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

c^3uW*xZt)GxG(co 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 diff --git a/articles/a-end-to-end-untargeted-metabolomics_files/figure-html/unnamed-chunk-59-1.png b/articles/a-end-to-end-untargeted-metabolomics_files/figure-html/unnamed-chunk-59-1.png index debc4b732740d4f43eb8e104d33d626ae7fd604a..68c7a884a16bfab923ec24d7fc26cb803a179210 100644 GIT binary patch literal 33041 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 F{{Zfq2!Q|q literal 33965 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 z

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 VH;~yr5+b@LYD${d3NYqR{tYELXc+(i diff --git a/articles/a-end-to-end-untargeted-metabolomics_files/figure-html/unsupervised-checks1-1.png b/articles/a-end-to-end-untargeted-metabolomics_files/figure-html/unsupervised-checks1-1.png index f08a1604b95ea500c0d9b04a6accd9b2f8b08fce..f9616c1b9cd3f54fd2743085da1543884cfd0b07 100644 GIT binary patch literal 51238 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 diff --git a/articles/a-end-to-end-untargeted-metabolomics_files/figure-html/volcano-1.png b/articles/a-end-to-end-untargeted-metabolomics_files/figure-html/volcano-1.png index 33472231d7e4b20bae40cab752595231766bce5f..df0ca32864c97854e6240c6a8405632a7a885f01 100644 GIT binary patch literal 67990 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

J8r@q=qq=6)jQY8yF;r5 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 EZ)N{YNdN!< literal 67489 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 diff --git a/articles/install_v0.html b/articles/install_v0.html index d94bfee..0add723 100644 --- a/articles/install_v0.html +++ b/articles/install_v0.html @@ -75,13 +75,10 @@

Install

Running workflows locally

To install on your computer all the packages necessary for the workflows run the code as follow:

-

BiocManager::install(“rformassspectrometry/metabonaut”,

-

dependencies = TRUE, ask = FALSE, update = TRUE)

 install.packages("BiocManager")
 
-## Packa
 BiocManager::install(c('RforMassSpectrometry/MsIO', 'RforMassSpectrometry/MsBackendMetaboLights'), ask = FALSE, dependencies = TRUE)
 
 BiocManager::install("rformassspectrometry/metabonaut",
diff --git a/pkgdown.yml b/pkgdown.yml
index f1818a0..70dfb56 100644
--- a/pkgdown.yml
+++ b/pkgdown.yml
@@ -6,7 +6,7 @@ articles:
   alignment-to-external-dataset: alignment-to-external-dataset.html
   dataset-investigation: dataset-investigation.html
   install_v0: install_v0.html
-last_built: 2024-10-21T15:42Z
+last_built: 2024-10-21T22:50Z
 urls:
   reference: https://rformassspectrometry.github.io/metabonaut/reference
   article: https://rformassspectrometry.github.io/metabonaut/articles
diff --git a/search.json b/search.json
index 99728c9..cd01349 100644
--- a/search.json
+++ b/search.json
@@ -1 +1 @@
-[{"path":"https://rformassspectrometry.github.io/metabonaut/articles/a-end-to-end-untargeted-metabolomics.html","id":"introduction","dir":"Articles","previous_headings":"","what":"Introduction","title":"Complete end-to-end LC-MS/MS Metabolomic Data analysis","text":"present workflow describes steps analysis LC-MS/MS experiment, includes preprocessing raw data generate abundance matrix features various samples, followed data normalization, differential abundance analysis finally annotation features metabolites. Note also alternative analysis options R packages used different steps examples mentioned throughout workflow.  Steps end--end workflow possible alternatives","code":""},{"path":"https://rformassspectrometry.github.io/metabonaut/articles/a-end-to-end-untargeted-metabolomics.html","id":"data-description","dir":"Articles","previous_headings":"","what":"Data description","title":"Complete end-to-end LC-MS/MS Metabolomic Data analysis","text":"See data description vignette detailed explanation dataset go workflow general tips done first get data.","code":""},{"path":"https://rformassspectrometry.github.io/metabonaut/articles/a-end-to-end-untargeted-metabolomics.html","id":"packages-needed","dir":"Articles","previous_headings":"","what":"Packages needed","title":"Complete end-to-end LC-MS/MS Metabolomic Data analysis","text":"workflow therefore based following dependencies:","code":"## Data Import and handling library(readxl) library(MsExperiment) library(MsIO) library(MsBackendMetaboLights) library(SummarizedExperiment)  ## Preprocessing of LC-MS data library(xcms) library(Spectra) library(MetaboCoreUtils)  ## Statistical analysis library(limma) # Differential abundance library(matrixStats) # Summaries over matrices  ## Visualisation library(pander) library(RColorBrewer) library(pheatmap) library(vioplot) library(ggfortify)   # Plot PCA library(gridExtra)   # To arrange multiple ggplots into single plots  ## Annotation library(AnnotationHub) # Annotation resources library(CompoundDb)    # Access small compound annotation data. library(MetaboAnnotation) # Functionality for metabolite annotation."},{"path":"https://rformassspectrometry.github.io/metabonaut/articles/a-end-to-end-untargeted-metabolomics.html","id":"data-import","dir":"Articles","previous_headings":"","what":"Data import","title":"Complete end-to-end LC-MS/MS Metabolomic Data analysis","text":"Note different equipment generate various file extensions, conversion step might needed beforehand, though apply dataset. Spectra package supports variety ways store retrieve MS data, including mzML, mzXML, CDF files, simple flat files, database systems. necessary, several tools, ProteoWizard’s MSConvert, can used convert files .mzML format [@chambers_cross-platform_2012]. show extract dataset MetaboLigths database load MsExperiment object. information load data MetaboLights database, refer vignette. type data loading, check xcms vignette specific vignette created data import soon. next configure parallel processing setup. functions xcms package allow per-sample parallel processing, can improve performance analysis, especially large data sets. xcms packages RforMassSpectrometry package ecosystem use parallel processing setup configured BiocParallel Bioconductor package. code use fork-based parallel processing unix system, socket-based parallel processing Windows operating system.","code":"param <- MetaboLightsParam(mtblsId = \"MTBLS8735\",                            assayName = paste0(\"a_MTBLS8735_LC-MS_positive_\",                                               \"hilic_metabolite_profiling.txt\"),                            filePattern = \".mzML\")  lcms1 <- readMsObject(MsExperiment(),                       param,                       keepOntology = FALSE,                       keepProtocol = FALSE,                       simplify = TRUE) #' Set up parallel processing using 2 cores if (.Platform$OS.type == \"unix\") {     register(MulticoreParam(2)) } else {     register(SnowParam(2)) }"},{"path":"https://rformassspectrometry.github.io/metabonaut/articles/a-end-to-end-untargeted-metabolomics.html","id":"data-organisation","dir":"Articles","previous_headings":"","what":"Data organisation","title":"Complete end-to-end LC-MS/MS Metabolomic Data analysis","text":"experimental data now represented MsExperiment object MsExperiment package. MsExperiment object container metadata spectral data provides manages also linkage samples spectra. provide brief overview data structure content. sampleData() function extracts sample information object. next extract data use pander package render show information Table 1 . Throughout document use R pipe operator (|>) avoid nested function calls hence improve code readability. sampleData() output MetaboLights always ideal direct easy access data. therefore rename transform user-friendly way. user can add, transform remove column want using base R functionalities. Table 1. Samples data set. Table 2. Simplified sample data. 11 samples data set. abbreviations essential proper interpretation metadata information: injection_index: index representing order (position) individual sample measured (injected) within LC-MS measurement run experiment. \"QC\": Quality control sample (pool serum samples external, large cohort). \"CVD\": Sample individual cardiovascular disease. \"CTR\": Sample presumably healthy control. sample_name: arbitrary name/identifier sample. age: (rounded) age individuals. define colors sample groups based sample group using RColorBrewer package: MS data experiment stored Spectra object (Spectra Bioconductor package) within MsExperiment object can accessed using spectra() function. element object spectrum - organised linearly combined Spectra object one (ordered retention time samples). access dataset’s Spectra object summarize available information provide, among things, total number spectra data set. can also summarize number spectra respective MS level (extracted msLevel() function). fromFile() function returns spectrum index sample (data file) can thus used split information (MS level case) sample summarize using base R table() function combine result matrix. Note number spectra acquired run, number spectral features sample. present data set thus contains MS1 data, ideal quantification signal. second (LC-MS/MS) data set also fragment (MS2) spectra samples used later workflow. Note users restrict data evaluation examples shown tutorials. Spectra package enables user-friendly access full MS data functionality extensively used explore, visualize summarize data. another example, determine retention time range entire data set. Data obtained LC-MS experiments typically analyzed along retention time axis, MS data organized spectrum, orthogonal retention time axis.","code":"lcms1 Object of class MsExperiment  Spectra: MS1 (17210)  Experiment data: 10 sample(s)  Sample data links:   - spectra: 10 sample(s) to 17210 element(s). sampleData(lcms1)[, c(\"Derived_Spectral_Data_File\",                       \"Characteristics[Sample type]\",                       \"Factor Value[Phenotype]\",                       \"Sample Name\",                       \"Factor Value[Age]\")] |>     kable(format = \"pipe\") # Let's rename the column for easier access colnames(sampleData(lcms1)) <- c(\"sample_name\", \"derived_spectra_data_file\",                                 \"metabolite_asssignment_file\",                                 \"source_name\",                                 \"organism\",                                 \"blood_sample_type\",                                 \"sample_type\", \"age\", \"unit\", \"phenotype\")  # Add \"QC\" to the phenotype of the QC samples sampleData(lcms1)$phenotype[sampleData(lcms1)$sample_name == \"POOL\"] <- \"QC\" sampleData(lcms1)$sample_name[sampleData(lcms1)$sample_name == \"POOL\" ] <- c(\"POOL1\", \"POOL2\", \"POOL3\", \"POOL4\")  #  Add injection index column sampleData(lcms1)$injection_index <- seq_len(nrow(sampleData(lcms1)))  #let's look at the updated sample data sampleData(lcms1)[, c(\"derived_spectra_data_file\",                      \"phenotype\", \"sample_name\", \"age\",                      \"injection_index\")] |>     kable(format = \"pipe\") #' Access Spectra Object spectra(lcms1) MSn data (Spectra) with 17210 spectra in a MsBackendMetaboLights backend:         msLevel     rtime scanIndex          1             1     0.274         1 2             1     0.553         2 3             1     0.832         3 4             1     1.111         4 5             1     1.390         5 ...         ...       ...       ... 17206         1   479.052      1717 17207         1   479.331      1718 17208         1   479.610      1719 17209         1   479.889      1720 17210         1   480.168      1721  ... 36 more variables/columns.  file(s): MS_QC_POOL_1_POS.mzML MS_A_POS.mzML MS_B_POS.mzML  ... 7 more files #' Count the number of spectra with a specific MS level per file. spectra(lcms1) |>     msLevel() |>     split(fromFile(lcms1)) |>     lapply(table) |>     do.call(what = cbind) 1    2    3    4    5    6    7    8    9   10 1 1721 1721 1721 1721 1721 1721 1721 1721 1721 1721 #' Retention time range for entire dataset spectra(lcms1) |>     rtime() |>     range() [1]   0.273 480.169"},{"path":"https://rformassspectrometry.github.io/metabonaut/articles/a-end-to-end-untargeted-metabolomics.html","id":"data-visualization-and-general-quality-assessment","dir":"Articles","previous_headings":"","what":"Data visualization and general quality assessment","title":"Complete end-to-end LC-MS/MS Metabolomic Data analysis","text":"Effective visualization paramount inspecting assessing quality MS data. general overview LC-MS data, can: Combine mass peaks (MS1) spectra sample single spectrum mass peak represents maximum signal mass peaks similar m/z. spectrum might called Base Peak Spectrum (BPS), providing information abundant ions sample. Aggregate mass peak intensities spectrum, resulting Base Peak Chromatogram (BPC). BPC shows highest measured intensity distinct retention time (hence spectrum) thus orthogonal BPS. Sum mass peak intensities spectrum create Total Ion Chromatogram (TIC). Compare BPS samples experiment evaluate similarity ion content. Compare BPC samples experiment identify samples similar dissimilar chromatographic signal. addition general data evaluation visualization, also crucial investigate specific signal e.g. internal standards compounds/ions known present samples. providing reliable reference, internal standards help achieve consistent accurate analytical results. BPS collapses data retention time dimension reveals prevalent ions present samples, creation BPS however straightforward. Mass peaks, even representing signals ion, never identical m/z values consecutive spectra due measurement error/resolution instrument. use combineSpectra function combine spectra one file (defined using parameter f = fromFile(data)) single spectrum. mass peaks difference m/z value smaller 3 parts-per-million (ppm) combined one mass peak, intensity representing maximum grouped mass peaks. reduce memory requirement, addition first bin spectrum combining mass peaks within spectrum, aggregating mass peaks bins 0.01 m/z width. case large datasets, also recommended set processingChunkSize() parameter MsExperiment object finite value (default Inf) causing data processed (loaded memory) chunks processingChunkSize() spectra. can reduce memory demand speed process. can now generate BPS sample plot() . , observable overlap ion content files, particularly around 300 m/z 700 m/z. however also differences sets samples. particular, BPS 1, 4, 7 10 (counting row-wise left right) seem different others. fact, four BPS QC samples, remaining six study samples. observed differences might explained fact QC samples pools serum samples different cohort, study samples represent plasma samples, different sample collection. Next visual inspection , can also calculate express similarity BPS heatmap. use compareSpectra() function calculate pairwise similarities BPS use pheatmap() function pheatmap package cluster visualize result. get first glance different samples distribute terms similarity. heatmap confirms observations made BPS, showing distinct clusters QCs study samples, owing different matrices sample collections. also strongly recommended delve deeper data exploring detail. can accomplished carefully assessing data extracting spectra regions interest examination. next chunk, look extract information specific spectrum distinct samples.  Figure 3. Intensity m/z values 125th spectrum two CTR samples. significant dissimilarities peak distribution intensity confirm difference composition QCs study samples. next compare full MS1 spectrum CVD CTR sample.  Figure 4. Intensity m/z values 125th spectrum one CVD one CTR sample. , can observe spectra CVD CTR samples entirely similar, exhibit similar main peaks 200 600 m/z general higher intensity control samples. However peak distribution (least intensity) seems vary m/z 10 210 m/z 600. CTR spectrum exhibits significant peaks around m/z 150 - 200 much lower intensity CVD sample. delve details specific spectrum, wide range functions can employed: Table 3. Intensity m/z values 125th spectrum one CTR sample. chromatogram() function facilitates extraction intensities along retention time. However, access chromatographic information currently efficient seamless spectral information. Work underway develop/improve infrastructure chromatographic data new Chromatograms object aimed flexible user-friendly Spectra object. visualizing LC-MS data, BPC TIC serves valuable tool assess performance liquid chromatography across various samples experiment. case, extract BPC data create plot. BPC captures maximum peak signal spectrum data file plots information retention time spectrum y-axis. BPC can extracted using chromatogram function. setting parameter aggregationFun = \"max\", instruct function report maximum signal per spectrum. Conversely, setting aggregationFun = \"sum\", sums intensities spectrum, thereby creating TIC.  Figure 5. BPC samples colored phenotype. 240 seconds signal seems measured. Thus, filter data removing part well first 10 seconds measured LC run.  Figure 6. BPC filtering retention time. Initially, examined entire BPC subsequently filtered based desired retention times. results smaller file size also facilitates straightforward interpretation BPC. final plot illustrates BPC sample colored phenotype, providing insights signal measured along retention times sample. reveals points compounds eluted LC column. essence, BPC condenses three-dimensional LC-MS data (m/z retention time intensity) two dimensions (retention time intensity). can also compare similarities BPCs heatmap. retention times however identical different samples. Thus bin() chromatographic signal per sample along retention time axis bins two seconds resulting data number bins/data points. can calculate pairwise similarities data vectors using cor() function visualize result using pheatmap().  Figure 7. Heatmap BPC similarities. heatmap reinforces exploration spectra data showed, strong separation QC study samples. important bear mind later analyses. Additionally, study samples group two clusters, cluster containing samples C F cluster II samples. plot TIC samples, using different color cluster.  Figure 8. Example TIC unusual signal. TIC samples look similar, samples cluster show different signal retention time range 40 160 seconds. Whether, strong difference impact following analysis remains determined. Throughout entire process, crucial reference points within dataset, well-known ions. experiments nowadays include internal standards (), case . strongly recommend using visualization throughout entire analysis. experiment, set 15 spiked samples. reviewing signal , selected two guide analysis process. However, also advise plot evaluate ions steps. illustrate , generate Extracted Ion Chromatograms (EIC) selected test ions. restricting MS data intensities within restricted, small m/z range selected retention time window, EICs expected contain signal single type ion. expected m/z retention times set determined different experiment. Additionally, cases internal standards available, commonly present ions sample matrix can serve suitable alternatives. Ideally, compounds distributed across entire retention time range experiment. Table 4. Internal standard list respective m/z expected retention time [s]. plot EICs isotope labeled cystine methionine.  Figure 9. EIC cystine methionine. can observe clear concentration difference QCs study samples isotope labeled cystine ion. Meanwhile, labeled methionine internal standard exhibits discernible signal amidst noise noticeable retention time shift samples. artificially isotope labeled compounds spiked individual samples, also signal endogenous compounds serum (plasma) samples. Thus, calculate next mass m/z [M+H]+ ion endogenous cystine chemical formula extract also EIC ion. calculation exact mass m/z selected ion adduct use calculateMass() mass2mz() functions MetaboCoreUtils package.  Figure 10. EIC endogenous cystine vs spiked. two cystine EICs look highly similar (endogenous shown left, isotope labeled right plot ), shift m/z, arises artificial labeling. shift allows us discriminate endogenous non-endogenous compound.","code":"#' Setting the chunksize chunksize <- 1000 processingChunkSize(spectra(lcms1)) <- chunksize #' Combining all spectra per file into a single spectrum bps <- spectra(lcms1) |>     bin(binSize = 0.01) |>     combineSpectra(f = fromFile(lcms1), intensityFun = max, ppm = 3)  #' Plot the base peak spectra par(mar = c(2, 1, 1, 1)) plotSpectra(bps, main= \"\") #' Calculate similarities between BPS sim_matrix <- compareSpectra(bps)  #' Add sample names as rownames and colnames rownames(sim_matrix) <- colnames(sim_matrix) <- sampleData(lcms1)$sample_name ann <- data.frame(phenotype = sampleData(lcms1)[, \"phenotype\"]) rownames(ann) <- rownames(sim_matrix)  #' Plot the heatmap pheatmap(sim_matrix, annotation_col = ann,          annotation_colors = list(phenotype = col_phenotype)) #' Accessing a single spectrum - comparing with QC par(mfrow = c(1,2), mar = c(2, 2, 2, 2)) spec1 <- spectra(lcms1[1])[125] spec2 <- spectra(lcms1[3])[125] plotSpectra(spec1, main = \"QC sample\") plotSpectra(spec2, main = \"CTR sample\") #' Accessing a single spectrum - comparing CVD and CTR par(mfrow = c(1,2), mar = c(2, 2, 2, 2)) spec1 <- spectra(lcms1[2])[125] spec2 <- spectra(lcms1[3])[125] plotSpectra(spec1, main = \"CVD sample\") plotSpectra(spec2, main = \"CTR sample\") #' Checking its intensity intensity(spec2) NumericList of length 1 [[1]] 18.3266733266736 45.1666666666667 ... 27.1048951048951 34.9020979020979 #' Checking its rtime rtime(spec2) [1] 34.872 #' Checking its m/z mz(spec2) NumericList of length 1 [[1]] 51.1677328505635 53.0461968245186 ... 999.139446289161 999.315208803072 #' Filtering for a specific m/z range and viewing in a tabular format filt_spec <- filterMzRange(spec2,c(50,200))  data.frame(intensity = unlist(intensity(filt_spec)),            mz = unlist(mz(filt_spec))) |>   head() |> kable(format = \"markdown\") #' Extract and plot BPC for full data bpc <- chromatogram(lcms1, aggregationFun = \"max\")  plot(bpc, col = paste0(col_sample, 80), main = \"BPC\", lwd = 1.5) grid() legend(\"topright\", col = col_phenotype,        legend = names(col_phenotype), lty = 1, lwd = 2, horiz = TRUE,        bty = \"n\") #' Filter the data based on retention time lcms1 <- filterRt(lcms1, c(10, 240)) Filter spectra bpc <- chromatogram(lcms1, aggregationFun = \"max\")  #' Plot after filtering plot(bpc, col = paste0(col_sample, 80),      main = \"BPC after filtering retention time\", lwd = 1.5) grid() legend(\"topright\", col = col_phenotype,        legend = names(col_phenotype), lty = 1, lwd = 2, horiz = TRUE, bty = \"n\") #' Total ion chromatogram tic <- chromatogram(lcms1, aggregationFun = \"sum\") |>   bin(binSize = 2)  #' Calculate similarity (Pearson correlation) between BPCs ticmap <- do.call(cbind, lapply(tic, intensity)) |>   cor()  rownames(ticmap) <- colnames(ticmap) <- sampleData(lcms1)$sample_name ann <- data.frame(phenotype = sampleData(lcms1)[, \"phenotype\"]) rownames(ann) <- rownames(ticmap)  #' Plot heatmap pheatmap(ticmap, annotation_col = ann,          annotation_colors = list(phenotype = col_phenotype)) cluster_I_idx <- sampleData(lcms1)$sample_name %in% c(\"F\", \"C\") cluster_II_idx <- sampleData(lcms1)$sample_name %in% c(\"A\", \"B\", \"D\", \"E\")  temp_col <- c(\"grey\", \"red\") names(temp_col) <- c(\"Cluster II\", \"Cluster I\") col <- rep(temp_col[1], length(lcms1)) col[cluster_I_idx] <- temp_col[2] col[sampleData(lcms1)$phenotype == \"QC\"] <- NA  lcms1 |>     chromatogram(aggregationFun = \"sum\") |>     plot( col = col,      main = \"TIC after filtering retention time\", lwd = 1.5) grid() legend(\"topright\", col = temp_col,        legend = names(temp_col), lty = 1, lwd = 2,        horiz = TRUE, bty = \"n\") #' Load our list of standard intern_standard <- read.delim(\"intern_standard_list.txt\")  # Extract EICs for the list eic_is <- chromatogram(     lcms1,     rt = as.matrix(intern_standard[, c(\"rtmin\", \"rtmax\")]),     mz = as.matrix(intern_standard[, c(\"mzmin\", \"mzmax\")]))  #' Add internal standard metadata fData(eic_is)$mz <- intern_standard$mz fData(eic_is)$rt <- intern_standard$RT fData(eic_is)$name <- intern_standard$name fData(eic_is)$abbreviation <- intern_standard$abbreviation rownames(fData(eic_is)) <- intern_standard$abbreviation  #' Summary of IS information fData(eic_is)[, c(\"name\", \"mz\", \"rt\")] |>     kable(format = \"pipe\") #' Extract the two IS from the chromatogram object. eic_cystine <- eic_is[\"cystine_13C_15N\"] eic_met <- eic_is[\"methionine_13C_15N\"]  #' plot both EIC par(mfrow = c(1, 2), mar = c(4, 2, 2, 0.5)) plot(eic_cystine, main = fData(eic_cystine)$name, cex.axis = 0.8,      cex.main = 0.8,      col = paste0(col_sample, 80)) grid() abline(v = fData(eic_cystine)$rt, col = \"red\", lty = 3)  plot(eic_met, main = fData(eic_met)$name, cex.axis = 0.8, cex.main = 0.8,      col = paste0(col_sample, 80)) grid() abline(v = fData(eic_met)$rt, col = \"red\", lty = 3) legend(\"topright\", col = col_phenotype, legend = names(col_phenotype), lty = 1,        bty = \"n\") #' extract endogenous cystine mass and EIC and plot. cysmass <- calculateMass(\"C6H12N2O4S2\") cys_endo <- mass2mz(cysmass, adduct = \"[M+H]+\")[, 1]  #' Plot versus spiked par(mfrow = c(1, 2)) chromatogram(lcms1, mz = cys_endo + c(-0.005, 0.005),              rt = unlist(fData(eic_cystine)[, c(\"rtmin\", \"rtmax\")]),              aggregationFun = \"max\") |>     plot(col = paste0(col_sample, 80)) |>     grid()  plot(eic_cystine, col = paste0(col_sample, 80)) grid() legend(\"topright\", col = col_phenotype, legend = names(col_phenotype), lty = 1,        bty = \"n\")"},{"path":"https://rformassspectrometry.github.io/metabonaut/articles/a-end-to-end-untargeted-metabolomics.html","id":"spectra-data-visualization-bps","dir":"Articles","previous_headings":"","what":"Spectra Data Visualization: BPS","title":"Complete end-to-end LC-MS/MS Metabolomic Data analysis","text":"BPS collapses data retention time dimension reveals prevalent ions present samples, creation BPS however straightforward. Mass peaks, even representing signals ion, never identical m/z values consecutive spectra due measurement error/resolution instrument. use combineSpectra function combine spectra one file (defined using parameter f = fromFile(data)) single spectrum. mass peaks difference m/z value smaller 3 parts-per-million (ppm) combined one mass peak, intensity representing maximum grouped mass peaks. reduce memory requirement, addition first bin spectrum combining mass peaks within spectrum, aggregating mass peaks bins 0.01 m/z width. case large datasets, also recommended set processingChunkSize() parameter MsExperiment object finite value (default Inf) causing data processed (loaded memory) chunks processingChunkSize() spectra. can reduce memory demand speed process. can now generate BPS sample plot() . , observable overlap ion content files, particularly around 300 m/z 700 m/z. however also differences sets samples. particular, BPS 1, 4, 7 10 (counting row-wise left right) seem different others. fact, four BPS QC samples, remaining six study samples. observed differences might explained fact QC samples pools serum samples different cohort, study samples represent plasma samples, different sample collection. Next visual inspection , can also calculate express similarity BPS heatmap. use compareSpectra() function calculate pairwise similarities BPS use pheatmap() function pheatmap package cluster visualize result. get first glance different samples distribute terms similarity. heatmap confirms observations made BPS, showing distinct clusters QCs study samples, owing different matrices sample collections. also strongly recommended delve deeper data exploring detail. can accomplished carefully assessing data extracting spectra regions interest examination. next chunk, look extract information specific spectrum distinct samples.  Figure 3. Intensity m/z values 125th spectrum two CTR samples. significant dissimilarities peak distribution intensity confirm difference composition QCs study samples. next compare full MS1 spectrum CVD CTR sample.  Figure 4. Intensity m/z values 125th spectrum one CVD one CTR sample. , can observe spectra CVD CTR samples entirely similar, exhibit similar main peaks 200 600 m/z general higher intensity control samples. However peak distribution (least intensity) seems vary m/z 10 210 m/z 600. CTR spectrum exhibits significant peaks around m/z 150 - 200 much lower intensity CVD sample. delve details specific spectrum, wide range functions can employed: Table 3. Intensity m/z values 125th spectrum one CTR sample.","code":"#' Setting the chunksize chunksize <- 1000 processingChunkSize(spectra(lcms1)) <- chunksize #' Combining all spectra per file into a single spectrum bps <- spectra(lcms1) |>     bin(binSize = 0.01) |>     combineSpectra(f = fromFile(lcms1), intensityFun = max, ppm = 3)  #' Plot the base peak spectra par(mar = c(2, 1, 1, 1)) plotSpectra(bps, main= \"\") #' Calculate similarities between BPS sim_matrix <- compareSpectra(bps)  #' Add sample names as rownames and colnames rownames(sim_matrix) <- colnames(sim_matrix) <- sampleData(lcms1)$sample_name ann <- data.frame(phenotype = sampleData(lcms1)[, \"phenotype\"]) rownames(ann) <- rownames(sim_matrix)  #' Plot the heatmap pheatmap(sim_matrix, annotation_col = ann,          annotation_colors = list(phenotype = col_phenotype)) #' Accessing a single spectrum - comparing with QC par(mfrow = c(1,2), mar = c(2, 2, 2, 2)) spec1 <- spectra(lcms1[1])[125] spec2 <- spectra(lcms1[3])[125] plotSpectra(spec1, main = \"QC sample\") plotSpectra(spec2, main = \"CTR sample\") #' Accessing a single spectrum - comparing CVD and CTR par(mfrow = c(1,2), mar = c(2, 2, 2, 2)) spec1 <- spectra(lcms1[2])[125] spec2 <- spectra(lcms1[3])[125] plotSpectra(spec1, main = \"CVD sample\") plotSpectra(spec2, main = \"CTR sample\") #' Checking its intensity intensity(spec2) NumericList of length 1 [[1]] 18.3266733266736 45.1666666666667 ... 27.1048951048951 34.9020979020979 #' Checking its rtime rtime(spec2) [1] 34.872 #' Checking its m/z mz(spec2) NumericList of length 1 [[1]] 51.1677328505635 53.0461968245186 ... 999.139446289161 999.315208803072 #' Filtering for a specific m/z range and viewing in a tabular format filt_spec <- filterMzRange(spec2,c(50,200))  data.frame(intensity = unlist(intensity(filt_spec)),            mz = unlist(mz(filt_spec))) |>   head() |> kable(format = \"markdown\")"},{"path":"https://rformassspectrometry.github.io/metabonaut/articles/a-end-to-end-untargeted-metabolomics.html","id":"chromatographic-data-visualization-bpc-and-tic","dir":"Articles","previous_headings":"","what":"Chromatographic Data Visualization: BPC and TIC","title":"Complete end-to-end LC-MS/MS Metabolomic Data analysis","text":"chromatogram() function facilitates extraction intensities along retention time. However, access chromatographic information currently efficient seamless spectral information. Work underway develop/improve infrastructure chromatographic data new Chromatograms object aimed flexible user-friendly Spectra object. visualizing LC-MS data, BPC TIC serves valuable tool assess performance liquid chromatography across various samples experiment. case, extract BPC data create plot. BPC captures maximum peak signal spectrum data file plots information retention time spectrum y-axis. BPC can extracted using chromatogram function. setting parameter aggregationFun = \"max\", instruct function report maximum signal per spectrum. Conversely, setting aggregationFun = \"sum\", sums intensities spectrum, thereby creating TIC.  Figure 5. BPC samples colored phenotype. 240 seconds signal seems measured. Thus, filter data removing part well first 10 seconds measured LC run.  Figure 6. BPC filtering retention time. Initially, examined entire BPC subsequently filtered based desired retention times. results smaller file size also facilitates straightforward interpretation BPC. final plot illustrates BPC sample colored phenotype, providing insights signal measured along retention times sample. reveals points compounds eluted LC column. essence, BPC condenses three-dimensional LC-MS data (m/z retention time intensity) two dimensions (retention time intensity). can also compare similarities BPCs heatmap. retention times however identical different samples. Thus bin() chromatographic signal per sample along retention time axis bins two seconds resulting data number bins/data points. can calculate pairwise similarities data vectors using cor() function visualize result using pheatmap().  Figure 7. Heatmap BPC similarities. heatmap reinforces exploration spectra data showed, strong separation QC study samples. important bear mind later analyses. Additionally, study samples group two clusters, cluster containing samples C F cluster II samples. plot TIC samples, using different color cluster.  Figure 8. Example TIC unusual signal. TIC samples look similar, samples cluster show different signal retention time range 40 160 seconds. Whether, strong difference impact following analysis remains determined. Throughout entire process, crucial reference points within dataset, well-known ions. experiments nowadays include internal standards (), case . strongly recommend using visualization throughout entire analysis. experiment, set 15 spiked samples. reviewing signal , selected two guide analysis process. However, also advise plot evaluate ions steps. illustrate , generate Extracted Ion Chromatograms (EIC) selected test ions. restricting MS data intensities within restricted, small m/z range selected retention time window, EICs expected contain signal single type ion. expected m/z retention times set determined different experiment. Additionally, cases internal standards available, commonly present ions sample matrix can serve suitable alternatives. Ideally, compounds distributed across entire retention time range experiment. Table 4. Internal standard list respective m/z expected retention time [s]. plot EICs isotope labeled cystine methionine.  Figure 9. EIC cystine methionine. can observe clear concentration difference QCs study samples isotope labeled cystine ion. Meanwhile, labeled methionine internal standard exhibits discernible signal amidst noise noticeable retention time shift samples. artificially isotope labeled compounds spiked individual samples, also signal endogenous compounds serum (plasma) samples. Thus, calculate next mass m/z [M+H]+ ion endogenous cystine chemical formula extract also EIC ion. calculation exact mass m/z selected ion adduct use calculateMass() mass2mz() functions MetaboCoreUtils package.  Figure 10. EIC endogenous cystine vs spiked. two cystine EICs look highly similar (endogenous shown left, isotope labeled right plot ), shift m/z, arises artificial labeling. shift allows us discriminate endogenous non-endogenous compound.","code":"#' Extract and plot BPC for full data bpc <- chromatogram(lcms1, aggregationFun = \"max\")  plot(bpc, col = paste0(col_sample, 80), main = \"BPC\", lwd = 1.5) grid() legend(\"topright\", col = col_phenotype,        legend = names(col_phenotype), lty = 1, lwd = 2, horiz = TRUE,        bty = \"n\") #' Filter the data based on retention time lcms1 <- filterRt(lcms1, c(10, 240)) Filter spectra bpc <- chromatogram(lcms1, aggregationFun = \"max\")  #' Plot after filtering plot(bpc, col = paste0(col_sample, 80),      main = \"BPC after filtering retention time\", lwd = 1.5) grid() legend(\"topright\", col = col_phenotype,        legend = names(col_phenotype), lty = 1, lwd = 2, horiz = TRUE, bty = \"n\") #' Total ion chromatogram tic <- chromatogram(lcms1, aggregationFun = \"sum\") |>   bin(binSize = 2)  #' Calculate similarity (Pearson correlation) between BPCs ticmap <- do.call(cbind, lapply(tic, intensity)) |>   cor()  rownames(ticmap) <- colnames(ticmap) <- sampleData(lcms1)$sample_name ann <- data.frame(phenotype = sampleData(lcms1)[, \"phenotype\"]) rownames(ann) <- rownames(ticmap)  #' Plot heatmap pheatmap(ticmap, annotation_col = ann,          annotation_colors = list(phenotype = col_phenotype)) cluster_I_idx <- sampleData(lcms1)$sample_name %in% c(\"F\", \"C\") cluster_II_idx <- sampleData(lcms1)$sample_name %in% c(\"A\", \"B\", \"D\", \"E\")  temp_col <- c(\"grey\", \"red\") names(temp_col) <- c(\"Cluster II\", \"Cluster I\") col <- rep(temp_col[1], length(lcms1)) col[cluster_I_idx] <- temp_col[2] col[sampleData(lcms1)$phenotype == \"QC\"] <- NA  lcms1 |>     chromatogram(aggregationFun = \"sum\") |>     plot( col = col,      main = \"TIC after filtering retention time\", lwd = 1.5) grid() legend(\"topright\", col = temp_col,        legend = names(temp_col), lty = 1, lwd = 2,        horiz = TRUE, bty = \"n\") #' Load our list of standard intern_standard <- read.delim(\"intern_standard_list.txt\")  # Extract EICs for the list eic_is <- chromatogram(     lcms1,     rt = as.matrix(intern_standard[, c(\"rtmin\", \"rtmax\")]),     mz = as.matrix(intern_standard[, c(\"mzmin\", \"mzmax\")]))  #' Add internal standard metadata fData(eic_is)$mz <- intern_standard$mz fData(eic_is)$rt <- intern_standard$RT fData(eic_is)$name <- intern_standard$name fData(eic_is)$abbreviation <- intern_standard$abbreviation rownames(fData(eic_is)) <- intern_standard$abbreviation  #' Summary of IS information fData(eic_is)[, c(\"name\", \"mz\", \"rt\")] |>     kable(format = \"pipe\") #' Extract the two IS from the chromatogram object. eic_cystine <- eic_is[\"cystine_13C_15N\"] eic_met <- eic_is[\"methionine_13C_15N\"]  #' plot both EIC par(mfrow = c(1, 2), mar = c(4, 2, 2, 0.5)) plot(eic_cystine, main = fData(eic_cystine)$name, cex.axis = 0.8,      cex.main = 0.8,      col = paste0(col_sample, 80)) grid() abline(v = fData(eic_cystine)$rt, col = \"red\", lty = 3)  plot(eic_met, main = fData(eic_met)$name, cex.axis = 0.8, cex.main = 0.8,      col = paste0(col_sample, 80)) grid() abline(v = fData(eic_met)$rt, col = \"red\", lty = 3) legend(\"topright\", col = col_phenotype, legend = names(col_phenotype), lty = 1,        bty = \"n\") #' extract endogenous cystine mass and EIC and plot. cysmass <- calculateMass(\"C6H12N2O4S2\") cys_endo <- mass2mz(cysmass, adduct = \"[M+H]+\")[, 1]  #' Plot versus spiked par(mfrow = c(1, 2)) chromatogram(lcms1, mz = cys_endo + c(-0.005, 0.005),              rt = unlist(fData(eic_cystine)[, c(\"rtmin\", \"rtmax\")]),              aggregationFun = \"max\") |>     plot(col = paste0(col_sample, 80)) |>     grid()  plot(eic_cystine, col = paste0(col_sample, 80)) grid() legend(\"topright\", col = col_phenotype, legend = names(col_phenotype), lty = 1,        bty = \"n\")"},{"path":"https://rformassspectrometry.github.io/metabonaut/articles/a-end-to-end-untargeted-metabolomics.html","id":"known-compounds","dir":"Articles","previous_headings":"Data visualization and general quality assessment","what":"Known compounds","title":"Complete end-to-end LC-MS/MS Metabolomic Data analysis","text":"Throughout entire process, crucial reference points within dataset, well-known ions. experiments nowadays include internal standards (), case . strongly recommend using visualization throughout entire analysis. experiment, set 15 spiked samples. reviewing signal , selected two guide analysis process. However, also advise plot evaluate ions steps. illustrate , generate Extracted Ion Chromatograms (EIC) selected test ions. restricting MS data intensities within restricted, small m/z range selected retention time window, EICs expected contain signal single type ion. expected m/z retention times set determined different experiment. Additionally, cases internal standards available, commonly present ions sample matrix can serve suitable alternatives. Ideally, compounds distributed across entire retention time range experiment. Table 4. Internal standard list respective m/z expected retention time [s]. plot EICs isotope labeled cystine methionine.  Figure 9. EIC cystine methionine. can observe clear concentration difference QCs study samples isotope labeled cystine ion. Meanwhile, labeled methionine internal standard exhibits discernible signal amidst noise noticeable retention time shift samples. artificially isotope labeled compounds spiked individual samples, also signal endogenous compounds serum (plasma) samples. Thus, calculate next mass m/z [M+H]+ ion endogenous cystine chemical formula extract also EIC ion. calculation exact mass m/z selected ion adduct use calculateMass() mass2mz() functions MetaboCoreUtils package.  Figure 10. EIC endogenous cystine vs spiked. two cystine EICs look highly similar (endogenous shown left, isotope labeled right plot ), shift m/z, arises artificial labeling. shift allows us discriminate endogenous non-endogenous compound.","code":"#' Load our list of standard intern_standard <- read.delim(\"intern_standard_list.txt\")  # Extract EICs for the list eic_is <- chromatogram(     lcms1,     rt = as.matrix(intern_standard[, c(\"rtmin\", \"rtmax\")]),     mz = as.matrix(intern_standard[, c(\"mzmin\", \"mzmax\")]))  #' Add internal standard metadata fData(eic_is)$mz <- intern_standard$mz fData(eic_is)$rt <- intern_standard$RT fData(eic_is)$name <- intern_standard$name fData(eic_is)$abbreviation <- intern_standard$abbreviation rownames(fData(eic_is)) <- intern_standard$abbreviation  #' Summary of IS information fData(eic_is)[, c(\"name\", \"mz\", \"rt\")] |>     kable(format = \"pipe\") #' Extract the two IS from the chromatogram object. eic_cystine <- eic_is[\"cystine_13C_15N\"] eic_met <- eic_is[\"methionine_13C_15N\"]  #' plot both EIC par(mfrow = c(1, 2), mar = c(4, 2, 2, 0.5)) plot(eic_cystine, main = fData(eic_cystine)$name, cex.axis = 0.8,      cex.main = 0.8,      col = paste0(col_sample, 80)) grid() abline(v = fData(eic_cystine)$rt, col = \"red\", lty = 3)  plot(eic_met, main = fData(eic_met)$name, cex.axis = 0.8, cex.main = 0.8,      col = paste0(col_sample, 80)) grid() abline(v = fData(eic_met)$rt, col = \"red\", lty = 3) legend(\"topright\", col = col_phenotype, legend = names(col_phenotype), lty = 1,        bty = \"n\") #' extract endogenous cystine mass and EIC and plot. cysmass <- calculateMass(\"C6H12N2O4S2\") cys_endo <- mass2mz(cysmass, adduct = \"[M+H]+\")[, 1]  #' Plot versus spiked par(mfrow = c(1, 2)) chromatogram(lcms1, mz = cys_endo + c(-0.005, 0.005),              rt = unlist(fData(eic_cystine)[, c(\"rtmin\", \"rtmax\")]),              aggregationFun = \"max\") |>     plot(col = paste0(col_sample, 80)) |>     grid()  plot(eic_cystine, col = paste0(col_sample, 80)) grid() legend(\"topright\", col = col_phenotype, legend = names(col_phenotype), lty = 1,        bty = \"n\")"},{"path":"https://rformassspectrometry.github.io/metabonaut/articles/a-end-to-end-untargeted-metabolomics.html","id":"data-preprocessing","dir":"Articles","previous_headings":"","what":"Data preprocessing","title":"Complete end-to-end LC-MS/MS Metabolomic Data analysis","text":"Preprocessing stands inaugural step analysis untargeted LC-MS. characterized 3 main stages: chromatographic peak detection, retention time shift correction (alignment) correspondence results features defined. primary objective preprocessing quantification signals ions measured sample, addressing potential retention time drifts samples, ensuring alignment quantified signals across samples within experiment. final result LC-MS data preprocessing numeric matrix abundances quantified entities samples experiment. initial preprocessing step involves detecting intensity peaks along retention time axis, called chromatographic peaks. achieve , employ findChromPeaks() function within xcms. function supports various algorithms peak detection, can selected configured respective parameter objects. preferred algorithm case, CentWave, utilizes continuous wavelet transformation (CWT)-based peak detection [@tautenhahn_highly_2008]. method known effectiveness handling non-Gaussian shaped chromatographic peaks peaks varying retention time widths, commonly encountered HILIC separations. apply CentWave algorithm default settings extracted ion chromatogram cystine methionine ions evaluate results. CentWave highly performant algorithm, requires costumized dataset. implies parameters fine-tuned based user’s data. example serves clear motivation users familiarize various parameters need adapt data set. discuss main parameters can easily adjusted suit user’s dataset: peakwidth: Specifies minimal maximal expected width peaks retention time dimension. Highly dependent chromatographic settings used. ppm: maximal allowed difference mass peaks’ m/z values (parts-per-million) consecutive scans consider representing signal ion. integrate: parameter defines integration method. , primarily use integrate = 2 integrates also signal chromatographic peak’s tail considered accurate developers. determine peakwidth, recommend users refer previous EICs estimate range peak widths observe dataset. Ideally, examining multiple EICs goal. dataset, peak widths appear around 2 10 seconds. advise choosing range wide narrow peakwidth parameter can lead false positives negatives. determine ppm, deeper analysis dataset needed. clarified ppm depends instrument, users necessarily input vendor-advertised ppm. ’s determine accurately possible: following steps involve generating highly restricted MS area single mass peak per spectrum, representing cystine ion. m/z peaks extracted, absolute difference calculated finally expressed ppm. therefore, choose value close maximum within range parameter ppm, .e., 15 ppm. can now perform chromatographic peak detection adapted settings EICs. important note , properly estimate background noise, sufficient data points outside chromatographic peak need present. generally problem peak detection performed full LC-MS data set, peak detection EICs retention time range EIC needs sufficiently wide. function fails find peak EIC, initial troubleshooting step increase range. Additionally, signal--noise threshold snthresh reduced peak detection EICs, within small retention time range, enough signal present properly estimate background noise. Finally, case MS1 data points per peaks, setting CentWave’s advanced parameter extendLengthMSW TRUE can help peak detection. customized parameters, chromatographic peak detected sample. , use plot() function EICs visualize results.  Figure 11. Chromatographic peak detection EICs. can see peak seems ot detected sample ions. indicates custom settings seem thus suitable dataset. now proceed apply entire dataset, extracting EICs ions evaluate confirm chromatographic peak detection worked expected. Note: revert value parameter snthresh default, , mentioned , background noise estimation reliable performed full data set. Parameter chunkSize findChromPeaks() defines number data files loaded memory processed simultaneously. parameter thus allows fine-tune memory demand well performance chromatographic peak detection step. plot EICs two selected internal standards evaluate chromatographic peak detection results.  Figure 12. Chromatographic peak detection EICs processing. Peaks seem detected properly samples ions. indicates peak detection process entire dataset successful. identification chromatographic peaks using CentWave algorithm can sometimes result artifacts, overlapping split peaks. address issue, refineChromPeaks() function utilized, conjunction MergeNeighboringPeaksParam, aims merging split peaks. show examples CentWave peak detection artifacts. examples pre-selected illustrate necessity next step:  Figure 13. Examples CentWave peak detection artifacts. cases signal presumably single type ion split two separate chromatographic peaks (indicated vertical line). MergeNeigboringPeaksParam allows combine split peaks. parameters algorithm defined : expandMz: Suggested kept relatively small (0.0015) prevent merging isotopes. expandRt: Usually set approximately half size average retention time width used chromatographic peak detection (case, 2.5 seconds). minProp: Used determine whether candidates merged. Chromatographic peaks overlapping m/z ranges (expanded side expandMz) tail--head distance retention time dimension less 2 * expandRt, signal higher minProp apex intensity chromatographic peak lower intensity, merged. Values parameter small avoid merging closely co-eluting ions, isomers. test settings EICs split peaks.  Figure 14. Examples CentWave peak detection artifacts merging. can observe artificially split peaks appropriately merged. Therefore, next apply settings entire dataset. peak merging, column \"merged\" result object’s chromPeakData() data frame can used evaluate chromatographic peaks result represent signal merged, originally identified chromatographic peaks. proceeding next preprocessing step generally suggested evaluate results chromatographic peak detection EICs e.g. internal standards compounds/ions known present samples. Additionally, evaluating comparing number identified chromatographic peaks samples data set can help spotting potentially problematic samples. count number chromatographic peaks per sample show numbers table. Table 5. Samples number identified chromatographic peaks. similar number chromatographic peaks identified within various samples data set. Additional options evaluate results chromatographic peak detection can implemented using plotChromPeaks() function summarizing results using base R commands. Despite using chromatographic settings conditions retention time shifts unavoidable. Indeed, performance instrument can change time, example due small variations environmental conditions, temperature pressure. shifts generally small samples measured within batch/measurement run, can considerable data experiment acquired across longer time period. evaluate presence shift extract plot BPC QC samples.  Figure 15. BPC QC samples. QC samples representing sample (pool) measured regular intervals measurement run experiment measured day. Still, small shifts can observed, especially region 100 150 seconds. facilitate proper correspondence signals across samples (hence definition LC-MS features), essential minimize differences retention times. Theoretically, proceed two steps: first select QC samples dataset first alignment , using -called anchor peaks. way can assume linear shift time, since always measuring sample different regular time intervals. Despite external QCs data set, still use subset-based alignment assuming retention time shifts independent different sample matrix (human serum plasma) instead mostly instrument-dependent. Note also possible manually specify anchor peaks, respectively retention times align data set external, reference, data set. information provided vignettes xcms package. calculating much adjust retention time samples, apply shift also study samples. xcms retention time alignment can performed using adjustRtime() function alignment algorithm. example use PeakGroups method [@smith_xcms_2006] performs alignment minimizing differences retention times set anchor peaks different samples. method requires initial correspondence analysis match/group chromatographic peaks across samples algorithm selects anchor peaks alignment. initial correspondence, use PeakDensity approach [@smith_xcms_2006] groups chromatographic peaks similar m/z retention time LC-MS features. parameters algorithm, can configured using PeakDensityParam object, sampleGroups, minFraction, binSize, ppm bw. binSize, ppm bw allow specify similar chromatographic peaks’ m/z retention time values need consider grouping feature. binSize ppm define required similarity m/z values. Within m/z bin (defined binSize ppm) areas along retention time axis high chromatographic peak density (considering peaks samples) identified, chromatographic peaks within regions considered grouping feature. High density areas identified using base R density() function, bw parameter: higher values define wider retention time areas, lower values require chromatographic peaks similar retention times. parameter can seen black line plot , corresponding smoothness density curve. Whether candidate peaks get grouped feature depends also parameters sampleGroups minFraction: sampleGroups provide, sample, sample group belongs . minFraction expected value 0 1 defining proportion samples within least one sample groups (defined sampleGroups) chromatographic peaks detected group feature. initial correspondence, parameters don’t need fully optimized. Selection dataset-specific parameter values described detail next section. dataset, use small values binSize ppm , importantly, also parameter bw, since data set ultra high performance (UHP) LC setup used. minFraction use high value (0.9) ensure features defined chromatographic peaks present almost samples one sample group (can used anchor peaks actual alignment). base alignment later QC samples hence define sampleGroups binary variable grouping samples either study, QC group.  Figure 16. Initial correspondence analysis. PeakGroups-based alignment can next performed using adjustRtime() function PeakGroupsParam parameter object. parameters algorithm : subsetAdjust subset: Allows subset alignment. base retention time alignment QC samples, .e., retention time shifts estimated based repeatedly measured samples. resulting adjustment applied entire data. data sets QC samples (e.g. sample pools) measured repeatedly, strongly suggest use method. Note also subset-based alignment samples ordered injection index (.e., order measured measurement run). minFraction: value 0 1 defining proportion samples (full data set, data subset defined subset) chromatographic peak identified use anchor peak. contrast PeakDensityParam parameter used define proportion within sample group. span: PeakGroups method allows, depending data, adjust regions along retention time axis differently. enable local alignments LOESS function used parameter defines degree smoothing function. Generally, values 0.4 0.6 used, however, suggested evaluate alignment results eventually adapt parameters result satisfactory. perform alignment data set based retention times anchor peaks defined subset QC samples. Alignment adjusted retention times spectra data set, well retention times identified chromatographic peaks. alignment performed, user evaluate results using plotAdjustedRtime() function. function visualizes difference adjusted raw retention time sample y-axis along adjusted retention time x-axis. Dot points represent position used anchor peak along retention time axis. optimal alignment areas along retention time axis, anchor peaks scattered retention time dimension.  Figure 17. Retention time alignment results. samples present data set measured within measurement run, resulting small retention time shifts. Therefore, little adjustments needed performed (shifts maximum 1 second can seen plot ). Generally, magnitude adjustment seen plots match expectation analyst. can also compare BPC alignment. get original data, .e. raw retention times, can use dropAdjustedRtime() function:  Figure 18. BPC alignment. largest shift can observed retention time range 120 130s. Apart retention time range, little changes can observed. next evaluate impact alignment EICs selected internal standards. thus first extract ion chromatograms alignment. can now evaluate alignment effect test ions. plot EICs alignment isotope labeled cystine methionine.  Figure 19. EICs cystine methionine alignment. non-endogenous cystine ion already well aligned difference minimal. methionine ion, however, shows improvement alignment. addition visual inspection results, also evaluate impact alignment comparing variance retention times internal standards alignment. end, first need identify chromatographic peaks sample m/z retention time close expected values internal standard. use matchValues() function MetaboAnnotation package [@rainer_modular_2022] using MzRtParam method identify chromatographic peaks similar m/z (+/- 50 ppm) retention time (+/- 10 seconds) internal standard’s values. parameters mzColname rtColname specify column names query () target (chromatographic peaks) contain m/z retention time values match entities. perform matching separately sample. internal standard every sample, use filterMatches() function SingleMatchParam() parameter select chromatographic peak highest intensity. now internal standard ID chromatographic peak sample likely represents signal ion. can now extract retention times chromatographic peaks alignment. can now evaluate impact alignment retention times internal standards across full data set:  Figure 20. Retention time variation internal standards alignment. average, variation retention times internal standards across samples slightly reduced alignment. briefly touched subject correspondence determine anchor peaks alignment. Generally, goal correspondence analysis identify chromatographic peaks originate types ions samples experiment group LC-MS features. point, proper configuration parameter bw crucial. illustrate sensible choices parameter’s value can made. use plotChromPeakDensity() function simulate correspondence analysis default values PeakGroups extracted ion chromatograms two selected isotope labeled ions. plot shows EIC top panel, apex position chromatographic peaks different samples (y-axis), along retention time (x-axis) lower panel.  Figure 21. Initial correspondence analysis, Cystine.  Figure 22. Initial correspondence analysis, Methionine. Grouping peaks depends smoothness previousl mentionned density curve can configured parameter bw. seen , smoothness high properly group features. looking default parameters, can observe indeed, bw parameter set bw = 30, high modern UHPLC-MS setups. reduce value parameter 1.8 evaluate impact.  Figure 23. Correspondence analysis optimized parameters, Cystine.  Figure 24. Correspondence analysis optimized parameters, Methionine. can observe peaks now grouped accurately single feature test ion. important parameters optimized : binsize: data generated high resolution MS instrument, thus select low value paramete. ppm: TOF instruments, suggested use value ppm larger 0 accommodate higher measurement error instrument larger m/z values. minFraction: set minFraction = 0.75, hence defining features chromatographic peak identified least 75% samples one sample groups. sampleGroups: use information available sampleData’s \"phenotype\" column. correspondence analysis suggested evaluate results selected EICs. extract signal m/z similar isotope labeled methionine larger retention time range. Importantly, show actual correspondence results, set simulate = FALSE plotChromPeakDensity() function.  Figure 25. Correspondence analysis results, Methionine. hoped, signal two different ions now grouped separate features. Generally, correspondence results evaluated extracted chromatograms. Another interesting information look distribution features along retention time axis. Table 5. Distribution features along retention time axis. results correspondence analysis now stored, along results preprocessing steps, within XcmsExperiment result object. correspondence results, .e., definition LC-MS features, can extracted using featureDefinitions() function. data frame provides average m/z retention time (columns \"mzmed\" \"rtmed\") characterize LC-MS feature. Column, \"peakidx\" contains indices chromatographic peaks assigned feature. actual abundances features, represent also final preprocessing results, can extracted featureValues() function: can note features (e.g. F0003 F0006) missing values samples. expected certain degree samples features, respectively ions, need present. address next section. previously observed missing values (NA) attributed various reasons. Although might represent genuinely missing value, indicating ion (feature) truly present particular sample, also result failure preceding chromatographic peak detection step. crucial able recover missing values latter category much possible reduce eventual need data imputation. next examine prevalent missing values present dataset: can observe substantial number missing values values dataset. Let’s therefore delve process gap-filling. first evaluate example features chromatographic peak detected samples:  Figure 26. Examples chromatographic peaks missing values. instances, chromatographic peak identified one two selected samples (red line), hence missing value reported feature particular samples (blue line). However, cases, signal measured samples, thus, reporting missing value correct example. signal feature low, likely reason peak detection failed. rescue signal cases, fillChromPeaks() function can used ChromPeakAreaParam approach. method defines m/z-retention time area feature based detected peaks, signal respective ion expected. integrates intensities within area samples missing values feature. reported feature abundance. apply method using default parameters. fillChromPeaks() thus rescue missing data data set. Note , even sample ion present, worst case noise integrated, expected much lower actual chromatographic peak signal. Let’s look previously missing values :  Figure 27. Examples chromatographic peaks missing values gap-filling. gap-filling, also blue colored sample chromatographic peak present peak area reported feature abundance sample. assess effectiveness gap-filling method rescuing signals, can also plot average signal features least one missing value average filled-signal. advisable perform analysis repeatedly measured samples; case, QC samples used. , extract: Feature values detected chromatographic peaks setting filled = FALSE featuresValues() call. filled-signal first extracting detected gap-filled abundances replace values detected chromatographic peaks NA. , calculate row averages matrices plot .  detected (x-axis) gap-filled (y-axis) values QC samples highly correlated. Especially higher abundances, agreement high, low intensities, can expected, differences higher trending correlation line. , addition, fit linear regression line data summarize results linear regression line slope 1.12 intercept -1.62. indicates filled-signal average 1.12 times higher detected signal. final results LC-MS data preprocessing stored within XcmsExperiment object. includes identified chromatographic peaks, alignment results, well correspondence results. addition, guarantee reproducibility, result object keeps track performed processing steps, including individual parameter objects used configure . processHistory() function returns list various applied processing steps chronological order. , extract information first step performed preprocessing. processParam() function used extract actual parameter class used configure processing step. final result whole LC-MS data preprocessing two-dimensional matrix abundances -called LC-MS features samples. Note stage analysis features characterized m/z retention time don’t yet information metabolite feature represent. seen , feature matrix can extracted featureValues() function corresponding feature characteristics (.e., m/z retention time values) using featureDefinitions() function. Thus, two arrays extracted xcms result object used/imported analysis packages processing. example also exported tab delimited text files, used external tool, used, also MS2 spectra available, feature-based molecular networking GNPS analysis environment [@nothias_feature-based_2020]. processing R, reference link raw MS data required, suggested extract xcms preprocessing result using quantify() function SummarizedExperiment object, Bioconductor’s default container data biological assays/experiments. simplifies integration Bioconductor analysis packages. quantify() function takes parameters featureValues() function, thus, call extract SummarizedExperiment detected, gap-filled, feature abundances: Sample identifications xcms result’s sampleData() now available colData() (column, sample annotations) featureDefinitions() rowData() (row, feature annotations). feature values added first assay() SummarizedExperiment even processing history available object’s metadata(). SummarizedExperiment supports multiple assays, numeric matrices dimensions. thus add detected gap-filled feature abundances additional assay SummarizedExperiment. Feature abundances can extracted assay() function. extract first 6 lines detected gap-filled feature abundances: advantage, addition container full preprocessing results also possibility easy intuitive creation data subsets ensuring data integrity. example easy subset full data selection features /samples: moving next step analysis, advisable save preprocessing results. multiple format options save , can found MsIO package documentation. save XcmsExperiment object file format handled alabster framework, ensures object can easily read languages like Python Javascript well loaded easily back R.","code":"#' Use default Centwave parameter param <- CentWaveParam()  #' Look at the default parameters param Object of class:  CentWaveParam  Parameters:  - ppm: [1] 25  - peakwidth: [1] 20 50  - snthresh: [1] 10  - prefilter: [1]   3 100  - mzCenterFun: [1] \"wMean\"  - integrate: [1] 1  - mzdiff: [1] -0.001  - fitgauss: [1] FALSE  - noise: [1] 0  - verboseColumns: [1] FALSE  - roiList: list()  - firstBaselineCheck: [1] TRUE  - roiScales: numeric(0)  - extendLengthMSW: [1] FALSE  - verboseBetaColumns: [1] FALSE #' Evaluate for Cystine cystine_test <- findChromPeaks(eic_cystine, param = param) chromPeaks(cystine_test) rt rtmin rtmax into intb maxo sn row column #' Evaluate for Methionine met_test <- findChromPeaks(eic_met, param = param) chromPeaks(met_test) rt rtmin rtmax into intb maxo sn row column #' Restrict the data to signal from cystine in the first sample cst <- lcms1[1L] |>   spectra() |>   filterRt(rt = c(208, 218)) |>   filterMzRange(mz = fData(eic_cystine)[\"cystine_13C_15N\", c(\"mzmin\", \"mzmax\")])  #' Show the number of peaks per m/z filtered spectra lengths(cst) [1] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 #' Calculate the difference in m/z values between scans mz_diff <- cst |>     mz() |>     unlist() |>     diff() |>     abs()  #' Express differences in ppm range(mz_diff * 1e6 / mean(unlist(mz(cst)))) [1]  0.08829605 14.82188728 #' Parameters adapted for chromatographic peak detection on EICs. param <- CentWaveParam(peakwidth = c(1, 8), ppm = 15, integrate = 2,                        snthresh = 2)  #' Evaluate on the cystine ion cystine_test <- findChromPeaks(eic_cystine, param = param) chromPeaks(cystine_test) rt   rtmin   rtmax      into      intb      maxo sn row column  [1,] 209.251 207.577 212.878  4085.675  2911.376  2157.459  4   1      1  [2,] 209.251 206.182 213.995 24625.728 19074.407 12907.487  4   1      2  [3,] 209.252 207.020 214.274 19467.836 14594.041  9996.466  4   1      3  [4,] 209.251 207.577 212.041  4648.229  3202.617  2458.485  3   1      4  [5,] 208.974 206.184 213.159 23801.825 18126.978 11300.289  3   1      5  [6,] 209.250 207.018 213.714 25990.327 21036.768 13650.329  5   1      6  [7,] 209.252 207.857 212.879  4528.767  3259.039  2445.841  4   1      7  [8,] 209.252 207.299 213.995 23119.449 17274.140 12153.410  4   1      8  [9,] 208.972 206.740 212.878 28943.188 23436.119 14451.023  4   1      9 [10,] 209.252 207.578 213.437  4470.552  3065.402  2292.881  4   1     10 #' Evaluate on the methionine ion met_test <- findChromPeaks(eic_met, param = param) chromPeaks(met_test) rt   rtmin   rtmax     into     intb      maxo sn row column  [1,] 159.867 157.913 162.378 20026.61 14715.42 12555.601  4   1      1  [2,] 160.425 157.077 163.215 16827.76 11843.39  8407.699  3   1      2  [3,] 160.425 157.356 163.215 18262.45 12881.67  9283.375  3   1      3  [4,] 159.588 157.635 161.820 20987.72 15424.25 13327.811  4   1      4  [5,] 160.985 156.799 163.217 16601.72 11968.46 10012.396  4   1      5  [6,] 160.982 157.634 163.214 17243.24 12389.94  9150.079  4   1      6  [7,] 159.867 158.193 162.099 21120.10 16202.05 13531.844  3   1      7  [8,] 160.426 157.356 162.937 18937.40 13739.73 10336.000  3   1      8  [9,] 160.704 158.472 163.215 17882.21 12299.43  9395.548  3   1      9 [10,] 160.146 157.914 162.379 20275.80 14279.50 12669.821  3   1     10 #' Using the same settings, but with default snthresh param <- CentWaveParam(peakwidth = c(1, 8), ppm = 15, integrate = 2) lcms1 <- findChromPeaks(lcms1, param = param, chunkSize = 5)  #' Update EIC internal standard object eics_is_noprocess <- eic_is eic_is <- chromatogram(lcms1,,                        rt = as.matrix(intern_standard[, c(\"rtmin\", \"rtmax\")]),                        mz = as.matrix(intern_standard[, c(\"mzmin\", \"mzmax\")])) Processing chromatographic peaks fData(eic_is) <- fData(eics_is_noprocess) Processing chromatographic peaks #' set up the parameter param <- MergeNeighboringPeaksParam(expandRt = 2.5, expandMz = 0.0015,                                     minProp = 0.75)  #' Perform the peak refinement on the EICs eics <- refineChromPeaks(eics, param = param) plot(eics) #' Apply on whole dataset lcms1 <- refineChromPeaks(lcms1, param = param, chunkSize = 5) Reduced from 106714 to 89182 chromatographic peaks. chromPeakData(lcms1)$merged |>                       table() FALSE  TRUE 79908  9274 eics_is_chrompeaks <- eic_is  eic_is <- chromatogram(lcms1,                        rt = as.matrix(intern_standard[, c(\"rtmin\", \"rtmax\")]),                        mz = as.matrix(intern_standard[, c(\"mzmin\", \"mzmax\")])) Processing chromatographic peaks fData(eic_is) <- fData(eics_is_chrompeaks)  eic_cystine <- eic_is[\"cystine_13C_15N\", ] eic_met <- eic_is[\"methionine_13C_15N\", ] #' Count the number of peaks per sample and summarize them in a table. data.frame(sample_name = sampleData(lcms1)$sample_name,            peak_count = as.integer(table(chromPeaks(lcms1)[, \"sample\"]))) |>     kable(format = \"pipe\") #' Get QC samples QC_samples <- sampleData(lcms1)$phenotype == \"QC\"  #' extract BPC lcms1[QC_samples] |>     chromatogram(aggregationFun = \"max\", chromPeaks = \"none\") |>     plot(col = col_phenotype[\"QC\"], main = \"BPC of QC samples\") |>     grid() # Initial correspondence analysis param <- PeakDensityParam(sampleGroups = sampleData(lcms1)$phenotype == \"QC\",                           minFraction = 0.9,                           binSize = 0.01, ppm = 10,                           bw = 2) lcms1 <- groupChromPeaks(lcms1, param = param)  plotChromPeakDensity(     eic_cystine, param = param,     col = paste0(col_sample, \"80\"),     peakCol = col_sample[chromPeaks(eic_cystine)[, \"sample\"]],     peakBg = paste0(col_sample[chromPeaks(eic_cystine)[, \"sample\"]], 20),     peakPch = 16) #' Define parameters of choice subset <- which(sampleData(lcms1)$phenotype == \"QC\") param <- PeakGroupsParam(minFraction = 0.9, extraPeaks = 50, span = 0.5,                          subsetAdjust = \"average\",                          subset = subset)  #' Perform the alignment lcms1 <- adjustRtime(lcms1, param = param) Performing retention time correction using 5373 peak groups. Aligning sample number 2 against subset ... OK Aligning sample number 3 against subset ... OK Aligning sample number 5 against subset ... OK Aligning sample number 6 against subset ... OK Aligning sample number 8 against subset ... OK Aligning sample number 9 against subset ... OK #' Visualize alignment results plotAdjustedRtime(lcms1, col = paste0(col_sample, 80), peakGroupsPch = 1) grid() legend(\"topright\", col = col_phenotype,        legend = names(col_phenotype), lty = 1, bty = \"n\") #' Get data before alignment lcms1_raw <- dropAdjustedRtime(lcms1)  #' Apply the adjusted retention time to our dataset lcms1 <- applyAdjustedRtime(lcms1) #' Plot the BPC before and after alignment par(mfrow = c(2, 1), mar = c(2, 1, 1, 0.5)) chromatogram(lcms1_raw, aggregationFun = \"max\", chromPeaks = \"none\") |>     plot(main = \"BPC before alignment\", col = paste0(col_sample, 80)) grid() legend(\"topright\", col = col_phenotype,        legend = names(col_phenotype), lty = 1, bty = \"n\", horiz = TRUE)  chromatogram(lcms1, aggregationFun = \"max\", chromPeaks = \"none\") |>     plot(main = \"BPC after alignment\",          col = paste0(col_sample, 80)) grid() legend(\"topright\", col = col_phenotype,        legend = names(col_phenotype), lty = 1, bty = \"n\", horiz = TRUE) #' Store the EICs before alignment eics_is_refined <- eic_is  #' Update the EICs eic_is <- chromatogram(lcms1,                        rt = as.matrix(intern_standard[, c(\"rtmin\", \"rtmax\")]),                        mz = as.matrix(intern_standard[, c(\"mzmin\", \"mzmax\")])) Processing chromatographic peaks fData(eic_is) <- fData(eics_is_refined)  #' Extract the EICs for the test ions eic_cystine <- eic_is[\"cystine_13C_15N\"] eic_met <- eic_is[\"methionine_13C_15N\"] par(mfrow = c(2, 2), mar = c(4, 4.5, 2, 1))  old_eic_cystine <- eics_is_refined[\"cystine_13C_15N\"] plot(old_eic_cystine, main = \"Cystine before alignment\", peakType = \"none\",      col = paste0(col_sample, 80)) grid() abline(v = intern_standard[\"cystine_13C_15N\", \"RT\"], col = \"red\", lty = 3)  old_eic_met <- eics_is_refined[\"methionine_13C_15N\"] plot(old_eic_met, main = \"Methionine before alignment\",      peakType = \"none\", col = paste0(col_sample, 80)) grid() abline(v = intern_standard[\"methionine_13C_15N\", \"RT\"], col = \"red\", lty = 3)  plot(eic_cystine, main = \"Cystine after alignment\", peakType = \"none\",      col = paste0(col_sample, 80)) grid() abline(v = intern_standard[\"cystine_13C_15N\", \"RT\"], col = \"red\", lty = 3) legend(\"topright\", col = col_phenotype,        legend = names(col_phenotype), lty = 1, bty = \"n\")  plot(eic_met, main = \"Methionine after alignment\",      peakType = \"none\", col = paste0(col_sample, 80)) grid() abline(v = intern_standard[\"methionine_13C_15N\", \"RT\"], col = \"red\", lty = 3) #' Extract the matrix with all chromatographic peaks and add a column #' with the ID of the chromatographic peak chrom_peaks <- chromPeaks(lcms1) |> as.data.frame() chrom_peaks$peak_id <- rownames(chrom_peaks)  #' Define the parameters for the matching and filtering of the matches p_1 <- MzRtParam(ppm = 50, toleranceRt = 10) p_2 <- SingleMatchParam(duplicates = \"top_ranked\", column = \"target_maxo\",                         decreasing = TRUE)  #' Iterate over samples and identify for each the chromatographic peaks #' with similar m/z and retention time than the onse from the internal #' standard, and extract among them the ID of the peaks with the #' highest intensity. intern_standard_peaks <- lapply(seq_along(lcms1), function(i) {     tmp <- chrom_peaks[chrom_peaks[, \"sample\"] == i, , drop = FALSE]     mtch <- matchValues(intern_standard, tmp,                         mzColname = c(\"mz\", \"mz\"),                         rtColname = c(\"RT\", \"rt\"),                         param = p_1)     mtch <- filterMatches(mtch, p_2)     mtch$target_peak_id }) |>     do.call(what = cbind) #' Define the index of the selected chromatographic peaks in the #' full chromPeaks matrix idx <- match(intern_standard_peaks, rownames(chromPeaks(lcms1)))  #' Extract the raw retention times for these rt_raw <- chromPeaks(lcms1_raw)[idx, \"rt\"] |>     matrix(ncol = length(lcms1_raw))  #' Extract the adjusted retention times for these rt_adj <- chromPeaks(lcms1)[idx, \"rt\"] |>     matrix(ncol = length(lcms1_raw)) list(all_raw = rowSds(rt_raw, na.rm = TRUE),      all_adj = rowSds(rt_adj, na.rm = TRUE)      ) |>     vioplot(ylab = \"sd(retention time)\") grid() #' Default parameter for the grouping and apply them to the test ions BPC param <- PeakDensityParam(sampleGroups = sampleData(lcms1)$phenotype, bw = 30)  param Object of class:  PeakDensityParam  Parameters:  - sampleGroups:  [1] \"QC\"  \"CVD\" \"CTR\" \"QC\"  \"CTR\" \"CVD\" \"QC\"  \"CTR\" \"CVD\" \"QC\"  - bw: [1] 30  - minFraction: [1] 0.5  - minSamples: [1] 1  - binSize: [1] 0.25  - maxFeatures: [1] 50  - ppm: [1] 0 plotChromPeakDensity(     eic_cystine, param = param,     col = paste0(col_sample, \"80\"),     peakCol = col_sample[chromPeaks(eic_cystine)[, \"sample\"]],     peakBg = paste0(col_sample[chromPeaks(eic_cystine)[, \"sample\"]], 20),     peakPch = 16) plotChromPeakDensity(eic_met, param = param,     col = paste0(col_sample, \"80\"),     peakCol = col_sample[chromPeaks(eic_met)[, \"sample\"]],     peakBg = paste0(col_sample[chromPeaks(eic_met)[, \"sample\"]], 20),     peakPch = 16) #' Updating parameters param <- PeakDensityParam(sampleGroups = sampleData(lcms1)$phenotype, bw = 1.8)  plotChromPeakDensity(     eic_cystine, param = param,     col = paste0(col_sample, \"80\"),     peakCol = col_sample[chromPeaks(eic_cystine)[, \"sample\"]],     peakBg = paste0(col_sample[chromPeaks(eic_cystine)[, \"sample\"]], 20),     peakPch = 16) plotChromPeakDensity(eic_met, param = param,     col = paste0(col_sample, \"80\"),     peakCol = col_sample[chromPeaks(eic_met)[, \"sample\"]],     peakBg = paste0(col_sample[chromPeaks(eic_met)[, \"sample\"]], 20),     peakPch = 16) #' Define the settings for the param param <- PeakDensityParam(sampleGroups = sampleData(lcms1)$phenotype,                           minFraction = 0.75, binSize = 0.01, ppm = 10,                           bw = 1.8)  #' Apply to whole data lcms1 <- groupChromPeaks(lcms1, param = param) #' Extract chromatogram for an m/z similar to the one of the labeled methionine chr_test <- chromatogram(lcms1,                          mz = as.matrix(intern_standard[\"methionine_13C_15N\",                                                         c(\"mzmin\", \"mzmax\")]),                          rt = c(145, 200),                          aggregationFun = \"max\") Processing chromatographic peaks Processing features plotChromPeakDensity(     chr_test, simulate = FALSE,     col = paste0(col_sample, \"80\"),     peakCol = col_sample[chromPeaks(chr_test)[, \"sample\"]],     peakBg = paste0(col_sample[chromPeaks(chr_test)[, \"sample\"]], 20),     peakPch = 16) # Bin features per RT slices vc <- featureDefinitions(lcms1)$rtmed breaks <- seq(0, max(vc, na.rm = TRUE) + 1, length.out = 15) |>     round(0) cuts <- cut(vc, breaks = breaks, include.lowest = TRUE)  table(cuts) |>     kable(format = \"pipe\") #' Definition of the features featureDefinitions(lcms1) |>   head() mzmed    mzmin    mzmax    rtmed    rtmin    rtmax npeaks CTR CVD QC FT0001 50.98979 50.98949 50.99038 203.6001 203.1181 204.2331      8   1   3  4 FT0002 51.05904 51.05880 51.05941 191.1675 190.8787 191.5050      9   2   3  4 FT0003 51.98657 51.98631 51.98699 203.1467 202.6406 203.6710      7   0   3  4 FT0004 53.02036 53.02009 53.02043 203.2343 202.5652 204.0901     10   3   3  4 FT0005 53.52080 53.52051 53.52102 203.1936 202.8490 204.0901     10   3   3  4 FT0006 54.01007 54.00988 54.01015 159.2816 158.8499 159.4484      6   1   3  2             peakidx ms_level FT0001 7702, 16....        1 FT0002 7176, 16....        1 FT0003 7680, 17....        1 FT0004 7763, 17....        1 FT0005 8353, 17....        1 FT0006 5800, 15....        1 #' Extract feature abundances featureValues(lcms1, method = \"sum\") |>     head() MS_QC_POOL_1_POS.mzML MS_A_POS.mzML MS_B_POS.mzML MS_QC_POOL_2_POS.mzML FT0001              421.6162      689.2422            NA              481.7436 FT0002              710.8078      875.9192            NA              693.6997 FT0003              445.5711      613.4410            NA              497.8866 FT0004            16994.5260    24605.7340     19766.707            17808.0933 FT0005             3284.2664     4526.0531      3521.822             3379.8909 FT0006            10681.7476    10009.6602            NA            10800.5449        MS_C_POS.mzML MS_D_POS.mzML MS_QC_POOL_3_POS.mzML MS_E_POS.mzML FT0001            NA      635.2732              439.6086      570.5849 FT0002      781.2416      648.4344              700.9716     1054.0207 FT0003            NA      634.9370              449.0933            NA FT0004    22780.6683    22873.1061            16965.7762    23432.1252 FT0005     4396.0762     4317.7734             3270.5290     4533.8667 FT0006            NA     7296.4262                    NA     9236.9799        MS_F_POS.mzML MS_QC_POOL_4_POS.mzML FT0001      579.9360              437.0340 FT0002      534.4577              711.0361 FT0003      461.0465              232.1075 FT0004    22198.4607            16796.4497 FT0005     4161.0132             3142.2268 FT0006     6817.8785                    NA #' Percentage of missing values sum(is.na(featureValues(lcms1))) /     length(featureValues(lcms1)) * 100 [1] 26.41597 ftidx <- which(is.na(rowSums(featureValues(lcms1)))) fts <- rownames(featureDefinitions(lcms1))[ftidx] farea <- featureArea(lcms1, features = fts[1:2])  chromatogram(lcms1[c(2, 3)],              rt = farea[, c(\"rtmin\", \"rtmax\")],              mz = farea[, c(\"mzmin\", \"mzmax\")]) |>     plot(col = c(\"red\", \"blue\"), lwd = 2) Processing chromatographic peaks #' Fill in the missing values in the whole dataset lcms1 <- fillChromPeaks(lcms1, param = ChromPeakAreaParam(), chunkSize = 5)  #' Percentage of missing values after gap-filling sum(is.na(featureValues(lcms1))) /     length(featureValues(lcms1)) * 100 [1] 5.155492 Processing chromatographic peaks #' Get only detected signal in QC samples vals_detect <- featureValues(lcms1, filled = FALSE)[, QC_samples]  #' Get detected and filled-in signal vals_filled <- featureValues(lcms1)[, QC_samples]  #' Replace detected signal with NA vals_filled[!is.na(vals_detect)] <- NA  #' Identify features with at least one filled peak has_filled <- is.na(rowSums(vals_detect))  #' Calculate row averages for features with missing values avg_detect <- rowMeans(vals_detect[has_filled, ], na.rm = TRUE) avg_filled <- rowMeans(vals_filled[has_filled, ], na.rm = TRUE)  #' Plot the values against each other (in log2 scale) plot(log2(avg_detect), log2(avg_filled),      xlim = range(log2(c(avg_detect, avg_filled)), na.rm = TRUE),      ylim = range(log2(c(avg_detect, avg_filled)), na.rm = TRUE),      pch = 21, bg = \"#00000020\", col = \"#00000080\") grid() abline(0, 1) #' fit a linear regression line to the data l <- lm(log2(avg_filled) ~ log2(avg_detect)) summary(l) Call: lm(formula = log2(avg_filled) ~ log2(avg_detect))  Residuals:     Min      1Q  Median      3Q     Max -6.8176 -0.3807  0.1725  0.5492  6.7504  Coefficients:                  Estimate Std. Error t value Pr(>|t|) (Intercept)      -1.62359    0.11545  -14.06   <2e-16 *** log2(avg_detect)  1.11763    0.01259   88.75   <2e-16 *** --- Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1  Residual standard error: 0.9366 on 2846 degrees of freedom   (846 observations deleted due to missingness) Multiple R-squared:  0.7346,    Adjusted R-squared:  0.7345 F-statistic:  7877 on 1 and 2846 DF,  p-value: < 2.2e-16 #' Check first step of the process history processHistory(lcms1)[[1]] Object of class \"XProcessHistory\"  type: Peak detection  date: Mon Oct 21 15:53:03 2024  info:  fileIndex: 1,2,3,4,5,6,7,8,9,10  Parameter class: CentWaveParam  MS level(s) 1 #' Extract results as a SummarizedExperiment res <- quantify(lcms1, method = \"sum\", filled = FALSE) res class: SummarizedExperiment dim: 9068 10 metadata(6): '' '' ... '' '' assays(1): raw rownames(9068): FT0001 FT0002 ... FT9067 FT9068 rowData names(11): mzmed mzmin ... QC ms_level colnames(10): MS_QC_POOL_1_POS.mzML MS_A_POS.mzML ... MS_F_POS.mzML   MS_QC_POOL_4_POS.mzML colData names(11): sample_name derived_spectra_data_file ... phenotype   injection_index assays(res)$raw_filled <- featureValues(lcms1, method = \"sum\",                                         filled = TRUE )  #' Different assay in the SummarizedExperiment object assayNames(res) [1] \"raw\"        \"raw_filled\" assay(res, \"raw_filled\") |> head() MS_QC_POOL_1_POS.mzML MS_A_POS.mzML MS_B_POS.mzML MS_QC_POOL_2_POS.mzML FT0001              421.6162      689.2422      411.3295              481.7436 FT0002              710.8078      875.9192      457.5920              693.6997 FT0003              445.5711      613.4410      277.5022              497.8866 FT0004            16994.5260    24605.7340    19766.7069            17808.0933 FT0005             3284.2664     4526.0531     3521.8221             3379.8909 FT0006            10681.7476    10009.6602     9599.9701            10800.5449        MS_C_POS.mzML MS_D_POS.mzML MS_QC_POOL_3_POS.mzML MS_E_POS.mzML FT0001      314.7567      635.2732              439.6086      570.5849 FT0002      781.2416      648.4344              700.9716     1054.0207 FT0003      425.3774      634.9370              449.0933      556.2544 FT0004    22780.6683    22873.1061            16965.7762    23432.1252 FT0005     4396.0762     4317.7734             3270.5290     4533.8667 FT0006     4792.2390     7296.4262             2382.1788     9236.9799        MS_F_POS.mzML MS_QC_POOL_4_POS.mzML FT0001      579.9360              437.0340 FT0002      534.4577              711.0361 FT0003      461.0465              232.1075 FT0004    22198.4607            16796.4497 FT0005     4161.0132             3142.2268 FT0006     6817.8785             6911.5439 res[1:14, 3:8] class: SummarizedExperiment dim: 14 6 metadata(6): '' '' ... '' '' assays(2): raw raw_filled rownames(14): FT0001 FT0002 ... FT0013 FT0014 rowData names(11): mzmed mzmin ... QC ms_level colnames(6): MS_B_POS.mzML MS_QC_POOL_2_POS.mzML ...   MS_QC_POOL_3_POS.mzML MS_E_POS.mzML colData names(11): sample_name derived_spectra_data_file ... phenotype   injection_index #' Save the preprocessing results #' d <- file.path(tempdir(), \"objects/lcms1\") # saveMsObject(lcms1, AlabasterParam(path = d)) #' for now let's do R object because the previous method is not implemented yet. save(lcms1, file = \"preprocessed_lcms1.RData\")"},{"path":"https://rformassspectrometry.github.io/metabonaut/articles/a-end-to-end-untargeted-metabolomics.html","id":"chromatographic-peak-detection","dir":"Articles","previous_headings":"","what":"Chromatographic peak detection","title":"Complete end-to-end LC-MS/MS Metabolomic Data analysis","text":"initial preprocessing step involves detecting intensity peaks along retention time axis, called chromatographic peaks. achieve , employ findChromPeaks() function within xcms. function supports various algorithms peak detection, can selected configured respective parameter objects. preferred algorithm case, CentWave, utilizes continuous wavelet transformation (CWT)-based peak detection [@tautenhahn_highly_2008]. method known effectiveness handling non-Gaussian shaped chromatographic peaks peaks varying retention time widths, commonly encountered HILIC separations. apply CentWave algorithm default settings extracted ion chromatogram cystine methionine ions evaluate results. CentWave highly performant algorithm, requires costumized dataset. implies parameters fine-tuned based user’s data. example serves clear motivation users familiarize various parameters need adapt data set. discuss main parameters can easily adjusted suit user’s dataset: peakwidth: Specifies minimal maximal expected width peaks retention time dimension. Highly dependent chromatographic settings used. ppm: maximal allowed difference mass peaks’ m/z values (parts-per-million) consecutive scans consider representing signal ion. integrate: parameter defines integration method. , primarily use integrate = 2 integrates also signal chromatographic peak’s tail considered accurate developers. determine peakwidth, recommend users refer previous EICs estimate range peak widths observe dataset. Ideally, examining multiple EICs goal. dataset, peak widths appear around 2 10 seconds. advise choosing range wide narrow peakwidth parameter can lead false positives negatives. determine ppm, deeper analysis dataset needed. clarified ppm depends instrument, users necessarily input vendor-advertised ppm. ’s determine accurately possible: following steps involve generating highly restricted MS area single mass peak per spectrum, representing cystine ion. m/z peaks extracted, absolute difference calculated finally expressed ppm. therefore, choose value close maximum within range parameter ppm, .e., 15 ppm. can now perform chromatographic peak detection adapted settings EICs. important note , properly estimate background noise, sufficient data points outside chromatographic peak need present. generally problem peak detection performed full LC-MS data set, peak detection EICs retention time range EIC needs sufficiently wide. function fails find peak EIC, initial troubleshooting step increase range. Additionally, signal--noise threshold snthresh reduced peak detection EICs, within small retention time range, enough signal present properly estimate background noise. Finally, case MS1 data points per peaks, setting CentWave’s advanced parameter extendLengthMSW TRUE can help peak detection. customized parameters, chromatographic peak detected sample. , use plot() function EICs visualize results.  Figure 11. Chromatographic peak detection EICs. can see peak seems ot detected sample ions. indicates custom settings seem thus suitable dataset. now proceed apply entire dataset, extracting EICs ions evaluate confirm chromatographic peak detection worked expected. Note: revert value parameter snthresh default, , mentioned , background noise estimation reliable performed full data set. Parameter chunkSize findChromPeaks() defines number data files loaded memory processed simultaneously. parameter thus allows fine-tune memory demand well performance chromatographic peak detection step. plot EICs two selected internal standards evaluate chromatographic peak detection results.  Figure 12. Chromatographic peak detection EICs processing. Peaks seem detected properly samples ions. indicates peak detection process entire dataset successful. identification chromatographic peaks using CentWave algorithm can sometimes result artifacts, overlapping split peaks. address issue, refineChromPeaks() function utilized, conjunction MergeNeighboringPeaksParam, aims merging split peaks. show examples CentWave peak detection artifacts. examples pre-selected illustrate necessity next step:  Figure 13. Examples CentWave peak detection artifacts. cases signal presumably single type ion split two separate chromatographic peaks (indicated vertical line). MergeNeigboringPeaksParam allows combine split peaks. parameters algorithm defined : expandMz: Suggested kept relatively small (0.0015) prevent merging isotopes. expandRt: Usually set approximately half size average retention time width used chromatographic peak detection (case, 2.5 seconds). minProp: Used determine whether candidates merged. Chromatographic peaks overlapping m/z ranges (expanded side expandMz) tail--head distance retention time dimension less 2 * expandRt, signal higher minProp apex intensity chromatographic peak lower intensity, merged. Values parameter small avoid merging closely co-eluting ions, isomers. test settings EICs split peaks.  Figure 14. Examples CentWave peak detection artifacts merging. can observe artificially split peaks appropriately merged. Therefore, next apply settings entire dataset. peak merging, column \"merged\" result object’s chromPeakData() data frame can used evaluate chromatographic peaks result represent signal merged, originally identified chromatographic peaks. proceeding next preprocessing step generally suggested evaluate results chromatographic peak detection EICs e.g. internal standards compounds/ions known present samples. Additionally, evaluating comparing number identified chromatographic peaks samples data set can help spotting potentially problematic samples. count number chromatographic peaks per sample show numbers table. Table 5. Samples number identified chromatographic peaks. similar number chromatographic peaks identified within various samples data set. Additional options evaluate results chromatographic peak detection can implemented using plotChromPeaks() function summarizing results using base R commands.","code":"#' Use default Centwave parameter param <- CentWaveParam()  #' Look at the default parameters param Object of class:  CentWaveParam  Parameters:  - ppm: [1] 25  - peakwidth: [1] 20 50  - snthresh: [1] 10  - prefilter: [1]   3 100  - mzCenterFun: [1] \"wMean\"  - integrate: [1] 1  - mzdiff: [1] -0.001  - fitgauss: [1] FALSE  - noise: [1] 0  - verboseColumns: [1] FALSE  - roiList: list()  - firstBaselineCheck: [1] TRUE  - roiScales: numeric(0)  - extendLengthMSW: [1] FALSE  - verboseBetaColumns: [1] FALSE #' Evaluate for Cystine cystine_test <- findChromPeaks(eic_cystine, param = param) chromPeaks(cystine_test) rt rtmin rtmax into intb maxo sn row column #' Evaluate for Methionine met_test <- findChromPeaks(eic_met, param = param) chromPeaks(met_test) rt rtmin rtmax into intb maxo sn row column #' Restrict the data to signal from cystine in the first sample cst <- lcms1[1L] |>   spectra() |>   filterRt(rt = c(208, 218)) |>   filterMzRange(mz = fData(eic_cystine)[\"cystine_13C_15N\", c(\"mzmin\", \"mzmax\")])  #' Show the number of peaks per m/z filtered spectra lengths(cst) [1] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 #' Calculate the difference in m/z values between scans mz_diff <- cst |>     mz() |>     unlist() |>     diff() |>     abs()  #' Express differences in ppm range(mz_diff * 1e6 / mean(unlist(mz(cst)))) [1]  0.08829605 14.82188728 #' Parameters adapted for chromatographic peak detection on EICs. param <- CentWaveParam(peakwidth = c(1, 8), ppm = 15, integrate = 2,                        snthresh = 2)  #' Evaluate on the cystine ion cystine_test <- findChromPeaks(eic_cystine, param = param) chromPeaks(cystine_test) rt   rtmin   rtmax      into      intb      maxo sn row column  [1,] 209.251 207.577 212.878  4085.675  2911.376  2157.459  4   1      1  [2,] 209.251 206.182 213.995 24625.728 19074.407 12907.487  4   1      2  [3,] 209.252 207.020 214.274 19467.836 14594.041  9996.466  4   1      3  [4,] 209.251 207.577 212.041  4648.229  3202.617  2458.485  3   1      4  [5,] 208.974 206.184 213.159 23801.825 18126.978 11300.289  3   1      5  [6,] 209.250 207.018 213.714 25990.327 21036.768 13650.329  5   1      6  [7,] 209.252 207.857 212.879  4528.767  3259.039  2445.841  4   1      7  [8,] 209.252 207.299 213.995 23119.449 17274.140 12153.410  4   1      8  [9,] 208.972 206.740 212.878 28943.188 23436.119 14451.023  4   1      9 [10,] 209.252 207.578 213.437  4470.552  3065.402  2292.881  4   1     10 #' Evaluate on the methionine ion met_test <- findChromPeaks(eic_met, param = param) chromPeaks(met_test) rt   rtmin   rtmax     into     intb      maxo sn row column  [1,] 159.867 157.913 162.378 20026.61 14715.42 12555.601  4   1      1  [2,] 160.425 157.077 163.215 16827.76 11843.39  8407.699  3   1      2  [3,] 160.425 157.356 163.215 18262.45 12881.67  9283.375  3   1      3  [4,] 159.588 157.635 161.820 20987.72 15424.25 13327.811  4   1      4  [5,] 160.985 156.799 163.217 16601.72 11968.46 10012.396  4   1      5  [6,] 160.982 157.634 163.214 17243.24 12389.94  9150.079  4   1      6  [7,] 159.867 158.193 162.099 21120.10 16202.05 13531.844  3   1      7  [8,] 160.426 157.356 162.937 18937.40 13739.73 10336.000  3   1      8  [9,] 160.704 158.472 163.215 17882.21 12299.43  9395.548  3   1      9 [10,] 160.146 157.914 162.379 20275.80 14279.50 12669.821  3   1     10 #' Using the same settings, but with default snthresh param <- CentWaveParam(peakwidth = c(1, 8), ppm = 15, integrate = 2) lcms1 <- findChromPeaks(lcms1, param = param, chunkSize = 5)  #' Update EIC internal standard object eics_is_noprocess <- eic_is eic_is <- chromatogram(lcms1,,                        rt = as.matrix(intern_standard[, c(\"rtmin\", \"rtmax\")]),                        mz = as.matrix(intern_standard[, c(\"mzmin\", \"mzmax\")])) Processing chromatographic peaks fData(eic_is) <- fData(eics_is_noprocess) Processing chromatographic peaks #' set up the parameter param <- MergeNeighboringPeaksParam(expandRt = 2.5, expandMz = 0.0015,                                     minProp = 0.75)  #' Perform the peak refinement on the EICs eics <- refineChromPeaks(eics, param = param) plot(eics) #' Apply on whole dataset lcms1 <- refineChromPeaks(lcms1, param = param, chunkSize = 5) Reduced from 106714 to 89182 chromatographic peaks. chromPeakData(lcms1)$merged |>                       table() FALSE  TRUE 79908  9274 eics_is_chrompeaks <- eic_is  eic_is <- chromatogram(lcms1,                        rt = as.matrix(intern_standard[, c(\"rtmin\", \"rtmax\")]),                        mz = as.matrix(intern_standard[, c(\"mzmin\", \"mzmax\")])) Processing chromatographic peaks fData(eic_is) <- fData(eics_is_chrompeaks)  eic_cystine <- eic_is[\"cystine_13C_15N\", ] eic_met <- eic_is[\"methionine_13C_15N\", ] #' Count the number of peaks per sample and summarize them in a table. data.frame(sample_name = sampleData(lcms1)$sample_name,            peak_count = as.integer(table(chromPeaks(lcms1)[, \"sample\"]))) |>     kable(format = \"pipe\")"},{"path":"https://rformassspectrometry.github.io/metabonaut/articles/a-end-to-end-untargeted-metabolomics.html","id":"refine-identified-chromatographic-peaks","dir":"Articles","previous_headings":"Data preprocessing","what":"Refine identified chromatographic peaks","title":"Complete end-to-end LC-MS/MS Metabolomic Data analysis","text":"identification chromatographic peaks using CentWave algorithm can sometimes result artifacts, overlapping split peaks. address issue, refineChromPeaks() function utilized, conjunction MergeNeighboringPeaksParam, aims merging split peaks. show examples CentWave peak detection artifacts. examples pre-selected illustrate necessity next step:  Figure 13. Examples CentWave peak detection artifacts. cases signal presumably single type ion split two separate chromatographic peaks (indicated vertical line). MergeNeigboringPeaksParam allows combine split peaks. parameters algorithm defined : expandMz: Suggested kept relatively small (0.0015) prevent merging isotopes. expandRt: Usually set approximately half size average retention time width used chromatographic peak detection (case, 2.5 seconds). minProp: Used determine whether candidates merged. Chromatographic peaks overlapping m/z ranges (expanded side expandMz) tail--head distance retention time dimension less 2 * expandRt, signal higher minProp apex intensity chromatographic peak lower intensity, merged. Values parameter small avoid merging closely co-eluting ions, isomers. test settings EICs split peaks.  Figure 14. Examples CentWave peak detection artifacts merging. can observe artificially split peaks appropriately merged. Therefore, next apply settings entire dataset. peak merging, column \"merged\" result object’s chromPeakData() data frame can used evaluate chromatographic peaks result represent signal merged, originally identified chromatographic peaks. proceeding next preprocessing step generally suggested evaluate results chromatographic peak detection EICs e.g. internal standards compounds/ions known present samples. Additionally, evaluating comparing number identified chromatographic peaks samples data set can help spotting potentially problematic samples. count number chromatographic peaks per sample show numbers table. Table 5. Samples number identified chromatographic peaks. similar number chromatographic peaks identified within various samples data set. Additional options evaluate results chromatographic peak detection can implemented using plotChromPeaks() function summarizing results using base R commands.","code":"Processing chromatographic peaks #' set up the parameter param <- MergeNeighboringPeaksParam(expandRt = 2.5, expandMz = 0.0015,                                     minProp = 0.75)  #' Perform the peak refinement on the EICs eics <- refineChromPeaks(eics, param = param) plot(eics) #' Apply on whole dataset lcms1 <- refineChromPeaks(lcms1, param = param, chunkSize = 5) Reduced from 106714 to 89182 chromatographic peaks. chromPeakData(lcms1)$merged |>                       table() FALSE  TRUE 79908  9274 eics_is_chrompeaks <- eic_is  eic_is <- chromatogram(lcms1,                        rt = as.matrix(intern_standard[, c(\"rtmin\", \"rtmax\")]),                        mz = as.matrix(intern_standard[, c(\"mzmin\", \"mzmax\")])) Processing chromatographic peaks fData(eic_is) <- fData(eics_is_chrompeaks)  eic_cystine <- eic_is[\"cystine_13C_15N\", ] eic_met <- eic_is[\"methionine_13C_15N\", ] #' Count the number of peaks per sample and summarize them in a table. data.frame(sample_name = sampleData(lcms1)$sample_name,            peak_count = as.integer(table(chromPeaks(lcms1)[, \"sample\"]))) |>     kable(format = \"pipe\")"},{"path":"https://rformassspectrometry.github.io/metabonaut/articles/a-end-to-end-untargeted-metabolomics.html","id":"retention-time-alignment","dir":"Articles","previous_headings":"","what":"Retention time alignment","title":"Complete end-to-end LC-MS/MS Metabolomic Data analysis","text":"Despite using chromatographic settings conditions retention time shifts unavoidable. Indeed, performance instrument can change time, example due small variations environmental conditions, temperature pressure. shifts generally small samples measured within batch/measurement run, can considerable data experiment acquired across longer time period. evaluate presence shift extract plot BPC QC samples.  Figure 15. BPC QC samples. QC samples representing sample (pool) measured regular intervals measurement run experiment measured day. Still, small shifts can observed, especially region 100 150 seconds. facilitate proper correspondence signals across samples (hence definition LC-MS features), essential minimize differences retention times. Theoretically, proceed two steps: first select QC samples dataset first alignment , using -called anchor peaks. way can assume linear shift time, since always measuring sample different regular time intervals. Despite external QCs data set, still use subset-based alignment assuming retention time shifts independent different sample matrix (human serum plasma) instead mostly instrument-dependent. Note also possible manually specify anchor peaks, respectively retention times align data set external, reference, data set. information provided vignettes xcms package. calculating much adjust retention time samples, apply shift also study samples. xcms retention time alignment can performed using adjustRtime() function alignment algorithm. example use PeakGroups method [@smith_xcms_2006] performs alignment minimizing differences retention times set anchor peaks different samples. method requires initial correspondence analysis match/group chromatographic peaks across samples algorithm selects anchor peaks alignment. initial correspondence, use PeakDensity approach [@smith_xcms_2006] groups chromatographic peaks similar m/z retention time LC-MS features. parameters algorithm, can configured using PeakDensityParam object, sampleGroups, minFraction, binSize, ppm bw. binSize, ppm bw allow specify similar chromatographic peaks’ m/z retention time values need consider grouping feature. binSize ppm define required similarity m/z values. Within m/z bin (defined binSize ppm) areas along retention time axis high chromatographic peak density (considering peaks samples) identified, chromatographic peaks within regions considered grouping feature. High density areas identified using base R density() function, bw parameter: higher values define wider retention time areas, lower values require chromatographic peaks similar retention times. parameter can seen black line plot , corresponding smoothness density curve. Whether candidate peaks get grouped feature depends also parameters sampleGroups minFraction: sampleGroups provide, sample, sample group belongs . minFraction expected value 0 1 defining proportion samples within least one sample groups (defined sampleGroups) chromatographic peaks detected group feature. initial correspondence, parameters don’t need fully optimized. Selection dataset-specific parameter values described detail next section. dataset, use small values binSize ppm , importantly, also parameter bw, since data set ultra high performance (UHP) LC setup used. minFraction use high value (0.9) ensure features defined chromatographic peaks present almost samples one sample group (can used anchor peaks actual alignment). base alignment later QC samples hence define sampleGroups binary variable grouping samples either study, QC group.  Figure 16. Initial correspondence analysis. PeakGroups-based alignment can next performed using adjustRtime() function PeakGroupsParam parameter object. parameters algorithm : subsetAdjust subset: Allows subset alignment. base retention time alignment QC samples, .e., retention time shifts estimated based repeatedly measured samples. resulting adjustment applied entire data. data sets QC samples (e.g. sample pools) measured repeatedly, strongly suggest use method. Note also subset-based alignment samples ordered injection index (.e., order measured measurement run). minFraction: value 0 1 defining proportion samples (full data set, data subset defined subset) chromatographic peak identified use anchor peak. contrast PeakDensityParam parameter used define proportion within sample group. span: PeakGroups method allows, depending data, adjust regions along retention time axis differently. enable local alignments LOESS function used parameter defines degree smoothing function. Generally, values 0.4 0.6 used, however, suggested evaluate alignment results eventually adapt parameters result satisfactory. perform alignment data set based retention times anchor peaks defined subset QC samples. Alignment adjusted retention times spectra data set, well retention times identified chromatographic peaks. alignment performed, user evaluate results using plotAdjustedRtime() function. function visualizes difference adjusted raw retention time sample y-axis along adjusted retention time x-axis. Dot points represent position used anchor peak along retention time axis. optimal alignment areas along retention time axis, anchor peaks scattered retention time dimension.  Figure 17. Retention time alignment results. samples present data set measured within measurement run, resulting small retention time shifts. Therefore, little adjustments needed performed (shifts maximum 1 second can seen plot ). Generally, magnitude adjustment seen plots match expectation analyst. can also compare BPC alignment. get original data, .e. raw retention times, can use dropAdjustedRtime() function:  Figure 18. BPC alignment. largest shift can observed retention time range 120 130s. Apart retention time range, little changes can observed. next evaluate impact alignment EICs selected internal standards. thus first extract ion chromatograms alignment. can now evaluate alignment effect test ions. plot EICs alignment isotope labeled cystine methionine.  Figure 19. EICs cystine methionine alignment. non-endogenous cystine ion already well aligned difference minimal. methionine ion, however, shows improvement alignment. addition visual inspection results, also evaluate impact alignment comparing variance retention times internal standards alignment. end, first need identify chromatographic peaks sample m/z retention time close expected values internal standard. use matchValues() function MetaboAnnotation package [@rainer_modular_2022] using MzRtParam method identify chromatographic peaks similar m/z (+/- 50 ppm) retention time (+/- 10 seconds) internal standard’s values. parameters mzColname rtColname specify column names query () target (chromatographic peaks) contain m/z retention time values match entities. perform matching separately sample. internal standard every sample, use filterMatches() function SingleMatchParam() parameter select chromatographic peak highest intensity. now internal standard ID chromatographic peak sample likely represents signal ion. can now extract retention times chromatographic peaks alignment. can now evaluate impact alignment retention times internal standards across full data set:  Figure 20. Retention time variation internal standards alignment. average, variation retention times internal standards across samples slightly reduced alignment.","code":"#' Get QC samples QC_samples <- sampleData(lcms1)$phenotype == \"QC\"  #' extract BPC lcms1[QC_samples] |>     chromatogram(aggregationFun = \"max\", chromPeaks = \"none\") |>     plot(col = col_phenotype[\"QC\"], main = \"BPC of QC samples\") |>     grid() # Initial correspondence analysis param <- PeakDensityParam(sampleGroups = sampleData(lcms1)$phenotype == \"QC\",                           minFraction = 0.9,                           binSize = 0.01, ppm = 10,                           bw = 2) lcms1 <- groupChromPeaks(lcms1, param = param)  plotChromPeakDensity(     eic_cystine, param = param,     col = paste0(col_sample, \"80\"),     peakCol = col_sample[chromPeaks(eic_cystine)[, \"sample\"]],     peakBg = paste0(col_sample[chromPeaks(eic_cystine)[, \"sample\"]], 20),     peakPch = 16) #' Define parameters of choice subset <- which(sampleData(lcms1)$phenotype == \"QC\") param <- PeakGroupsParam(minFraction = 0.9, extraPeaks = 50, span = 0.5,                          subsetAdjust = \"average\",                          subset = subset)  #' Perform the alignment lcms1 <- adjustRtime(lcms1, param = param) Performing retention time correction using 5373 peak groups. Aligning sample number 2 against subset ... OK Aligning sample number 3 against subset ... OK Aligning sample number 5 against subset ... OK Aligning sample number 6 against subset ... OK Aligning sample number 8 against subset ... OK Aligning sample number 9 against subset ... OK #' Visualize alignment results plotAdjustedRtime(lcms1, col = paste0(col_sample, 80), peakGroupsPch = 1) grid() legend(\"topright\", col = col_phenotype,        legend = names(col_phenotype), lty = 1, bty = \"n\") #' Get data before alignment lcms1_raw <- dropAdjustedRtime(lcms1)  #' Apply the adjusted retention time to our dataset lcms1 <- applyAdjustedRtime(lcms1) #' Plot the BPC before and after alignment par(mfrow = c(2, 1), mar = c(2, 1, 1, 0.5)) chromatogram(lcms1_raw, aggregationFun = \"max\", chromPeaks = \"none\") |>     plot(main = \"BPC before alignment\", col = paste0(col_sample, 80)) grid() legend(\"topright\", col = col_phenotype,        legend = names(col_phenotype), lty = 1, bty = \"n\", horiz = TRUE)  chromatogram(lcms1, aggregationFun = \"max\", chromPeaks = \"none\") |>     plot(main = \"BPC after alignment\",          col = paste0(col_sample, 80)) grid() legend(\"topright\", col = col_phenotype,        legend = names(col_phenotype), lty = 1, bty = \"n\", horiz = TRUE) #' Store the EICs before alignment eics_is_refined <- eic_is  #' Update the EICs eic_is <- chromatogram(lcms1,                        rt = as.matrix(intern_standard[, c(\"rtmin\", \"rtmax\")]),                        mz = as.matrix(intern_standard[, c(\"mzmin\", \"mzmax\")])) Processing chromatographic peaks fData(eic_is) <- fData(eics_is_refined)  #' Extract the EICs for the test ions eic_cystine <- eic_is[\"cystine_13C_15N\"] eic_met <- eic_is[\"methionine_13C_15N\"] par(mfrow = c(2, 2), mar = c(4, 4.5, 2, 1))  old_eic_cystine <- eics_is_refined[\"cystine_13C_15N\"] plot(old_eic_cystine, main = \"Cystine before alignment\", peakType = \"none\",      col = paste0(col_sample, 80)) grid() abline(v = intern_standard[\"cystine_13C_15N\", \"RT\"], col = \"red\", lty = 3)  old_eic_met <- eics_is_refined[\"methionine_13C_15N\"] plot(old_eic_met, main = \"Methionine before alignment\",      peakType = \"none\", col = paste0(col_sample, 80)) grid() abline(v = intern_standard[\"methionine_13C_15N\", \"RT\"], col = \"red\", lty = 3)  plot(eic_cystine, main = \"Cystine after alignment\", peakType = \"none\",      col = paste0(col_sample, 80)) grid() abline(v = intern_standard[\"cystine_13C_15N\", \"RT\"], col = \"red\", lty = 3) legend(\"topright\", col = col_phenotype,        legend = names(col_phenotype), lty = 1, bty = \"n\")  plot(eic_met, main = \"Methionine after alignment\",      peakType = \"none\", col = paste0(col_sample, 80)) grid() abline(v = intern_standard[\"methionine_13C_15N\", \"RT\"], col = \"red\", lty = 3) #' Extract the matrix with all chromatographic peaks and add a column #' with the ID of the chromatographic peak chrom_peaks <- chromPeaks(lcms1) |> as.data.frame() chrom_peaks$peak_id <- rownames(chrom_peaks)  #' Define the parameters for the matching and filtering of the matches p_1 <- MzRtParam(ppm = 50, toleranceRt = 10) p_2 <- SingleMatchParam(duplicates = \"top_ranked\", column = \"target_maxo\",                         decreasing = TRUE)  #' Iterate over samples and identify for each the chromatographic peaks #' with similar m/z and retention time than the onse from the internal #' standard, and extract among them the ID of the peaks with the #' highest intensity. intern_standard_peaks <- lapply(seq_along(lcms1), function(i) {     tmp <- chrom_peaks[chrom_peaks[, \"sample\"] == i, , drop = FALSE]     mtch <- matchValues(intern_standard, tmp,                         mzColname = c(\"mz\", \"mz\"),                         rtColname = c(\"RT\", \"rt\"),                         param = p_1)     mtch <- filterMatches(mtch, p_2)     mtch$target_peak_id }) |>     do.call(what = cbind) #' Define the index of the selected chromatographic peaks in the #' full chromPeaks matrix idx <- match(intern_standard_peaks, rownames(chromPeaks(lcms1)))  #' Extract the raw retention times for these rt_raw <- chromPeaks(lcms1_raw)[idx, \"rt\"] |>     matrix(ncol = length(lcms1_raw))  #' Extract the adjusted retention times for these rt_adj <- chromPeaks(lcms1)[idx, \"rt\"] |>     matrix(ncol = length(lcms1_raw)) list(all_raw = rowSds(rt_raw, na.rm = TRUE),      all_adj = rowSds(rt_adj, na.rm = TRUE)      ) |>     vioplot(ylab = \"sd(retention time)\") grid()"},{"path":"https://rformassspectrometry.github.io/metabonaut/articles/a-end-to-end-untargeted-metabolomics.html","id":"correspondence","dir":"Articles","previous_headings":"","what":"Correspondence","title":"Complete end-to-end LC-MS/MS Metabolomic Data analysis","text":"briefly touched subject correspondence determine anchor peaks alignment. Generally, goal correspondence analysis identify chromatographic peaks originate types ions samples experiment group LC-MS features. point, proper configuration parameter bw crucial. illustrate sensible choices parameter’s value can made. use plotChromPeakDensity() function simulate correspondence analysis default values PeakGroups extracted ion chromatograms two selected isotope labeled ions. plot shows EIC top panel, apex position chromatographic peaks different samples (y-axis), along retention time (x-axis) lower panel.  Figure 21. Initial correspondence analysis, Cystine.  Figure 22. Initial correspondence analysis, Methionine. Grouping peaks depends smoothness previousl mentionned density curve can configured parameter bw. seen , smoothness high properly group features. looking default parameters, can observe indeed, bw parameter set bw = 30, high modern UHPLC-MS setups. reduce value parameter 1.8 evaluate impact.  Figure 23. Correspondence analysis optimized parameters, Cystine.  Figure 24. Correspondence analysis optimized parameters, Methionine. can observe peaks now grouped accurately single feature test ion. important parameters optimized : binsize: data generated high resolution MS instrument, thus select low value paramete. ppm: TOF instruments, suggested use value ppm larger 0 accommodate higher measurement error instrument larger m/z values. minFraction: set minFraction = 0.75, hence defining features chromatographic peak identified least 75% samples one sample groups. sampleGroups: use information available sampleData’s \"phenotype\" column. correspondence analysis suggested evaluate results selected EICs. extract signal m/z similar isotope labeled methionine larger retention time range. Importantly, show actual correspondence results, set simulate = FALSE plotChromPeakDensity() function.  Figure 25. Correspondence analysis results, Methionine. hoped, signal two different ions now grouped separate features. Generally, correspondence results evaluated extracted chromatograms. Another interesting information look distribution features along retention time axis. Table 5. Distribution features along retention time axis. results correspondence analysis now stored, along results preprocessing steps, within XcmsExperiment result object. correspondence results, .e., definition LC-MS features, can extracted using featureDefinitions() function. data frame provides average m/z retention time (columns \"mzmed\" \"rtmed\") characterize LC-MS feature. Column, \"peakidx\" contains indices chromatographic peaks assigned feature. actual abundances features, represent also final preprocessing results, can extracted featureValues() function: can note features (e.g. F0003 F0006) missing values samples. expected certain degree samples features, respectively ions, need present. address next section.","code":"#' Default parameter for the grouping and apply them to the test ions BPC param <- PeakDensityParam(sampleGroups = sampleData(lcms1)$phenotype, bw = 30)  param Object of class:  PeakDensityParam  Parameters:  - sampleGroups:  [1] \"QC\"  \"CVD\" \"CTR\" \"QC\"  \"CTR\" \"CVD\" \"QC\"  \"CTR\" \"CVD\" \"QC\"  - bw: [1] 30  - minFraction: [1] 0.5  - minSamples: [1] 1  - binSize: [1] 0.25  - maxFeatures: [1] 50  - ppm: [1] 0 plotChromPeakDensity(     eic_cystine, param = param,     col = paste0(col_sample, \"80\"),     peakCol = col_sample[chromPeaks(eic_cystine)[, \"sample\"]],     peakBg = paste0(col_sample[chromPeaks(eic_cystine)[, \"sample\"]], 20),     peakPch = 16) plotChromPeakDensity(eic_met, param = param,     col = paste0(col_sample, \"80\"),     peakCol = col_sample[chromPeaks(eic_met)[, \"sample\"]],     peakBg = paste0(col_sample[chromPeaks(eic_met)[, \"sample\"]], 20),     peakPch = 16) #' Updating parameters param <- PeakDensityParam(sampleGroups = sampleData(lcms1)$phenotype, bw = 1.8)  plotChromPeakDensity(     eic_cystine, param = param,     col = paste0(col_sample, \"80\"),     peakCol = col_sample[chromPeaks(eic_cystine)[, \"sample\"]],     peakBg = paste0(col_sample[chromPeaks(eic_cystine)[, \"sample\"]], 20),     peakPch = 16) plotChromPeakDensity(eic_met, param = param,     col = paste0(col_sample, \"80\"),     peakCol = col_sample[chromPeaks(eic_met)[, \"sample\"]],     peakBg = paste0(col_sample[chromPeaks(eic_met)[, \"sample\"]], 20),     peakPch = 16) #' Define the settings for the param param <- PeakDensityParam(sampleGroups = sampleData(lcms1)$phenotype,                           minFraction = 0.75, binSize = 0.01, ppm = 10,                           bw = 1.8)  #' Apply to whole data lcms1 <- groupChromPeaks(lcms1, param = param) #' Extract chromatogram for an m/z similar to the one of the labeled methionine chr_test <- chromatogram(lcms1,                          mz = as.matrix(intern_standard[\"methionine_13C_15N\",                                                         c(\"mzmin\", \"mzmax\")]),                          rt = c(145, 200),                          aggregationFun = \"max\") Processing chromatographic peaks Processing features plotChromPeakDensity(     chr_test, simulate = FALSE,     col = paste0(col_sample, \"80\"),     peakCol = col_sample[chromPeaks(chr_test)[, \"sample\"]],     peakBg = paste0(col_sample[chromPeaks(chr_test)[, \"sample\"]], 20),     peakPch = 16) # Bin features per RT slices vc <- featureDefinitions(lcms1)$rtmed breaks <- seq(0, max(vc, na.rm = TRUE) + 1, length.out = 15) |>     round(0) cuts <- cut(vc, breaks = breaks, include.lowest = TRUE)  table(cuts) |>     kable(format = \"pipe\") #' Definition of the features featureDefinitions(lcms1) |>   head() mzmed    mzmin    mzmax    rtmed    rtmin    rtmax npeaks CTR CVD QC FT0001 50.98979 50.98949 50.99038 203.6001 203.1181 204.2331      8   1   3  4 FT0002 51.05904 51.05880 51.05941 191.1675 190.8787 191.5050      9   2   3  4 FT0003 51.98657 51.98631 51.98699 203.1467 202.6406 203.6710      7   0   3  4 FT0004 53.02036 53.02009 53.02043 203.2343 202.5652 204.0901     10   3   3  4 FT0005 53.52080 53.52051 53.52102 203.1936 202.8490 204.0901     10   3   3  4 FT0006 54.01007 54.00988 54.01015 159.2816 158.8499 159.4484      6   1   3  2             peakidx ms_level FT0001 7702, 16....        1 FT0002 7176, 16....        1 FT0003 7680, 17....        1 FT0004 7763, 17....        1 FT0005 8353, 17....        1 FT0006 5800, 15....        1 #' Extract feature abundances featureValues(lcms1, method = \"sum\") |>     head() MS_QC_POOL_1_POS.mzML MS_A_POS.mzML MS_B_POS.mzML MS_QC_POOL_2_POS.mzML FT0001              421.6162      689.2422            NA              481.7436 FT0002              710.8078      875.9192            NA              693.6997 FT0003              445.5711      613.4410            NA              497.8866 FT0004            16994.5260    24605.7340     19766.707            17808.0933 FT0005             3284.2664     4526.0531      3521.822             3379.8909 FT0006            10681.7476    10009.6602            NA            10800.5449        MS_C_POS.mzML MS_D_POS.mzML MS_QC_POOL_3_POS.mzML MS_E_POS.mzML FT0001            NA      635.2732              439.6086      570.5849 FT0002      781.2416      648.4344              700.9716     1054.0207 FT0003            NA      634.9370              449.0933            NA FT0004    22780.6683    22873.1061            16965.7762    23432.1252 FT0005     4396.0762     4317.7734             3270.5290     4533.8667 FT0006            NA     7296.4262                    NA     9236.9799        MS_F_POS.mzML MS_QC_POOL_4_POS.mzML FT0001      579.9360              437.0340 FT0002      534.4577              711.0361 FT0003      461.0465              232.1075 FT0004    22198.4607            16796.4497 FT0005     4161.0132             3142.2268 FT0006     6817.8785                    NA"},{"path":"https://rformassspectrometry.github.io/metabonaut/articles/a-end-to-end-untargeted-metabolomics.html","id":"gap-filling","dir":"Articles","previous_headings":"","what":"Gap filling","title":"Complete end-to-end LC-MS/MS Metabolomic Data analysis","text":"previously observed missing values (NA) attributed various reasons. Although might represent genuinely missing value, indicating ion (feature) truly present particular sample, also result failure preceding chromatographic peak detection step. crucial able recover missing values latter category much possible reduce eventual need data imputation. next examine prevalent missing values present dataset: can observe substantial number missing values values dataset. Let’s therefore delve process gap-filling. first evaluate example features chromatographic peak detected samples:  Figure 26. Examples chromatographic peaks missing values. instances, chromatographic peak identified one two selected samples (red line), hence missing value reported feature particular samples (blue line). However, cases, signal measured samples, thus, reporting missing value correct example. signal feature low, likely reason peak detection failed. rescue signal cases, fillChromPeaks() function can used ChromPeakAreaParam approach. method defines m/z-retention time area feature based detected peaks, signal respective ion expected. integrates intensities within area samples missing values feature. reported feature abundance. apply method using default parameters. fillChromPeaks() thus rescue missing data data set. Note , even sample ion present, worst case noise integrated, expected much lower actual chromatographic peak signal. Let’s look previously missing values :  Figure 27. Examples chromatographic peaks missing values gap-filling. gap-filling, also blue colored sample chromatographic peak present peak area reported feature abundance sample. assess effectiveness gap-filling method rescuing signals, can also plot average signal features least one missing value average filled-signal. advisable perform analysis repeatedly measured samples; case, QC samples used. , extract: Feature values detected chromatographic peaks setting filled = FALSE featuresValues() call. filled-signal first extracting detected gap-filled abundances replace values detected chromatographic peaks NA. , calculate row averages matrices plot .  detected (x-axis) gap-filled (y-axis) values QC samples highly correlated. Especially higher abundances, agreement high, low intensities, can expected, differences higher trending correlation line. , addition, fit linear regression line data summarize results linear regression line slope 1.12 intercept -1.62. indicates filled-signal average 1.12 times higher detected signal.","code":"#' Percentage of missing values sum(is.na(featureValues(lcms1))) /     length(featureValues(lcms1)) * 100 [1] 26.41597 ftidx <- which(is.na(rowSums(featureValues(lcms1)))) fts <- rownames(featureDefinitions(lcms1))[ftidx] farea <- featureArea(lcms1, features = fts[1:2])  chromatogram(lcms1[c(2, 3)],              rt = farea[, c(\"rtmin\", \"rtmax\")],              mz = farea[, c(\"mzmin\", \"mzmax\")]) |>     plot(col = c(\"red\", \"blue\"), lwd = 2) Processing chromatographic peaks #' Fill in the missing values in the whole dataset lcms1 <- fillChromPeaks(lcms1, param = ChromPeakAreaParam(), chunkSize = 5)  #' Percentage of missing values after gap-filling sum(is.na(featureValues(lcms1))) /     length(featureValues(lcms1)) * 100 [1] 5.155492 Processing chromatographic peaks #' Get only detected signal in QC samples vals_detect <- featureValues(lcms1, filled = FALSE)[, QC_samples]  #' Get detected and filled-in signal vals_filled <- featureValues(lcms1)[, QC_samples]  #' Replace detected signal with NA vals_filled[!is.na(vals_detect)] <- NA  #' Identify features with at least one filled peak has_filled <- is.na(rowSums(vals_detect))  #' Calculate row averages for features with missing values avg_detect <- rowMeans(vals_detect[has_filled, ], na.rm = TRUE) avg_filled <- rowMeans(vals_filled[has_filled, ], na.rm = TRUE)  #' Plot the values against each other (in log2 scale) plot(log2(avg_detect), log2(avg_filled),      xlim = range(log2(c(avg_detect, avg_filled)), na.rm = TRUE),      ylim = range(log2(c(avg_detect, avg_filled)), na.rm = TRUE),      pch = 21, bg = \"#00000020\", col = \"#00000080\") grid() abline(0, 1) #' fit a linear regression line to the data l <- lm(log2(avg_filled) ~ log2(avg_detect)) summary(l) Call: lm(formula = log2(avg_filled) ~ log2(avg_detect))  Residuals:     Min      1Q  Median      3Q     Max -6.8176 -0.3807  0.1725  0.5492  6.7504  Coefficients:                  Estimate Std. Error t value Pr(>|t|) (Intercept)      -1.62359    0.11545  -14.06   <2e-16 *** log2(avg_detect)  1.11763    0.01259   88.75   <2e-16 *** --- Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1  Residual standard error: 0.9366 on 2846 degrees of freedom   (846 observations deleted due to missingness) Multiple R-squared:  0.7346,    Adjusted R-squared:  0.7345 F-statistic:  7877 on 1 and 2846 DF,  p-value: < 2.2e-16"},{"path":"https://rformassspectrometry.github.io/metabonaut/articles/a-end-to-end-untargeted-metabolomics.html","id":"preprocessing-results","dir":"Articles","previous_headings":"","what":"Preprocessing results","title":"Complete end-to-end LC-MS/MS Metabolomic Data analysis","text":"final results LC-MS data preprocessing stored within XcmsExperiment object. includes identified chromatographic peaks, alignment results, well correspondence results. addition, guarantee reproducibility, result object keeps track performed processing steps, including individual parameter objects used configure . processHistory() function returns list various applied processing steps chronological order. , extract information first step performed preprocessing. processParam() function used extract actual parameter class used configure processing step. final result whole LC-MS data preprocessing two-dimensional matrix abundances -called LC-MS features samples. Note stage analysis features characterized m/z retention time don’t yet information metabolite feature represent. seen , feature matrix can extracted featureValues() function corresponding feature characteristics (.e., m/z retention time values) using featureDefinitions() function. Thus, two arrays extracted xcms result object used/imported analysis packages processing. example also exported tab delimited text files, used external tool, used, also MS2 spectra available, feature-based molecular networking GNPS analysis environment [@nothias_feature-based_2020]. processing R, reference link raw MS data required, suggested extract xcms preprocessing result using quantify() function SummarizedExperiment object, Bioconductor’s default container data biological assays/experiments. simplifies integration Bioconductor analysis packages. quantify() function takes parameters featureValues() function, thus, call extract SummarizedExperiment detected, gap-filled, feature abundances: Sample identifications xcms result’s sampleData() now available colData() (column, sample annotations) featureDefinitions() rowData() (row, feature annotations). feature values added first assay() SummarizedExperiment even processing history available object’s metadata(). SummarizedExperiment supports multiple assays, numeric matrices dimensions. thus add detected gap-filled feature abundances additional assay SummarizedExperiment. Feature abundances can extracted assay() function. extract first 6 lines detected gap-filled feature abundances: advantage, addition container full preprocessing results also possibility easy intuitive creation data subsets ensuring data integrity. example easy subset full data selection features /samples: moving next step analysis, advisable save preprocessing results. multiple format options save , can found MsIO package documentation. save XcmsExperiment object file format handled alabster framework, ensures object can easily read languages like Python Javascript well loaded easily back R.","code":"#' Check first step of the process history processHistory(lcms1)[[1]] Object of class \"XProcessHistory\"  type: Peak detection  date: Mon Oct 21 15:53:03 2024  info:  fileIndex: 1,2,3,4,5,6,7,8,9,10  Parameter class: CentWaveParam  MS level(s) 1 #' Extract results as a SummarizedExperiment res <- quantify(lcms1, method = \"sum\", filled = FALSE) res class: SummarizedExperiment dim: 9068 10 metadata(6): '' '' ... '' '' assays(1): raw rownames(9068): FT0001 FT0002 ... FT9067 FT9068 rowData names(11): mzmed mzmin ... QC ms_level colnames(10): MS_QC_POOL_1_POS.mzML MS_A_POS.mzML ... MS_F_POS.mzML   MS_QC_POOL_4_POS.mzML colData names(11): sample_name derived_spectra_data_file ... phenotype   injection_index assays(res)$raw_filled <- featureValues(lcms1, method = \"sum\",                                         filled = TRUE )  #' Different assay in the SummarizedExperiment object assayNames(res) [1] \"raw\"        \"raw_filled\" assay(res, \"raw_filled\") |> head() MS_QC_POOL_1_POS.mzML MS_A_POS.mzML MS_B_POS.mzML MS_QC_POOL_2_POS.mzML FT0001              421.6162      689.2422      411.3295              481.7436 FT0002              710.8078      875.9192      457.5920              693.6997 FT0003              445.5711      613.4410      277.5022              497.8866 FT0004            16994.5260    24605.7340    19766.7069            17808.0933 FT0005             3284.2664     4526.0531     3521.8221             3379.8909 FT0006            10681.7476    10009.6602     9599.9701            10800.5449        MS_C_POS.mzML MS_D_POS.mzML MS_QC_POOL_3_POS.mzML MS_E_POS.mzML FT0001      314.7567      635.2732              439.6086      570.5849 FT0002      781.2416      648.4344              700.9716     1054.0207 FT0003      425.3774      634.9370              449.0933      556.2544 FT0004    22780.6683    22873.1061            16965.7762    23432.1252 FT0005     4396.0762     4317.7734             3270.5290     4533.8667 FT0006     4792.2390     7296.4262             2382.1788     9236.9799        MS_F_POS.mzML MS_QC_POOL_4_POS.mzML FT0001      579.9360              437.0340 FT0002      534.4577              711.0361 FT0003      461.0465              232.1075 FT0004    22198.4607            16796.4497 FT0005     4161.0132             3142.2268 FT0006     6817.8785             6911.5439 res[1:14, 3:8] class: SummarizedExperiment dim: 14 6 metadata(6): '' '' ... '' '' assays(2): raw raw_filled rownames(14): FT0001 FT0002 ... FT0013 FT0014 rowData names(11): mzmed mzmin ... QC ms_level colnames(6): MS_B_POS.mzML MS_QC_POOL_2_POS.mzML ...   MS_QC_POOL_3_POS.mzML MS_E_POS.mzML colData names(11): sample_name derived_spectra_data_file ... phenotype   injection_index #' Save the preprocessing results #' d <- file.path(tempdir(), \"objects/lcms1\") # saveMsObject(lcms1, AlabasterParam(path = d)) #' for now let's do R object because the previous method is not implemented yet. save(lcms1, file = \"preprocessed_lcms1.RData\")"},{"path":"https://rformassspectrometry.github.io/metabonaut/articles/a-end-to-end-untargeted-metabolomics.html","id":"data-normalization","dir":"Articles","previous_headings":"","what":"Data normalization","title":"Complete end-to-end LC-MS/MS Metabolomic Data analysis","text":"preprocessing, data normalization scaling might need applied remove technical variances data. simple approaches like median scaling can implemented lines R code, advanced normalization algorithms available packages Bioconductor’s preprocessCore. comprehensive workflow “Notame” also propose interesting normalization approach adaptable scalable user dataset [@klavus_notame_2020]. Generally, LC-MS data, bias can categorized three main groups[@broadhurst_guidelines_2018]: Variances introduced sample collection initial processing, can include differences sample amounts. type bias expected sample-specific affect signals sample way. Methods like median scaling, LOESS quantiles normalization can adjust bias. Signal drifts along measurement samples experiment. Reasons drifts can related aging instrumentation used (columns, detector), also changes metabolite abundances characteristics due reactions modifications, oxidation. changes expected affect samples measured later run rather ones measured beginning. reason, bias can play major role large experiments bias can play major role large experiments measured long time range usually considered affect individual metabolites (metabolite groups) differently. adjustment, moving average linear regression-based approaches can used. latter can example performed using adjust_lm() function MetaboCoreUtils package. Batch-related biases. comprise noise specific larger set samples, can set samples measured one LC-MS measurement run (.e. one analysis plate) samples measured using specific batch reagents. noise assumed affect samples one batch way linear modeling-based approaches can used adjust . Unwanted variation can arise various sources highly dependent experiment. Therefore, data normalization chosen carefully based experimental design, statistical aims, balance accuracy precision achieved use auxiliary information. Sample preparation biases can evaluated using internal standards, depending however also added sample mixes sample processing. Repeated measurements QC samples hand allows estimate correct LC-MS specific biases. Also, proper planning experiment, measurement study samples random order, can largely avoid biases introduced mentioned sources variance. workflow present tools assess data quality evaluate need normalization well options normalization. space reasons able provide solutions adjust possible sources variation. principal component analysis (PCA) helpful tool initial, unsupervised, visualization data also provides insights potential quality issues data. order apply PCA measured feature abundances, need however impute (still present) missing values. assume missing values (gap-filling step) represent signal detection limit. cases, missing values can replaced random values sampled uniform distribution, ranging half smallest measured value smallest measured value specific feature. uniform distribution defined two parameters (minimum maximum) values equal probability selected. impute missing values approach add resulting data matrix new assay result object. PCA powerful tool detecting biases data. dimensionality reduction technique, enables visualization data lower-dimensional space. context LC-MS data, PCA can used identify overall biases batch, sample, injection index, etc. However, important note PCA linear method may able detect biases data. plotting PCA, apply log2 transform, center scale data. log2 transformation applied stabilize variance centering remove dependency absolute abundances.  Figure 28. PCA data. PCA shows clear separation study samples (plasma) QC samples (serum) first principal component (PC1). separation based phenotype visible third principal component (PC3). cases, can better option remove imputed values evaluate PCA . especially true imputed values replacing large proportion data. Global differences feature abundances samples (e.g. due sample-specific biases) can evaluated plotting distribution log2 transformed feature abundances using boxplots violin plots. show number detected chromatographic peaks per sample distribution log2 transformed feature abundances.  Figure 29. Number detected peaks feature abundances. upper part plot show gap filling steps allowed rescue substantial number NAs allowed us consistent number feature values per sample. consistency aligns asspumption every sample similar amount features detected. Additionally observe , average, signal distribution individual samples similar. alternative way evaluate differences abundances samples relative log abundance (RLA) plots [@de_livera_normalizing_2012]. RLA value abundance feature sample relative median abundance feature across multiple samples. can discriminate within group across group RLAs, depending whether abundance compared samples within sample group across samples. Within group RLA plots assess tightness replicates within groups median close zero low variation around . used across groups, allow compare behavior groups. Generally, -sample differences can easily spotted using RLA plots. calculate visualize within group RLA values using rowRla() function MsCoreUtils package defining parameter f sample groups.  Figure 30. RLA plot raw data filled data. RLA plot , can observe medians samples indeed centered around 0. Exception two CVD samples. Thus, distribution signals across samples comparable, differences seem present require sample normalization. Depending added sample mixes, allow evaluation variances introduced subsequent processing analysis steps. present experiment, added original plasma samples sample extraction included also protein lipid removal steps. can therefore used evaluate variances introduced sample extraction subsequent steps, can however used infer conclusions performance differences original sample collection (blood drawing, storage, plasma creation). use matchValues() function identify features representing signal . filter matches keep match single feature using filterMatches() function combination SingleMatchParam. internal standards play crucial role guiding normalization process. Given assumption samples artificially spiked, possess known ground truth—abundance intensity internal standard consistent. difference expected due technical differences/variance. Consequently, normalization aims minimize variation samples internal standard, reinforcing reliability analyses. previous RLA plot showed data biases need corrected. Therefore, implement -sample normalization using filled-features. process effectively mitigates variations influenced technical issues, differences sample preparation, processing injection methods. instance, employ commonly used technique known median scaling [@de_livera_normalizing_2012]. method involves computing median sample, followed determining median individual sample medians. ensures consistent median values sample throughout entire data set. Maintaining uniformity average total metabolite abundance across samples crucial effective implementation. process aims establish shared baseline central tendency metabolite abundance, mitigating impact sample-specific technical variations. approach fosters robust comparable analysis top features across data set. assumption normalizing based median, known lower sensitivity extreme values, enhances comparability top features ensures consistent average abundance across samples. median scaling calculated imputed non-imputed data, set stored separately within SummarizedExperiment object. approach facilitates testing various normalization strategies maintaining record processing steps undertaken, enabling easy regression previous stages necessary. crucial evaluate effectiveness normalization process. can achieved comparing distribution log2 transformed feature abundances normalization. Additionally, RLA plots can used assess tightness replicates within groups compare behavior groups.  Figure 31. PC1 PC2 data normalization. Normalization large impact PC1 PC2, separation study groups PC3 seems better difference QC samples lower normalization (see ).  Figure 32. PC3 PC4 data normalization. PCA plots show normalization process changed overall structure data. separation study QC samples remains . expected results normalization correct biological variance technical. compare RLA plots -sample normalization evaluate impact data.  Figure 33. RLA plot normalization. normalization process effectively centered data around median medians samples now closer zero. next evaluate coefficient variation (CV, also referred relative standard deviation RSD) features across samples either QC study samples. QC samples, CV represent technical noise, study samples include also expected biological differences. Thus, normalization reduce CV QC samples, slightly reducing CV study samples. CV calculated using rowRsd() function MetaboCoreUtils package. setting mad = TRUE use robust calculation using median absolute deviation instead standard deviation. Table 6. Distribution CV values across samples raw normalized data. table shows distribution CV raw normalized data. first column highlights % data given CV value, e.g. 25% data CV equal lower 0.04557 QC_raw data. anticipated, CV values QCs, reflect technical variance, lower compared study samples, include technical biological variance. Overall, minimal disparity exists raw normalized data, positive indication normalization process introduced bias dataset, also reflects little differences average abundances sample raw data. overall conclusion normalization process little variance present beginning, normalization however able center data around median (shown RLA plot). Given simplicity limited size example dataset, conclude normalization process stage. intricate datasets diverse biases, tailored approach devised. include also approaches adjust signal drifts batch effects. One possible option use linear-model based approach can example applied adjust_lm() function MetaboCoreUtils package.","code":"#' Load preprocessing results ## load(\"SumExp.RData\") ## loadResults(RDataParam(\"data.RData\"))  #' Impute missing values using an uniform distribution na_unidis <- function(z) {     na <- is.na(z)     if (any(na)) {         min = min(z, na.rm = TRUE)         z[na] <- runif(sum(na), min = min/2, max = min)     }     z }  #' Row-wise impute missing values and add the data as a new assay tmp <- apply(assay(res, \"raw_filled\"), MARGIN = 1, na_unidis) assays(res)$raw_filled_imputed <- t(tmp) #' Log2 transform and scale data vals <- assay(res, \"raw_filled_imputed\") |>     log2() |>     t() |>     scale(center = TRUE, scale = TRUE)  #' Perform the PCA pca_res <- prcomp(vals, scale = FALSE, center = FALSE)  #' Plot the results vals_st <- cbind(vals, phenotype = res$phenotype) pca_12 <- autoplot(pca_res, data = vals_st , colour = 'phenotype', scale = 0) +     scale_color_manual(values = col_phenotype) pca_34 <- autoplot(pca_res, data = vals_st, colour = 'phenotype',                    x = 3, y = 4, scale = 0) +     scale_color_manual(values = col_phenotype) grid.arrange(pca_12, pca_34, ncol = 2) layout(mat = matrix(1:3, ncol = 1), height = c(0.2, 0.2, 0.8))  par(mar = c(0.2, 4.5, 0.2, 3)) barplot(apply(assay(res, \"raw\"), MARGIN = 2, function(x) sum(!is.na(x))),         col = paste0(col_sample, 80), border = col_sample,         ylab = \"# detected peaks\", xaxt = \"n\", space = 0.012) grid(nx = NA, ny = NULL) barplot(apply(assay(res, \"raw_filled\"), MARGIN = 2, function(x) sum(!is.na(x))),         col = paste0(col_sample, 80), border = col_sample,         ylab = \"# detected + filled peaks\", xaxt = \"n\",         space = 0.012) grid(nx = NA, ny = NULL) vioplot(log2(assay(res, \"raw_filled\")), xaxt = \"n\",         ylab = expression(log[2]~feature~abundance),         col = paste0(col_sample, 80), border = col_sample) points(colMedians(log2(assay(res, \"raw_filled\")), na.rm = TRUE), type = \"b\",        pch = 1) grid(nx = NA, ny = NULL) legend(\"topright\", col = col_phenotype,        legend = names(col_phenotype), lty=1, lwd = 2, xpd = TRUE, ncol = 3,        cex = 0.8,  bty = \"n\") par(mfrow = c(1, 1), mar = c(3.5, 4.5, 2.5, 1)) boxplot(MsCoreUtils::rowRla(assay(res, \"raw_filled\"),                             f = res$phenotype, transform = \"log2\"),         cex = 0.5, pch = 16,         col = paste0(col_sample, 80), ylab = \"RLA\",         border = col_sample, boxwex = 1,         outline = FALSE, xaxt = \"n\", main = \"Relative log abundance\",         cex.main = 1) axis(side = 1, at = seq_len(ncol(res)), labels = colData(res)$sample_name) grid(nx = NA, ny = NULL) abline(h = 0, lty=3, lwd = 1, col = \"black\") legend(\"topright\", col = col_phenotype,        legend = names(col_phenotype), lty=1, lwd = 2, xpd = TRUE, ncol = 3,        cex = 0.8,  bty = \"n\") # Do we keep IS in normalisation ? Does not give much info... Would simplify a bit #' Creating a column within our IS table intern_standard$feature_id <- NA_character_  #' Identify features matching m/z and RT of internal standards. fdef <- featureDefinitions(lcms1) fdef$feature_id <- rownames(fdef) match_intern_standard <- matchValues(     query = intern_standard,     target = fdef,     mzColname = c(\"mz\", \"mzmed\"),     rtColname = c(\"RT\", \"rtmed\"),     param = MzRtParam(ppm = 50, toleranceRt = 10))  #' Keep only matches with a 1:1 mapping standard to feature. param <- SingleMatchParam(duplicates = \"remove\", column = \"score_rt\",                           decreasing = TRUE) match_intern_standard <- filterMatches(match_intern_standard, param)  intern_standard$feature_id <- match_intern_standard$target_feature_id intern_standard <- intern_standard[!is.na(intern_standard$feature_id), ] #' Compute median and generate normalization factor mdns <- apply(assay(res, \"raw_filled\"), MARGIN = 2,               median, na.rm = TRUE ) nf_mdn <- mdns / median(mdns)  #' divide dataset by median of median and create a new assay. assays(res)$norm <- sweep(assay(res, \"raw_filled\"), MARGIN = 2, nf_mdn, '/') assays(res)$norm_imputed <- sweep(assay(res, \"raw_filled_imputed\"), MARGIN = 2,                                   nf_mdn, '/') #' Data before normalization vals_st <- cbind(vals, phenotype = res$phenotype) pca_raw <- autoplot(pca_res, data = vals_st,                     colour = 'phenotype', scale = 0) +     scale_color_manual(values = col_phenotype)  #' Data after normalization vals_norm <- apply(assay(res, \"norm\"), MARGIN = 1, na_unidis) |>     log2() |>     scale(center = TRUE, scale = TRUE)  pca_res_norm <- prcomp(vals_norm, scale = FALSE, center = FALSE) vals_st_norm <- cbind(vals_norm, phenotype = res$phenotype) pca_adj <- autoplot(pca_res_norm, data = vals_st_norm,                     colour = 'phenotype', scale = 0) +     scale_color_manual(values = col_phenotype)  grid.arrange(pca_raw, pca_adj, ncol = 2) pca_raw <- autoplot(pca_res, data = vals_st ,                     colour = 'phenotype', x = 3, y = 4, scale = 0) +     scale_color_manual(values = col_phenotype) pca_adj <- autoplot(pca_res_norm, data = vals_st_norm,                     colour = 'phenotype', x = 3, y = 4, scale = 0) +     scale_color_manual(values = col_phenotype)  grid.arrange(pca_raw, pca_adj, ncol = 2) par(mfrow = c(2, 1), mar = c(3.5, 4.5, 2.5, 1))  boxplot(rowRla(assay(res, \"raw_filled\"), group = res$phenotype),         cex = 0.5, pch = 16, ylab = \"RLA\", border = col_sample,         col = paste0(col_sample, 80), cex.main = 1, outline = FALSE,         xaxt = \"n\", main = \"Raw data\", boxwex = 1) grid(nx = NA, ny = NULL) legend(\"topright\", inset = c(0, -0.2), col = col_phenotype,        legend = names(col_phenotype), lty=1, lwd = 2, xpd = TRUE,        ncol = 3, cex = 0.7, bty = \"n\") abline(h = 0, lty=3, lwd = 1, col = \"black\")  boxplot(rowRla(assay(res, \"norm\"), group = res$phenotype),         cex = 0.5, pch = 16, ylab = \"RLA\", border = col_sample,         col = paste0(col_sample, 80), boxwex = 1, outline = FALSE,         xaxt = \"n\", main = \"Normallized data\", cex.main = 1) axis(side = 1, at = seq_len(ncol(res)), labels = res$sample_name) grid(nx = NA, ny = NULL) abline(h = 0, lty = 3, lwd = 1, col = \"black\") #' Calculate the CV values index_study <- res$phenotype %in% c(\"CTR\", \"CVD\") index_QC <- res$phenotype == \"QC\"  sample_res <- cbind(     QC_raw = rowRsd(assay(res, \"raw_filled\")[, index_QC],                     na.rm = TRUE, mad = TRUE),     QC_norm = rowRsd(assay(res, \"norm\")[, index_QC],                      na.rm = TRUE, mad = TRUE),     Study_raw = rowRsd(assay(res, \"raw_filled\")[, index_study],                        na.rm = TRUE, mad = TRUE),     Study_norm = rowRsd(assay(res, \"norm\")[, index_study],                         na.rm = TRUE, mad = TRUE) )  #' Summarize the values across features res_df <- data.frame(     QC_raw = quantile(sample_res[, \"QC_raw\"], na.rm = TRUE),     QC_norm = quantile(sample_res[, \"QC_norm\"], na.rm = TRUE),     Study_raw = quantile(sample_res[, \"Study_raw\"], na.rm = TRUE),     Study_norm = quantile(sample_res[, \"Study_norm\"], na.rm = TRUE) )  kable(res_df, format = \"pipe\")"},{"path":"https://rformassspectrometry.github.io/metabonaut/articles/a-end-to-end-untargeted-metabolomics.html","id":"initial-quality-assessment","dir":"Articles","previous_headings":"","what":"Initial quality assessment","title":"Complete end-to-end LC-MS/MS Metabolomic Data analysis","text":"principal component analysis (PCA) helpful tool initial, unsupervised, visualization data also provides insights potential quality issues data. order apply PCA measured feature abundances, need however impute (still present) missing values. assume missing values (gap-filling step) represent signal detection limit. cases, missing values can replaced random values sampled uniform distribution, ranging half smallest measured value smallest measured value specific feature. uniform distribution defined two parameters (minimum maximum) values equal probability selected. impute missing values approach add resulting data matrix new assay result object. PCA powerful tool detecting biases data. dimensionality reduction technique, enables visualization data lower-dimensional space. context LC-MS data, PCA can used identify overall biases batch, sample, injection index, etc. However, important note PCA linear method may able detect biases data. plotting PCA, apply log2 transform, center scale data. log2 transformation applied stabilize variance centering remove dependency absolute abundances.  Figure 28. PCA data. PCA shows clear separation study samples (plasma) QC samples (serum) first principal component (PC1). separation based phenotype visible third principal component (PC3). cases, can better option remove imputed values evaluate PCA . especially true imputed values replacing large proportion data. Global differences feature abundances samples (e.g. due sample-specific biases) can evaluated plotting distribution log2 transformed feature abundances using boxplots violin plots. show number detected chromatographic peaks per sample distribution log2 transformed feature abundances.  Figure 29. Number detected peaks feature abundances. upper part plot show gap filling steps allowed rescue substantial number NAs allowed us consistent number feature values per sample. consistency aligns asspumption every sample similar amount features detected. Additionally observe , average, signal distribution individual samples similar. alternative way evaluate differences abundances samples relative log abundance (RLA) plots [@de_livera_normalizing_2012]. RLA value abundance feature sample relative median abundance feature across multiple samples. can discriminate within group across group RLAs, depending whether abundance compared samples within sample group across samples. Within group RLA plots assess tightness replicates within groups median close zero low variation around . used across groups, allow compare behavior groups. Generally, -sample differences can easily spotted using RLA plots. calculate visualize within group RLA values using rowRla() function MsCoreUtils package defining parameter f sample groups.  Figure 30. RLA plot raw data filled data. RLA plot , can observe medians samples indeed centered around 0. Exception two CVD samples. Thus, distribution signals across samples comparable, differences seem present require sample normalization. Depending added sample mixes, allow evaluation variances introduced subsequent processing analysis steps. present experiment, added original plasma samples sample extraction included also protein lipid removal steps. can therefore used evaluate variances introduced sample extraction subsequent steps, can however used infer conclusions performance differences original sample collection (blood drawing, storage, plasma creation). use matchValues() function identify features representing signal . filter matches keep match single feature using filterMatches() function combination SingleMatchParam. internal standards play crucial role guiding normalization process. Given assumption samples artificially spiked, possess known ground truth—abundance intensity internal standard consistent. difference expected due technical differences/variance. Consequently, normalization aims minimize variation samples internal standard, reinforcing reliability analyses.","code":"#' Load preprocessing results ## load(\"SumExp.RData\") ## loadResults(RDataParam(\"data.RData\"))  #' Impute missing values using an uniform distribution na_unidis <- function(z) {     na <- is.na(z)     if (any(na)) {         min = min(z, na.rm = TRUE)         z[na] <- runif(sum(na), min = min/2, max = min)     }     z }  #' Row-wise impute missing values and add the data as a new assay tmp <- apply(assay(res, \"raw_filled\"), MARGIN = 1, na_unidis) assays(res)$raw_filled_imputed <- t(tmp) #' Log2 transform and scale data vals <- assay(res, \"raw_filled_imputed\") |>     log2() |>     t() |>     scale(center = TRUE, scale = TRUE)  #' Perform the PCA pca_res <- prcomp(vals, scale = FALSE, center = FALSE)  #' Plot the results vals_st <- cbind(vals, phenotype = res$phenotype) pca_12 <- autoplot(pca_res, data = vals_st , colour = 'phenotype', scale = 0) +     scale_color_manual(values = col_phenotype) pca_34 <- autoplot(pca_res, data = vals_st, colour = 'phenotype',                    x = 3, y = 4, scale = 0) +     scale_color_manual(values = col_phenotype) grid.arrange(pca_12, pca_34, ncol = 2) layout(mat = matrix(1:3, ncol = 1), height = c(0.2, 0.2, 0.8))  par(mar = c(0.2, 4.5, 0.2, 3)) barplot(apply(assay(res, \"raw\"), MARGIN = 2, function(x) sum(!is.na(x))),         col = paste0(col_sample, 80), border = col_sample,         ylab = \"# detected peaks\", xaxt = \"n\", space = 0.012) grid(nx = NA, ny = NULL) barplot(apply(assay(res, \"raw_filled\"), MARGIN = 2, function(x) sum(!is.na(x))),         col = paste0(col_sample, 80), border = col_sample,         ylab = \"# detected + filled peaks\", xaxt = \"n\",         space = 0.012) grid(nx = NA, ny = NULL) vioplot(log2(assay(res, \"raw_filled\")), xaxt = \"n\",         ylab = expression(log[2]~feature~abundance),         col = paste0(col_sample, 80), border = col_sample) points(colMedians(log2(assay(res, \"raw_filled\")), na.rm = TRUE), type = \"b\",        pch = 1) grid(nx = NA, ny = NULL) legend(\"topright\", col = col_phenotype,        legend = names(col_phenotype), lty=1, lwd = 2, xpd = TRUE, ncol = 3,        cex = 0.8,  bty = \"n\") par(mfrow = c(1, 1), mar = c(3.5, 4.5, 2.5, 1)) boxplot(MsCoreUtils::rowRla(assay(res, \"raw_filled\"),                             f = res$phenotype, transform = \"log2\"),         cex = 0.5, pch = 16,         col = paste0(col_sample, 80), ylab = \"RLA\",         border = col_sample, boxwex = 1,         outline = FALSE, xaxt = \"n\", main = \"Relative log abundance\",         cex.main = 1) axis(side = 1, at = seq_len(ncol(res)), labels = colData(res)$sample_name) grid(nx = NA, ny = NULL) abline(h = 0, lty=3, lwd = 1, col = \"black\") legend(\"topright\", col = col_phenotype,        legend = names(col_phenotype), lty=1, lwd = 2, xpd = TRUE, ncol = 3,        cex = 0.8,  bty = \"n\") # Do we keep IS in normalisation ? Does not give much info... Would simplify a bit #' Creating a column within our IS table intern_standard$feature_id <- NA_character_  #' Identify features matching m/z and RT of internal standards. fdef <- featureDefinitions(lcms1) fdef$feature_id <- rownames(fdef) match_intern_standard <- matchValues(     query = intern_standard,     target = fdef,     mzColname = c(\"mz\", \"mzmed\"),     rtColname = c(\"RT\", \"rtmed\"),     param = MzRtParam(ppm = 50, toleranceRt = 10))  #' Keep only matches with a 1:1 mapping standard to feature. param <- SingleMatchParam(duplicates = \"remove\", column = \"score_rt\",                           decreasing = TRUE) match_intern_standard <- filterMatches(match_intern_standard, param)  intern_standard$feature_id <- match_intern_standard$target_feature_id intern_standard <- intern_standard[!is.na(intern_standard$feature_id), ]"},{"path":"https://rformassspectrometry.github.io/metabonaut/articles/a-end-to-end-untargeted-metabolomics.html","id":"principal-component-analysis","dir":"Articles","previous_headings":"Data normalization","what":"Principal Component Analysis","title":"Complete end-to-end LC-MS/MS Metabolomic Data analysis","text":"PCA powerful tool detecting biases data. dimensionality reduction technique, enables visualization data lower-dimensional space. context LC-MS data, PCA can used identify overall biases batch, sample, injection index, etc. However, important note PCA linear method may able detect biases data. plotting PCA, apply log2 transform, center scale data. log2 transformation applied stabilize variance centering remove dependency absolute abundances.  Figure 28. PCA data. PCA shows clear separation study samples (plasma) QC samples (serum) first principal component (PC1). separation based phenotype visible third principal component (PC3). cases, can better option remove imputed values evaluate PCA . especially true imputed values replacing large proportion data.","code":"#' Log2 transform and scale data vals <- assay(res, \"raw_filled_imputed\") |>     log2() |>     t() |>     scale(center = TRUE, scale = TRUE)  #' Perform the PCA pca_res <- prcomp(vals, scale = FALSE, center = FALSE)  #' Plot the results vals_st <- cbind(vals, phenotype = res$phenotype) pca_12 <- autoplot(pca_res, data = vals_st , colour = 'phenotype', scale = 0) +     scale_color_manual(values = col_phenotype) pca_34 <- autoplot(pca_res, data = vals_st, colour = 'phenotype',                    x = 3, y = 4, scale = 0) +     scale_color_manual(values = col_phenotype) grid.arrange(pca_12, pca_34, ncol = 2)"},{"path":"https://rformassspectrometry.github.io/metabonaut/articles/a-end-to-end-untargeted-metabolomics.html","id":"intensity-evaluation","dir":"Articles","previous_headings":"Data normalization","what":"Intensity evaluation","title":"Complete end-to-end LC-MS/MS Metabolomic Data analysis","text":"Global differences feature abundances samples (e.g. due sample-specific biases) can evaluated plotting distribution log2 transformed feature abundances using boxplots violin plots. show number detected chromatographic peaks per sample distribution log2 transformed feature abundances.  Figure 29. Number detected peaks feature abundances. upper part plot show gap filling steps allowed rescue substantial number NAs allowed us consistent number feature values per sample. consistency aligns asspumption every sample similar amount features detected. Additionally observe , average, signal distribution individual samples similar. alternative way evaluate differences abundances samples relative log abundance (RLA) plots [@de_livera_normalizing_2012]. RLA value abundance feature sample relative median abundance feature across multiple samples. can discriminate within group across group RLAs, depending whether abundance compared samples within sample group across samples. Within group RLA plots assess tightness replicates within groups median close zero low variation around . used across groups, allow compare behavior groups. Generally, -sample differences can easily spotted using RLA plots. calculate visualize within group RLA values using rowRla() function MsCoreUtils package defining parameter f sample groups.  Figure 30. RLA plot raw data filled data. RLA plot , can observe medians samples indeed centered around 0. Exception two CVD samples. Thus, distribution signals across samples comparable, differences seem present require sample normalization.","code":"layout(mat = matrix(1:3, ncol = 1), height = c(0.2, 0.2, 0.8))  par(mar = c(0.2, 4.5, 0.2, 3)) barplot(apply(assay(res, \"raw\"), MARGIN = 2, function(x) sum(!is.na(x))),         col = paste0(col_sample, 80), border = col_sample,         ylab = \"# detected peaks\", xaxt = \"n\", space = 0.012) grid(nx = NA, ny = NULL) barplot(apply(assay(res, \"raw_filled\"), MARGIN = 2, function(x) sum(!is.na(x))),         col = paste0(col_sample, 80), border = col_sample,         ylab = \"# detected + filled peaks\", xaxt = \"n\",         space = 0.012) grid(nx = NA, ny = NULL) vioplot(log2(assay(res, \"raw_filled\")), xaxt = \"n\",         ylab = expression(log[2]~feature~abundance),         col = paste0(col_sample, 80), border = col_sample) points(colMedians(log2(assay(res, \"raw_filled\")), na.rm = TRUE), type = \"b\",        pch = 1) grid(nx = NA, ny = NULL) legend(\"topright\", col = col_phenotype,        legend = names(col_phenotype), lty=1, lwd = 2, xpd = TRUE, ncol = 3,        cex = 0.8,  bty = \"n\") par(mfrow = c(1, 1), mar = c(3.5, 4.5, 2.5, 1)) boxplot(MsCoreUtils::rowRla(assay(res, \"raw_filled\"),                             f = res$phenotype, transform = \"log2\"),         cex = 0.5, pch = 16,         col = paste0(col_sample, 80), ylab = \"RLA\",         border = col_sample, boxwex = 1,         outline = FALSE, xaxt = \"n\", main = \"Relative log abundance\",         cex.main = 1) axis(side = 1, at = seq_len(ncol(res)), labels = colData(res)$sample_name) grid(nx = NA, ny = NULL) abline(h = 0, lty=3, lwd = 1, col = \"black\") legend(\"topright\", col = col_phenotype,        legend = names(col_phenotype), lty=1, lwd = 2, xpd = TRUE, ncol = 3,        cex = 0.8,  bty = \"n\")"},{"path":"https://rformassspectrometry.github.io/metabonaut/articles/a-end-to-end-untargeted-metabolomics.html","id":"internal-standards","dir":"Articles","previous_headings":"Data normalization","what":"Internal standards","title":"Complete end-to-end LC-MS/MS Metabolomic Data analysis","text":"Depending added sample mixes, allow evaluation variances introduced subsequent processing analysis steps. present experiment, added original plasma samples sample extraction included also protein lipid removal steps. can therefore used evaluate variances introduced sample extraction subsequent steps, can however used infer conclusions performance differences original sample collection (blood drawing, storage, plasma creation). use matchValues() function identify features representing signal . filter matches keep match single feature using filterMatches() function combination SingleMatchParam. internal standards play crucial role guiding normalization process. Given assumption samples artificially spiked, possess known ground truth—abundance intensity internal standard consistent. difference expected due technical differences/variance. Consequently, normalization aims minimize variation samples internal standard, reinforcing reliability analyses.","code":"# Do we keep IS in normalisation ? Does not give much info... Would simplify a bit #' Creating a column within our IS table intern_standard$feature_id <- NA_character_  #' Identify features matching m/z and RT of internal standards. fdef <- featureDefinitions(lcms1) fdef$feature_id <- rownames(fdef) match_intern_standard <- matchValues(     query = intern_standard,     target = fdef,     mzColname = c(\"mz\", \"mzmed\"),     rtColname = c(\"RT\", \"rtmed\"),     param = MzRtParam(ppm = 50, toleranceRt = 10))  #' Keep only matches with a 1:1 mapping standard to feature. param <- SingleMatchParam(duplicates = \"remove\", column = \"score_rt\",                           decreasing = TRUE) match_intern_standard <- filterMatches(match_intern_standard, param)  intern_standard$feature_id <- match_intern_standard$target_feature_id intern_standard <- intern_standard[!is.na(intern_standard$feature_id), ]"},{"path":"https://rformassspectrometry.github.io/metabonaut/articles/a-end-to-end-untargeted-metabolomics.html","id":"between-sample-normalisation","dir":"Articles","previous_headings":"","what":"Between sample normalisation","title":"Complete end-to-end LC-MS/MS Metabolomic Data analysis","text":"previous RLA plot showed data biases need corrected. Therefore, implement -sample normalization using filled-features. process effectively mitigates variations influenced technical issues, differences sample preparation, processing injection methods. instance, employ commonly used technique known median scaling [@de_livera_normalizing_2012]. method involves computing median sample, followed determining median individual sample medians. ensures consistent median values sample throughout entire data set. Maintaining uniformity average total metabolite abundance across samples crucial effective implementation. process aims establish shared baseline central tendency metabolite abundance, mitigating impact sample-specific technical variations. approach fosters robust comparable analysis top features across data set. assumption normalizing based median, known lower sensitivity extreme values, enhances comparability top features ensures consistent average abundance across samples. median scaling calculated imputed non-imputed data, set stored separately within SummarizedExperiment object. approach facilitates testing various normalization strategies maintaining record processing steps undertaken, enabling easy regression previous stages necessary.","code":"#' Compute median and generate normalization factor mdns <- apply(assay(res, \"raw_filled\"), MARGIN = 2,               median, na.rm = TRUE ) nf_mdn <- mdns / median(mdns)  #' divide dataset by median of median and create a new assay. assays(res)$norm <- sweep(assay(res, \"raw_filled\"), MARGIN = 2, nf_mdn, '/') assays(res)$norm_imputed <- sweep(assay(res, \"raw_filled_imputed\"), MARGIN = 2,                                   nf_mdn, '/')"},{"path":"https://rformassspectrometry.github.io/metabonaut/articles/a-end-to-end-untargeted-metabolomics.html","id":"median-scaling","dir":"Articles","previous_headings":"Data normalization","what":"Median scaling","title":"Complete end-to-end LC-MS/MS Metabolomic Data analysis","text":"method involves computing median sample, followed determining median individual sample medians. ensures consistent median values sample throughout entire data set. Maintaining uniformity average total metabolite abundance across samples crucial effective implementation. process aims establish shared baseline central tendency metabolite abundance, mitigating impact sample-specific technical variations. approach fosters robust comparable analysis top features across data set. assumption normalizing based median, known lower sensitivity extreme values, enhances comparability top features ensures consistent average abundance across samples. median scaling calculated imputed non-imputed data, set stored separately within SummarizedExperiment object. approach facilitates testing various normalization strategies maintaining record processing steps undertaken, enabling easy regression previous stages necessary.","code":"#' Compute median and generate normalization factor mdns <- apply(assay(res, \"raw_filled\"), MARGIN = 2,               median, na.rm = TRUE ) nf_mdn <- mdns / median(mdns)  #' divide dataset by median of median and create a new assay. assays(res)$norm <- sweep(assay(res, \"raw_filled\"), MARGIN = 2, nf_mdn, '/') assays(res)$norm_imputed <- sweep(assay(res, \"raw_filled_imputed\"), MARGIN = 2,                                   nf_mdn, '/')"},{"path":"https://rformassspectrometry.github.io/metabonaut/articles/a-end-to-end-untargeted-metabolomics.html","id":"assessing-overall-effectiveness-of-the-normalization-approach","dir":"Articles","previous_headings":"","what":"Assessing overall effectiveness of the normalization approach","title":"Complete end-to-end LC-MS/MS Metabolomic Data analysis","text":"crucial evaluate effectiveness normalization process. can achieved comparing distribution log2 transformed feature abundances normalization. Additionally, RLA plots can used assess tightness replicates within groups compare behavior groups.  Figure 31. PC1 PC2 data normalization. Normalization large impact PC1 PC2, separation study groups PC3 seems better difference QC samples lower normalization (see ).  Figure 32. PC3 PC4 data normalization. PCA plots show normalization process changed overall structure data. separation study QC samples remains . expected results normalization correct biological variance technical. compare RLA plots -sample normalization evaluate impact data.  Figure 33. RLA plot normalization. normalization process effectively centered data around median medians samples now closer zero. next evaluate coefficient variation (CV, also referred relative standard deviation RSD) features across samples either QC study samples. QC samples, CV represent technical noise, study samples include also expected biological differences. Thus, normalization reduce CV QC samples, slightly reducing CV study samples. CV calculated using rowRsd() function MetaboCoreUtils package. setting mad = TRUE use robust calculation using median absolute deviation instead standard deviation. Table 6. Distribution CV values across samples raw normalized data. table shows distribution CV raw normalized data. first column highlights % data given CV value, e.g. 25% data CV equal lower 0.04557 QC_raw data. anticipated, CV values QCs, reflect technical variance, lower compared study samples, include technical biological variance. Overall, minimal disparity exists raw normalized data, positive indication normalization process introduced bias dataset, also reflects little differences average abundances sample raw data. overall conclusion normalization process little variance present beginning, normalization however able center data around median (shown RLA plot). Given simplicity limited size example dataset, conclude normalization process stage. intricate datasets diverse biases, tailored approach devised. include also approaches adjust signal drifts batch effects. One possible option use linear-model based approach can example applied adjust_lm() function MetaboCoreUtils package.","code":"#' Data before normalization vals_st <- cbind(vals, phenotype = res$phenotype) pca_raw <- autoplot(pca_res, data = vals_st,                     colour = 'phenotype', scale = 0) +     scale_color_manual(values = col_phenotype)  #' Data after normalization vals_norm <- apply(assay(res, \"norm\"), MARGIN = 1, na_unidis) |>     log2() |>     scale(center = TRUE, scale = TRUE)  pca_res_norm <- prcomp(vals_norm, scale = FALSE, center = FALSE) vals_st_norm <- cbind(vals_norm, phenotype = res$phenotype) pca_adj <- autoplot(pca_res_norm, data = vals_st_norm,                     colour = 'phenotype', scale = 0) +     scale_color_manual(values = col_phenotype)  grid.arrange(pca_raw, pca_adj, ncol = 2) pca_raw <- autoplot(pca_res, data = vals_st ,                     colour = 'phenotype', x = 3, y = 4, scale = 0) +     scale_color_manual(values = col_phenotype) pca_adj <- autoplot(pca_res_norm, data = vals_st_norm,                     colour = 'phenotype', x = 3, y = 4, scale = 0) +     scale_color_manual(values = col_phenotype)  grid.arrange(pca_raw, pca_adj, ncol = 2) par(mfrow = c(2, 1), mar = c(3.5, 4.5, 2.5, 1))  boxplot(rowRla(assay(res, \"raw_filled\"), group = res$phenotype),         cex = 0.5, pch = 16, ylab = \"RLA\", border = col_sample,         col = paste0(col_sample, 80), cex.main = 1, outline = FALSE,         xaxt = \"n\", main = \"Raw data\", boxwex = 1) grid(nx = NA, ny = NULL) legend(\"topright\", inset = c(0, -0.2), col = col_phenotype,        legend = names(col_phenotype), lty=1, lwd = 2, xpd = TRUE,        ncol = 3, cex = 0.7, bty = \"n\") abline(h = 0, lty=3, lwd = 1, col = \"black\")  boxplot(rowRla(assay(res, \"norm\"), group = res$phenotype),         cex = 0.5, pch = 16, ylab = \"RLA\", border = col_sample,         col = paste0(col_sample, 80), boxwex = 1, outline = FALSE,         xaxt = \"n\", main = \"Normallized data\", cex.main = 1) axis(side = 1, at = seq_len(ncol(res)), labels = res$sample_name) grid(nx = NA, ny = NULL) abline(h = 0, lty = 3, lwd = 1, col = \"black\") #' Calculate the CV values index_study <- res$phenotype %in% c(\"CTR\", \"CVD\") index_QC <- res$phenotype == \"QC\"  sample_res <- cbind(     QC_raw = rowRsd(assay(res, \"raw_filled\")[, index_QC],                     na.rm = TRUE, mad = TRUE),     QC_norm = rowRsd(assay(res, \"norm\")[, index_QC],                      na.rm = TRUE, mad = TRUE),     Study_raw = rowRsd(assay(res, \"raw_filled\")[, index_study],                        na.rm = TRUE, mad = TRUE),     Study_norm = rowRsd(assay(res, \"norm\")[, index_study],                         na.rm = TRUE, mad = TRUE) )  #' Summarize the values across features res_df <- data.frame(     QC_raw = quantile(sample_res[, \"QC_raw\"], na.rm = TRUE),     QC_norm = quantile(sample_res[, \"QC_norm\"], na.rm = TRUE),     Study_raw = quantile(sample_res[, \"Study_raw\"], na.rm = TRUE),     Study_norm = quantile(sample_res[, \"Study_norm\"], na.rm = TRUE) )  kable(res_df, format = \"pipe\")"},{"path":"https://rformassspectrometry.github.io/metabonaut/articles/a-end-to-end-untargeted-metabolomics.html","id":"principal-component-analysis-1","dir":"Articles","previous_headings":"Data normalization","what":"Principal Component Analysis","title":"Complete end-to-end LC-MS/MS Metabolomic Data analysis","text":"Figure 31. PC1 PC2 data normalization. Normalization large impact PC1 PC2, separation study groups PC3 seems better difference QC samples lower normalization (see ).  Figure 32. PC3 PC4 data normalization. PCA plots show normalization process changed overall structure data. separation study QC samples remains . expected results normalization correct biological variance technical.","code":"#' Data before normalization vals_st <- cbind(vals, phenotype = res$phenotype) pca_raw <- autoplot(pca_res, data = vals_st,                     colour = 'phenotype', scale = 0) +     scale_color_manual(values = col_phenotype)  #' Data after normalization vals_norm <- apply(assay(res, \"norm\"), MARGIN = 1, na_unidis) |>     log2() |>     scale(center = TRUE, scale = TRUE)  pca_res_norm <- prcomp(vals_norm, scale = FALSE, center = FALSE) vals_st_norm <- cbind(vals_norm, phenotype = res$phenotype) pca_adj <- autoplot(pca_res_norm, data = vals_st_norm,                     colour = 'phenotype', scale = 0) +     scale_color_manual(values = col_phenotype)  grid.arrange(pca_raw, pca_adj, ncol = 2) pca_raw <- autoplot(pca_res, data = vals_st ,                     colour = 'phenotype', x = 3, y = 4, scale = 0) +     scale_color_manual(values = col_phenotype) pca_adj <- autoplot(pca_res_norm, data = vals_st_norm,                     colour = 'phenotype', x = 3, y = 4, scale = 0) +     scale_color_manual(values = col_phenotype)  grid.arrange(pca_raw, pca_adj, ncol = 2)"},{"path":"https://rformassspectrometry.github.io/metabonaut/articles/a-end-to-end-untargeted-metabolomics.html","id":"intensity-evaluation-1","dir":"Articles","previous_headings":"Data normalization","what":"Intensity evaluation","title":"Complete end-to-end LC-MS/MS Metabolomic Data analysis","text":"compare RLA plots -sample normalization evaluate impact data.  Figure 33. RLA plot normalization. normalization process effectively centered data around median medians samples now closer zero.","code":"par(mfrow = c(2, 1), mar = c(3.5, 4.5, 2.5, 1))  boxplot(rowRla(assay(res, \"raw_filled\"), group = res$phenotype),         cex = 0.5, pch = 16, ylab = \"RLA\", border = col_sample,         col = paste0(col_sample, 80), cex.main = 1, outline = FALSE,         xaxt = \"n\", main = \"Raw data\", boxwex = 1) grid(nx = NA, ny = NULL) legend(\"topright\", inset = c(0, -0.2), col = col_phenotype,        legend = names(col_phenotype), lty=1, lwd = 2, xpd = TRUE,        ncol = 3, cex = 0.7, bty = \"n\") abline(h = 0, lty=3, lwd = 1, col = \"black\")  boxplot(rowRla(assay(res, \"norm\"), group = res$phenotype),         cex = 0.5, pch = 16, ylab = \"RLA\", border = col_sample,         col = paste0(col_sample, 80), boxwex = 1, outline = FALSE,         xaxt = \"n\", main = \"Normallized data\", cex.main = 1) axis(side = 1, at = seq_len(ncol(res)), labels = res$sample_name) grid(nx = NA, ny = NULL) abline(h = 0, lty = 3, lwd = 1, col = \"black\")"},{"path":"https://rformassspectrometry.github.io/metabonaut/articles/a-end-to-end-untargeted-metabolomics.html","id":"coefficient-of-variation","dir":"Articles","previous_headings":"Data normalization","what":"Coefficient of variation","title":"Complete end-to-end LC-MS/MS Metabolomic Data analysis","text":"next evaluate coefficient variation (CV, also referred relative standard deviation RSD) features across samples either QC study samples. QC samples, CV represent technical noise, study samples include also expected biological differences. Thus, normalization reduce CV QC samples, slightly reducing CV study samples. CV calculated using rowRsd() function MetaboCoreUtils package. setting mad = TRUE use robust calculation using median absolute deviation instead standard deviation. Table 6. Distribution CV values across samples raw normalized data. table shows distribution CV raw normalized data. first column highlights % data given CV value, e.g. 25% data CV equal lower 0.04557 QC_raw data. anticipated, CV values QCs, reflect technical variance, lower compared study samples, include technical biological variance. Overall, minimal disparity exists raw normalized data, positive indication normalization process introduced bias dataset, also reflects little differences average abundances sample raw data.","code":"#' Calculate the CV values index_study <- res$phenotype %in% c(\"CTR\", \"CVD\") index_QC <- res$phenotype == \"QC\"  sample_res <- cbind(     QC_raw = rowRsd(assay(res, \"raw_filled\")[, index_QC],                     na.rm = TRUE, mad = TRUE),     QC_norm = rowRsd(assay(res, \"norm\")[, index_QC],                      na.rm = TRUE, mad = TRUE),     Study_raw = rowRsd(assay(res, \"raw_filled\")[, index_study],                        na.rm = TRUE, mad = TRUE),     Study_norm = rowRsd(assay(res, \"norm\")[, index_study],                         na.rm = TRUE, mad = TRUE) )  #' Summarize the values across features res_df <- data.frame(     QC_raw = quantile(sample_res[, \"QC_raw\"], na.rm = TRUE),     QC_norm = quantile(sample_res[, \"QC_norm\"], na.rm = TRUE),     Study_raw = quantile(sample_res[, \"Study_raw\"], na.rm = TRUE),     Study_norm = quantile(sample_res[, \"Study_norm\"], na.rm = TRUE) )  kable(res_df, format = \"pipe\")"},{"path":"https://rformassspectrometry.github.io/metabonaut/articles/a-end-to-end-untargeted-metabolomics.html","id":"conclusion-on-normalization","dir":"Articles","previous_headings":"Data normalization","what":"Conclusion on normalization","title":"Complete end-to-end LC-MS/MS Metabolomic Data analysis","text":"overall conclusion normalization process little variance present beginning, normalization however able center data around median (shown RLA plot). Given simplicity limited size example dataset, conclude normalization process stage. intricate datasets diverse biases, tailored approach devised. include also approaches adjust signal drifts batch effects. One possible option use linear-model based approach can example applied adjust_lm() function MetaboCoreUtils package.","code":""},{"path":"https://rformassspectrometry.github.io/metabonaut/articles/a-end-to-end-untargeted-metabolomics.html","id":"quality-control-feature-prefiltering","dir":"Articles","previous_headings":"","what":"Quality control: Feature prefiltering","title":"Complete end-to-end LC-MS/MS Metabolomic Data analysis","text":"normalizing data can now pre-filter clean data performing statistical analysis. general, pre-filtering samples features performed remove outliers. copy original result object also keep unfiltered data later comparisons. eliminate features exhibit high variability dataset. Repeatedly measured QC samples typically serve robust basis cleansing datasets allowing identify features excessively high noise. data set external QC samples used, .e. pooled samples different collection using slightly different sample matrix, utility filtering somewhat limited. comprehensive description guidelines data filtering untargeted metabolomic studies, please refer [@broadhurst_guidelines_2018]. first restrict data set features chromatographic peak detected least 2/3 samples least one study samples groups. ensures statistical tests carried later study samples performed reliable signal. Also, filter remove features mostly detected QC samples, study samples. filter can performed filterFeatures() function xcms package PercentMissingFilter setting. parameters filer: threshold: defines maximal acceptable percentage samples missing value(s) least one sample groups defined parameter f. f: factor defining sample groups. replacing \"QC\" sample group NA parameter f exclude QC samples evaluation consider study samples. threshold = 40 keep features peak detected 2 3 samples one sample groups. consider detected chromatographic peaks per sample, apply filter \"raw\" assay result object, contains abundance values detected chromatographic peaks (prior gap-filling). Following guidelines stated decided still use QC samples pre-filtering, basis represent similar bio-fluids study samples, thus, anticipate observing relatively similar metabolites affected similar measurement biases. therefore evaluate dispersion ratio (Dratio) [@broadhurst_guidelines_2018] features data set. accomplish task using function time DratioFilter parameter. filters exist function invite user explore decide best dataset. Dratio filter powerful tool identify features exhibit high variability data, relating variance observed QC samples study samples. setting threshold 0.4, remove features high degree variability QC study samples. example, feature deviation QC higher 40% (threshold = 0.4)deviation study samples removed. filtering step ensures features retained considerably lower technical biological variance. Note rowDratio() rowRsd() functions MetaboCoreUtils package used calculate actual numeric values estimates used filtering, e.g. evaluate distribution whole data set identify data set-dependent threshold values. Finally, evaluate number features left filtering steps calculate percentage features removed. dataset reduced 9068 4279 features. remove considerable amount features expected want focus reliable features analysis. rest analysis need separate QC samples study samples. store QC samples separate object later use. addition calculate CV QC samples add additional column rowData() result object. used later prioritize identified significant features e.g. low technical noise. Now data set preprocessed, normalized filtered, can start evaluate distribution data estimate variation due biology.","code":"#' Number of features before filtering nrow(res) [1] 9068 #' keep unfiltered object res_unfilt <- res #' Limit features to those with at least two detected peaks in one study group. #' Setting the value for QC samples to NA excludes QC samples from the #' calculation. f <- res$phenotype f[f == \"QC\"] <- NA f <- as.factor(f) res <- filterFeatures(res, PercentMissingFilter(f = f, threshold = 40),                       assay = \"raw\") 1808 features were removed #' Compute and filter based on the Dratio filter_dratio <- DratioFilter(threshold = 0.4,                               qcIndex = res$phenotype == \"QC\",                               studyIndex = res$phenotype != \"QC\",                               mad = TRUE) res <- filterFeatures(res, filter = filter_dratio, assay = \"norm_imputed\") 2981 features were removed #' Number of features after analysis nrow(res) [1] 4279 #' Percentage left: end/beginning nrow(res)/nrow(res_unfilt) * 100 [1] 47.18791 res_qc <- res[, res$phenotype == \"QC\"] res <- res[, res$phenotype != \"QC\"] #' Calculate the QC's CV and add as feature variable to the data set rowData(res)$qc_cv <- assay(res_qc, \"norm\") |>                rowRsd()"},{"path":"https://rformassspectrometry.github.io/metabonaut/articles/a-end-to-end-untargeted-metabolomics.html","id":"differential-abundance-analysis","dir":"Articles","previous_headings":"","what":"Differential abundance analysis","title":"Complete end-to-end LC-MS/MS Metabolomic Data analysis","text":"normalization quality control, next step identify features differentially abundant study groups. crucial step allows us identify potential biomarkers metabolites associated study groups. various approaches methods available identification features interest. workflow use multiple linear regression analysis identify features significantly difference abundances CVD CTR study group. performing tests evaluate similarities study samples using PCA (excluding QC samples avoid influencing results).  Figure 34. PCA data normalization quality control. samples clearly separate study group PCA indicating differences metabolite profiles two groups. However, drives separation PC1 clear. evaluate whether explained available variable study, .e., age:  Figure 35. PCA colored age data normalization quality control. According PCA , PC1 seem related age. Even variance data set can’t explain stage, proceed (supervised) statistical tests identify features interest. compute linear models metabolite explaining observed feature abundance available study variables. also use base R function lm(), utilize R Biocpkg(\"limma\") package conduct differential abundance analysis: moderated test statistics [@smyth_linear_2004] provided package specifically well suited experiments limited number replicates. tests use linear model ~ phenotype + age, hence explaining abundances one metabolite accounting study group assignment age individual. analysis might benefit inclusion study covariate associated PC2 explaining variance seen principal component, present analysis participant’s age disease association provided. define design study model.matrix() function fit feature-wise linear models log2-transformed abundances using lmFit() function. P-values significance association calculated using eBayes() function, also performs empirical Bayes-based robust estimation standard errors. See also excellent vignette/user guide limma package examples details linear model procedure. linear models fitted, can now proceed extract results. create data frame containing coefficients, raw adjusted p-values (applying Benjamini-Hochberg correction, .e., method = \"BH\" improved control false discovery rate), average intensity signals CVD CTR samples, indication whether feature deemed significant . consider metabolites adjusted p-value smaller 0.05 significant, also include (absolute) difference abundances cut-criteria. last, add differential abundance results result object’s rowData(). can now proceed visualize distribution raw adjusted p-values.  Figure 36. Distribution raw (left) adjusted p-values (right). histograms show distribution raw adjusted p-values. Except enrichment small p-values, raw p-values (less) uniformly distributed, indicates absence strong systematic biases data. adjusted p-values conservative account multiple testing; important fit linear model feature therefore perform large number tests leads high chance false positive findings. see features low p-values, indicating likely significantly different two study groups. plot adjusted p-values log2 fold change (average) abundances. volcano plot allow us visualize features significantly different two study groups. highlighted blue color plot .  Figure 37. Volcano plot showing analysis results. interesting features top corners volcano plot (.e., features large difference abundance groups small p-value). significant features negative coefficient (log2 fold change value) indicating abundance lower CVD samples compared CTR samples. features listed, along average difference (log2) abundance compared groups, adjusted p-values, average (log2) abundance sample group RSD (CV) QC samples table . Table 7. Features significant differences abundances. visualize EICs significant features evaluate (raw) signal. restrict MS data set study samples. Parameters keepFeatures = TRUE: ensures identified features retained `subset object. peakBg: defines (background) color individual chromatographic peak EIC object.  Figure 38. Extracted ion chromatograms significant features. EICs significant features show clear single peak. intensities (already observed ) much larger CTR CVD samples. exception second feature (second EIC top row), intensities significant features however generally low. might make challenging identify using LC-MS/MS setup.","code":"#' Define the colors for the plot col_sample <- col_phenotype[res$phenotype]  #' Log transform and scale the data for PCA analysis vals <- assay(res, \"norm_imputed\") |>     t() |>     log2() |>     scale(center = TRUE, scale = TRUE) pca_res <- prcomp(vals, scale = FALSE, center = FALSE)  vals_st <- cbind(vals, phenotype = res$phenotype) autoplot(pca_res, data = vals_st , colour = 'phenotype', scale = 0) +     scale_color_manual(values = col_phenotype) #' Add age to the PCA plot vals_st <- cbind(vals, age = res$age) autoplot(pca_res, data = vals_st , colour = 'age', scale = 0) #' Define the linear model to be applied to the data p.cut <- 0.05     # cut-off for significance. m.cut <- 0.5      # cut-off for log2 fold change  age <- res$age phenotype <- factor(res$phenotype) design <- model.matrix(~ phenotype + age)  #' Fit the linear model to the data, explaining metabolite #' concentrations by phenotype and age. fit <- lmFit(log2(assay(res, \"norm_imputed\")), design = design) fit <- eBayes(fit) #' Compile a result data frame tmp <- data.frame(     coef.CVD = fit$coefficients[, \"phenotypeCVD\"],     pvalue.CVD = fit$p.value[, \"phenotypeCVD\"],     adjp.CVD = p.adjust(fit$p.value[, \"phenotypeCVD\"], method = \"BH\"),     avg.CVD = rowMeans(         log2(assay(res, \"norm_imputed\")[, res$phenotype == \"CVD\"])),     avg.CTR = rowMeans(         log2(assay(res, \"norm_imputed\")[, res$phenotype == \"CTR\"])) ) tmp$significant.CVD <- tmp$adjp.CVD < 0.05 #' Add the results to the object's rowData rowData(res) <- cbind(rowData(res), tmp) #' Plot the distribution of p-values par(mfrow = c(1, 2)) hist(rowData(res)$pvalue.CVD, breaks = 64, xlab = \"p value\",      main = \"Distribution of raw p-values\",      cex.main = 1, cex.lab = 1, cex.axis = 1) hist(rowData(res)$adjp.CVD, breaks = 64, xlab = expression(p[BH]~value),      main = \"Distribution of adjusted p-values\",      cex.main = 1, cex.lab = 1, cex.axis = 1) #' Plot volcano plot of the statistical results par(mfrow = c(1, 1), mar = c(5, 5, 5, 1)) plot(rowData(res)$coef.CVD, -log10(rowData(res)$adjp.CVD),      xlab = expression(log[2]~difference),      ylab = expression(-log[10]~p[BH]), pch = 16, col = \"#00000060\",      cex.main = 1.5, cex.lab = 1.5, cex.axis = 1.3) grid() abline(h = -log10(0.05), col = \"#0000ffcc\") if (any(rowData(res)$significant.CVD)) {     points(rowData(res)$coef.CVD[rowData(res)$significant.CVD],            -log10(rowData(res)$adjp.CVD[rowData(res)$significant.CVD]),            col = \"#0000ffcc\") } # Table of significant features tab <- rowData(res)[rowData(res)$significant.CVD,                     c(\"mzmed\", \"rtmed\", \"coef.CVD\", \"adjp.CVD\",                       \"avg.CTR\", \"avg.CVD\", \"qc_cv\")] |>     as.data.frame() tab <- tab[order(abs(tab$coef.CVD), decreasing = TRUE), ] kable(tab, format = \"pipe\") #' Restrict the raw data to study samples. lcms1_study <- lcms1[sampleData(lcms1)$phenotype != \"QC\", keepFeatures = TRUE] #' Extract EICs for the significant features eic_sign <- featureChromatograms(     lcms1_study, features = rownames(tab), expandRt = 5, filled = TRUE)  #' Plot the EICs. plot(eic_sign, col = col_sample,      peakBg = paste0(col_sample[chromPeaks(eic_sign)[, \"sample\"]], 40)) legend(\"topright\", col = col_phenotype, legend = names(col_phenotype), lty = 1)"},{"path":"https://rformassspectrometry.github.io/metabonaut/articles/a-end-to-end-untargeted-metabolomics.html","id":"annotation","dir":"Articles","previous_headings":"","what":"Annotation","title":"Complete end-to-end LC-MS/MS Metabolomic Data analysis","text":"now identified features significant differences abundances two study groups. provide information metabolic pathways differentiate affected healthy individuals might hence also serve biomarkers. However, stage analysis know compounds/metabolites actually represent. thus need now annotate signals. Annotation can performed different level confidence [@sumner_proposed_2007,@schymanski_identifying_2014]. lowest level annotation, highest rate false positive hits, bases features m/z ratios. Higher levels annotations employ fragment spectra (MS2 spectra) ions interest requiring however acquisition additional data. section, demonstrate multiple ways annotate significant features using functionality provided Bioconductor packages. Alternative approaches external software tools, may better suited, also discussed later section. data set acquired using LC-MS setup features thus characterized m/z retention times. retention time LC-setup-specific , without prior data/knowledge provide little information features’ identity. Modern MS instruments high accuracy m/z values therefore reliable estimates compound ion’s mass--charge ratio. first approach, use features’ m/z values match reference values, .e., exact masses chemical compounds provided reference database, case MassBank database. full MassBank data re-distributed Bioconductor’s AnnotationHub resource, simplifies integration reproducible R-based analysis workflows. load resource, list available MassBank data sets/releases load one . MassBank data provided self-contained SQLite database data can queried accessed CompoundDb Bioconductor package. use compounds() function extract small compound annotations database. MassBank (small compound annotation databases) provides (exact) molecular mass compound. Since almost small compounds neutral natural state, need first converted m/z values allow matching feature’s m/z. calculate m/z neutral mass, need assume ion (adduct) might generated measured metabolites employed electro-spray ionization. positive polarity, human serum samples, common ions protonated ([M+H]+), bear addition sodium ([M+Na]+) ammonium ([M+H-NH3]+) ions. match observed m/z values reference values potential ions use matchValues() function Mass2MzParam approach, allows specify types expected ions adducts parameter maximal allowed difference compared values using tolerance ppm parameters. first prepare data.frame significant features, set parameters matching perform comparison query features reference database. resulting Matched object shows 4 6 significant features matched ions compounds MassBank database. extract full result Matched object. Thus, total 237 ions compounds MassBank matched significant features based specified tolerance settings. Many compounds, different structure thus function/chemical property, identical chemical formula thus mass. Matching exclusively m/z features hence result many potentially false positive hits thus considered provide low confidence annotation. additional complication annotation resources, like MassBank, community maintained, contain large amount redundant information. reduce redundancy result table iterate hits feature keep matches unique compounds (identified INCHIKEY). INCHI INCHIKEY combine information compound’s chemical formula structure, different compounds can share chemical formula, different structure thus INCHI. Table 9. MS1 annotation results. table shows results MS1-based annotation process. can see four significant features matched. matches seem pretty accurate low ppm errors. deduplication performed considerably reduced number hits feature, first still matches ions large number compounds (chemical formula). Considering features’ m/z retention times MS1-based annotation increase annotation confidence, requires additional data, recording retention time thepure standard compound LC setup. alternative approach might provide better inside annotations help choose different annotations feature evaluate certain chemical properties possible matches. instance, LogP value, available several databases HMDB, provides insight given compound’s polarity. property highly affects interaction analyte column, usually also directly affects separation. Therefore, comparison analyte’s retention time polarity can help rule possible misidentifications. low confidence, MS1-based annotation can provide first candidate annotations confirmed rejected additional analyses. MS1 annotation fast efficient method annotate features therefore give first insight compounds significantly different two study groups. However, always accurate. MS2 data can provide higher level confidence annotation process provides, observed fragmentation pattern, information structure compound. MS2 data can generated LC-MS/MS measurement MS2 spectra recorded ions either data dependent acquisition (DDA) data independent acquisition (DIA) mode. Generally, advised include LC-MS/MS runs QC samples randomly selected study samples already acquisition MS1 data used quantification signals. alternative, addition, post-hoc LC-MS/MS acquisition can performed generate MS2 data needed annotation. present experiment, separate LC-MS/MS measurement conducted QC samples selected study samples generate data using inclusion list pre-selected ions. represent features found significantly different CVD CTR samples initial analysis full experiment. use subset second LC-MS/MS data set show data can used MS2-based annotation. differential abundance analysis found features significantly higher abundances CTR samples. Consequently, utilize MS2 data obtained CTR samples annotate significant features. load LC-MS/MS data experiment restrict data acquired CTR sample. Table 10. Samples LC-MS/MS data set. total 3 LC-MS/MS data files control samples, different collision energy fragment ions. show number MS1 MS2 spectra files. Compared number MS2 spectra, far less MS1 spectra acquired. configuration MS instrument set ensure ions specified inclusion list selected fragmentation, even intensity might low. setting, however, recorded MS2 spectra represent noise. plot shows location precursor ions m/z - retention time plane three files.  can see MS2 spectra recorded m/z interest along full retention time range, even actual ions eluting within certain retention time windows. next extract Spectra object MS data data object assign new spectra variable employed collision energy, extract data object sampleData. next filter MS data first restricting MS2 spectra removing mass peaks spectrum intensity lower 5% highest intensity spectrum, assuming low intensity peaks represent background signal. next remove also mass peaks m/z value greater equal precursor m/z ion. puts, later matching reference spectra, weight fragmentation pattern ions avoids hits based precursor m/z peak (hence similar mass compared compounds). last, restrict data spectra least two fragment peaks scale intensities sum 1 spectrum. similarity calculations affected scaling, makes visual comparison fragment spectra easier read. Finally, also speed later comparison spectra reference database, load full MS data memory (changing backend MsBackendMemory) apply processing steps performed data far. Keeping MS data memory performance benefits, generally suggested large data sets. evaluate impact present data set print addition size data object changing backend. thus moderate increase memory demand loading MS data memory (also filtered cleaned MS2 data). proceed match experimental MS2 spectra reference fragment spectra, workflow aim annotate features found significant differential abundance analysis. goal thus identify MS2 spectra second (LC-MS/MS) run represent fragments ions features data first (LC-MS) run. approach match MS2 spectra significant features determined earlier based precursor m/z retention time (given acceptable tolerance) feature’s m/z retention time. can easily done using featureArea() function effectively considers actual m/z retention time ranges features’ chromatographic peaks therefore increase chance finding correct match. however also assumes retention times first second run don’t differ much. Alternatively, need align retention times second LC-MS/MS data set first. first extract feature area, .e., m/z retention time ranges, significant features. next identify fragment spectra precursor m/z retention times within ranges. use filterRanges() function allows filter Spectra object using multiple ranges simultaneously. apply function separately feature (row matrix) extract MS2 spectra representing fragmentation information presumed feature’s ions. result apply() call list Spectra, element representing result one feature. exception last feature, multiple MS2 spectra identified. next combine list Spectra single Spectra object using concatenateSpectra() function add additional spectra variable containing respective feature identifier. now Spectra object fragment spectra significant features differential expression analysis. next build reference data need process way query spectra. extract fragment spectra MassBank database, restrict positive polarity data (since experiment acquired positive polarity) perform processing fragment spectra MassBank database. Note switch MsBackendMemory backend hence loading full data reference database memory. positive impact performance subsequent spectra matching, however also increase memory demand present analysis. Now Spectra object second run database spectra prepared, can proceed matching process. use matchSpectra() function MetaboAnnotation package CompareSpectraParam define settings matching. following parameters: requirePrecursor = TRUE: Limits spectra similarity calculations fragment spectra similar precursor m/z. tolerance ppm: Defines acceptable difference compared m/z values. relaxed tolerance settings ensure find matches even reference spectra acquired instruments lower accuracy. THRESHFUN: Defines matches report. , keep matches resulting spectra similarity score (calculated normalized dot product [@stein_optimization_1994], default similarity function) larger 0.6. Thus, total 315 query MS2 spectra, 16 matched (least) one reference fragment spectrum. restrict results matching spectra extract metadata query target spectra well similarity score (complete list available metadata information can listed colnames() function). Now, query-target pairs spectra similarity higher 0.6. Similar MS1-based annotation also result table contains redundant information: multiple fragment spectra per feature also MassBank contains several fragment spectra compound, measured using differing collision energies MS instruments, different laboratories. thus iterate feature-compound pairs select one highest score. identifier compound, use fragment spectra’s INCHI-key, since compound names MassBank accepted consensus/controlled vocabularies. Table 9.MS2 annotation results. Thus, 6 significant features, one annotated compound based MS2-based approach. many reasons failure find matches features. Although MS2 spectra selected feature, appear represent noise, features, LC-MS/MS run, low MS1 signal recorded, indicating selected sample original compound might (longer) present. Also, reference databases contain predominantly fragment spectra protonated ([M+H]+) ions compounds, features might represent signal types ions result different fragmentation pattern. Finally, fragment spectra compounds interest might also simply present used reference database. Thus, combining information MS1- MS2 based annotation can annotate one feature considerable confidence. feature m/z 195.0879 retention time 32 seconds seems ion caffeine. result somewhat disappointing also clearly shows importance proper experimental planning need control potential confounding factors. present experiment, disease-specific biomarker identified, life-style property individuals suffering disease: coffee consumption probably contraindicated patients CVD group reduce risk heart arrhythmia. plot EIC feature highlighting retention time highest scoring MS2 spectra recorded create mirror plot comparing MS2 spectra reference fragment spectra caffeine.  plot clearly shows higher signal feature CTR compared CVD samples. QC samples exhibit lower highly consistent signal, suggesting absence strong technical noise biases raw data experiment. vertical line indicates retention time fragment spectrum best match reference spectrum. noted , since fragment spectra measured separate LC-MS/MS experiment, considered indication approximate retention time ions fragmented second experiment. fragment spectrum feature, shown upper panel right plot highly similar reference spectrum caffeine MassBank (shown lower panel). addition matching precursor m/z, two fragments (m/z intensity) present spectra. can also extract additional metadata matching reference spectrum, used collision energy, fragmentation mode, instrument type, instrument well ion (adduct) fragmented. present workflow highlights annotation performed within R using packages Bioconductor project, also excellent external softwares used alternative, SIRIUS [@duhrkop_sirius_2019], mummichog [@li_predicting_2013] GNPS [@nothias_feature-based_2020] among others. use , data need exported format supported . MS2 spectra, data easily exported required MGF file format using MsBackendMgf Bioconductor package. Integration xcms feature-based molecular networking GNPS described GNPS documentation. alternative, addition, evidence potential matching chemical formula feature derived evaluating isotope pattern full MS1 scan. provide information isotope composition. Also , various functions isotopologues() MetaboCoreUtils package functionality envipat R package [@loos_accelerated_2015] used.","code":"#' load reference data ah <- AnnotationHub() #' List available MassBank data sets query(ah, \"MassBank\") AnnotationHub with 6 records # snapshotDate(): 2024-10-14 # $dataprovider: MassBank # $species: NA # $rdataclass: CompDb # additional mcols(): taxonomyid, genome, description, #   coordinate_1_based, maintainer, rdatadateadded, preparerclass, tags, #   rdatapath, sourceurl, sourcetype # retrieve records with, e.g., 'object[[\"AH107048\"]]'               title   AH107048 | MassBank CompDb for release 2021.03   AH107049 | MassBank CompDb for release 2022.06   AH111334 | MassBank CompDb for release 2022.12.1   AH116164 | MassBank CompDb for release 2023.06   AH116165 | MassBank CompDb for release 2023.09   AH116166 | MassBank CompDb for release 2023.11 #' Load one MAssBank release mb <- ah[[\"AH116166\"]] downloading 1 resources retrieving 1 resource loading from cache #' Extract compound annotations cmps <- compounds(mb, columns = c(\"compound_id\", \"name\", \"formula\",                                   \"exactmass\", \"inchikey\")) head(cmps) compound_id       formula exactmass                    inchikey 1           1    C27H29NO11  543.1741 AOJJSUZBOXZQNB-UHFFFAOYSA-N 2           2      C40H54O4  598.4022 KFNGKYUGHHQDEE-AXWOCEAUSA-N 3           3    C10H24N2O2  204.1838 AEUTYOVWOVBAKS-UWVGGRQHSA-N 4           4     C16H27NO5  313.1889 LMFKRLGHEKVMNT-UJDVCPFMSA-N 5           5 C20H15Cl3N2OS  435.9971 JLGKQTAYUIMGRK-UHFFFAOYSA-N 6           6      C15H14O5  274.0841 BWNCKEBBYADFPQ-UHFFFAOYSA-N                   name 1           Epirubicin 2 Crassostreaxanthin A 3           Ethambutol 4           Heliotrine 5        Sertaconazole 6    (R)Semivioxanthin #' Prepare query data frame rowData(res)$feature_id <- rownames(rowData(res)) res_sig <- res[rowData(res)$significant.CVD, ]  #' Setup parameters for the matching param <- Mass2MzParam(adducts = c(\"[M+H]+\", \"[M+Na]+\", \"[M+H-NH3]+\"),                       tolerance = 0, ppm = 5)  #' Perform the matching. mtch <- matchValues(res_sig, cmps, param = param, mzColname = \"mzmed\") mtch Object of class Matched Total number of matches: 237 Number of query objects: 6 (4 matched) Number of target objects: 117732 (237 matched) #' Extracting the results mtch_res <- matchedData(mtch, c(\"feature_id\", \"mzmed\", \"rtmed\",                                 \"adduct\", \"ppm_error\",                                 \"target_formula\", \"target_name\",                                 \"target_inchikey\")) mtch_res DataFrame with 239 rows and 8 columns         feature_id     mzmed     rtmed      adduct ppm_error target_formula                 FT0371      FT0371   138.055   148.396      [M+H]+   2.08055        C7H7NO2 FT0371      FT0371   138.055   148.396      [M+H]+   1.93568        C7H7NO2 FT0371      FT0371   138.055   148.396      [M+H]+   1.93568        C7H7NO2 FT0371      FT0371   138.055   148.396      [M+H]+   1.93568        C7H7NO2 FT0371      FT0371   138.055   148.396      [M+H]+   2.08055        C7H7NO2 ...            ...       ...       ...         ...       ...            ... FT1171      FT1171    229.13  181.0883     [M+Na]+   3.07708      C12H18N2O FT1171      FT1171    229.13  181.0883     [M+Na]+   3.07708      C12H18N2O FT1171      FT1171    229.13  181.0883     [M+Na]+   3.07708      C12H18N2O FT1171      FT1171    229.13  181.0883     [M+Na]+   3.07708      C12H18N2O FT5606      FT5606    560.36   33.5492          NA        NA             NA          target_name target_inchikey                FT0371 Benzohydro...   VDEUYMSGMP... FT0371 Trigonelli...   WWNNZCOKKK... FT0371 Trigonelli...   WWNNZCOKKK... FT0371 Trigonelli...   WWNNZCOKKK... FT0371 Salicylami...   SKZKKFZAGN... ...              ...             ... FT1171 Isoproturo...   PUIYMUZLKQ... FT1171 Isoproturo...   PUIYMUZLKQ... FT1171 Isoproturo...   PUIYMUZLKQ... FT1171 Isoproturo...   PUIYMUZLKQ... FT5606            NA              NA rownames(mtch_res) <- NULL  #' Keep only info on features that machted - create a utility function for that mtch_res <- split(mtch_res, mtch_res$feature_id) |>     lapply(function(x) {         lapply(split(x, x$target_inchikey), function(z) {             z[which.min(z$ppm_error), ]         })     }) |>     unlist(recursive = FALSE) |>     do.call(what = rbind)  #' Display the results kable(mtch_res, format = \"pipe\") #' Load form the MetaboLights Database param <- MetaboLightsParam(mtblsId = \"MTBLS8735\",                            assayName = paste0(\"a_MTBLS8735_LC-MSMS_positive_\",                            \"hilic_metabolite_profiling.txt\"),                            filePattern = \".mzML\")  lcms2 <- readMsObject(MsExperiment(),                      param,                      keepOntology = FALSE,                      keepProtocol = FALSE,                      simplify = TRUE) #adjust sampleData colnames(sampleData(lcms2)) <- c(\"sample_name\", \"derived_spectra_data_file\",                                 \"metabolite_asssignment_file\",                                 \"source_name\",                                 \"organism\",                                 \"blood_sample_type\",                                 \"sample_type\", \"age\", \"unit\", \"phenotype\")  # filter samples to keep MSMS data from CTR samples: sampleData(lcms2) <- sampleData(lcms2)[sampleData(lcms2)$phenotype == \"CTR\", ]  sampleData(lcms2) <- sampleData(lcms2)[grepl(\"MSMS\", sampleData(lcms2)$derived_spectra_data_file), ]  # Add fragmentation data information (from filenames) sampleData(lcms2)$fragmentation_mode <- c(\"CE20\", \"CE30\", \"CES\")  #let's look at the updated sample data sampleData(lcms2)[, c(\"derived_spectra_data_file\",                      \"phenotype\", \"sample_name\", \"age\")] |>     kable(format = \"pipe\") #' Filter the data to the same RT range as the LC-MS run lcms2 <- filterRt(lcms2, c(10, 240)) Filter spectra #' check the number of spectra per ms level spectra(lcms2) |>     msLevel() |>     split(spectraSampleIndex(lcms2)) |>     lapply(table) |>     do.call(what = cbind) 1    2    3    4   5    6    7    8   9   10   11   12 1 825  186  186  186 825  186  186  186 825  185  186  185 2 825 3121 3118 3124 825 3123 3118 3120 825 3117 3117 3116 plotPrecursorIons(lcms2) ms2_ctr <- spectra(lcms2) ms2_ctr$collision_energy <-     sampleData(lcms2)$fragmentation_mode[spectraSampleIndex(lcms2)] #' Remove low intensity peaks low_int <- function(x, ...) {     x > max(x, na.rm = TRUE) * 0.05 }  ms2_ctr <- filterMsLevel(ms2_ctr, 2L) |>     filterIntensity(intensity = low_int) #' Remove precursor peaks and restrict to spectra with a minimum #' number of peaks ms2_ctr <- filterPrecursorPeaks(ms2_ctr, ppm = 50, mz = \">=\") ms2_ctr <- ms2_ctr[lengths(ms2_ctr) > 1] |>     scalePeaks() #' Size of the object before loading into memory print(object.size(ms2_ctr), units = \"MB\") 5.1 Mb #' Load the MS data subset into memory ms2_ctr <- setBackend(ms2_ctr, MsBackendMemory()) ms2_ctr <- applyProcessing(ms2_ctr)  #' Size of the object after loading into memory print(object.size(ms2_ctr), units = \"MB\") 18.2 Mb #' Define the m/z and retention time ranges for the significant features target <- featureArea(lcms1)[rownames(res_sig), ] target mzmin    mzmax     rtmin     rtmax FT0371 138.0544 138.0552 146.32270 152.86115 FT0565 161.0391 161.0407 159.00234 164.30799 FT0732 182.0726 182.0756  32.71242  42.28755 FT0845 195.0799 195.0887  30.73235  35.67337 FT1171 229.1282 229.1335 178.01450 183.35303 FT5606 560.3539 560.3656  32.06570  35.33456 #' Identify for each feature MS2 spectra with their precursor m/z and #' retention time within the feature's m/z and retention time range ms2_ctr_fts <- apply(target[, c(\"rtmin\", \"rtmax\", \"mzmin\", \"mzmax\")],                      MARGIN = 1, FUN = filterRanges, object = ms2_ctr,                      spectraVariables = c(\"rtime\", \"precursorMz\")) lengths(ms2_ctr_fts) FT0371 FT0565 FT0732 FT0845 FT1171 FT5606     38     36    135     68     38      0 l <- lengths(ms2_ctr_fts) #' Combine the individual Spectra objects ms2_ctr_fts <- concatenateSpectra(ms2_ctr_fts) #' Assign the feature identifier to each MS2 spectrum ms2_ctr_fts$feature_id <- rep(rownames(res_sig), l) ms2_ref <- Spectra(mb) |>     filterPolarity(1L) |>     filterIntensity(intensity = low_int) |>     filterPrecursorPeaks(ppm = 50, mz = \">=\") ms2_ref <- ms2_ref[lengths(ms2_ref) > 1] |>     scalePeaks() register(SerialParam()) #' Define the settings for the spectra matching. prm <- CompareSpectraParam(ppm = 40, tolerance = 0.05,                            requirePrecursor = TRUE,                            THRESHFUN = function(x) which(x >= 0.6))  ms2_mtch <- matchSpectra(ms2_ctr_fts, ms2_ref, param = prm) ms2_mtch Object of class MatchedSpectra Total number of matches: 214 Number of query objects: 315 (16 matched) Number of target objects: 69561 (21 matched) #' Keep only query spectra with matching reference spectra ms2_mtch <- ms2_mtch[whichQuery(ms2_mtch)]  #' Extract the results ms2_mtch_res <- matchedData(ms2_mtch) nrow(ms2_mtch_res) [1] 214 #' - split the result per feature #' - select for each feature the best matching result for each compound #' - combine the result again into a data frame ms2_mtch_res <-     ms2_mtch_res |>     split(f = paste(ms2_mtch_res$feature_id, ms2_mtch_res$target_inchikey)) |>     lapply(function(z) {         z[which.max(z$score), ]     }) |>     do.call(what = rbind) |>     as.data.frame()  #' List the best matching feature-compound pair pandoc.table(ms2_mtch_res[, c(\"feature_id\", \"target_name\", \"score\",                               \"target_inchikey\")],              style = \"rmarkdown\",              caption = \"Table 9.MS2 annotation results.\",              split.table = Inf) par(mfrow = c(1, 2))  col_sample <- col_phenotype[sampleData(lcms1)$phenotype] #' Extract and plot EIC for the annotated feature eic <- featureChromatograms(lcms1, features = ms2_mtch_res$feature_id[1]) plot(eic, col = col_sample, peakCol = col_sample[chromPeaks(eic)[, \"sample\"]],      peakBg = paste0(col_sample[chromPeaks(eic)[, \"sample\"]], 20)) legend(\"topright\", col = col_phenotype, legend = names(col_phenotype), lty = 1)  #' Identify the best matching query-target spectra pair idx <- which.max(ms2_mtch_res$score)  #' Indicate the retention time of the MS2 spectrum in the EIC plot abline(v = ms2_mtch_res$rtime[idx])  #' Get the index of the MS2 spectrum in the query object query_idx <- which(query(ms2_mtch)$.original_query_index ==                                   ms2_mtch_res$.original_query_index[idx]) query_ms2 <- query(ms2_mtch)[query_idx] #' Get the index of the MS2 spectrum in the target object target_idx <- which(target(ms2_mtch)$spectrum_id ==                                     ms2_mtch_res$target_spectrum_id[idx]) target_ms2 <- target(ms2_mtch)[target_idx]  #' Create a mirror plot comparing the two best matching spectra plotSpectraMirror(query_ms2, target_ms2) legend(\"topleft\",        legend = paste0(\"precursor m/z: \", format(precursorMz(query_ms2), 3))) spectraData(target_ms2, c(\"collisionEnergy_text\", \"fragmentation_mode\",                           \"instrument_type\", \"instrument\", \"adduct\")) |>     as.data.frame() collisionEnergy_text fragmentation_mode instrument_type 1         55 (nominal)                HCD     LC-ESI-ITFT                          instrument adduct 1 LTQ Orbitrap XL Thermo Scientific [M+H]+"},{"path":"https://rformassspectrometry.github.io/metabonaut/articles/a-end-to-end-untargeted-metabolomics.html","id":"ms1-based-annotation","dir":"Articles","previous_headings":"","what":"MS1-based annotation","title":"Complete end-to-end LC-MS/MS Metabolomic Data analysis","text":"data set acquired using LC-MS setup features thus characterized m/z retention times. retention time LC-setup-specific , without prior data/knowledge provide little information features’ identity. Modern MS instruments high accuracy m/z values therefore reliable estimates compound ion’s mass--charge ratio. first approach, use features’ m/z values match reference values, .e., exact masses chemical compounds provided reference database, case MassBank database. full MassBank data re-distributed Bioconductor’s AnnotationHub resource, simplifies integration reproducible R-based analysis workflows. load resource, list available MassBank data sets/releases load one . MassBank data provided self-contained SQLite database data can queried accessed CompoundDb Bioconductor package. use compounds() function extract small compound annotations database. MassBank (small compound annotation databases) provides (exact) molecular mass compound. Since almost small compounds neutral natural state, need first converted m/z values allow matching feature’s m/z. calculate m/z neutral mass, need assume ion (adduct) might generated measured metabolites employed electro-spray ionization. positive polarity, human serum samples, common ions protonated ([M+H]+), bear addition sodium ([M+Na]+) ammonium ([M+H-NH3]+) ions. match observed m/z values reference values potential ions use matchValues() function Mass2MzParam approach, allows specify types expected ions adducts parameter maximal allowed difference compared values using tolerance ppm parameters. first prepare data.frame significant features, set parameters matching perform comparison query features reference database. resulting Matched object shows 4 6 significant features matched ions compounds MassBank database. extract full result Matched object. Thus, total 237 ions compounds MassBank matched significant features based specified tolerance settings. Many compounds, different structure thus function/chemical property, identical chemical formula thus mass. Matching exclusively m/z features hence result many potentially false positive hits thus considered provide low confidence annotation. additional complication annotation resources, like MassBank, community maintained, contain large amount redundant information. reduce redundancy result table iterate hits feature keep matches unique compounds (identified INCHIKEY). INCHI INCHIKEY combine information compound’s chemical formula structure, different compounds can share chemical formula, different structure thus INCHI. Table 9. MS1 annotation results. table shows results MS1-based annotation process. can see four significant features matched. matches seem pretty accurate low ppm errors. deduplication performed considerably reduced number hits feature, first still matches ions large number compounds (chemical formula). Considering features’ m/z retention times MS1-based annotation increase annotation confidence, requires additional data, recording retention time thepure standard compound LC setup. alternative approach might provide better inside annotations help choose different annotations feature evaluate certain chemical properties possible matches. instance, LogP value, available several databases HMDB, provides insight given compound’s polarity. property highly affects interaction analyte column, usually also directly affects separation. Therefore, comparison analyte’s retention time polarity can help rule possible misidentifications. low confidence, MS1-based annotation can provide first candidate annotations confirmed rejected additional analyses.","code":"#' load reference data ah <- AnnotationHub() #' List available MassBank data sets query(ah, \"MassBank\") AnnotationHub with 6 records # snapshotDate(): 2024-10-14 # $dataprovider: MassBank # $species: NA # $rdataclass: CompDb # additional mcols(): taxonomyid, genome, description, #   coordinate_1_based, maintainer, rdatadateadded, preparerclass, tags, #   rdatapath, sourceurl, sourcetype # retrieve records with, e.g., 'object[[\"AH107048\"]]'               title   AH107048 | MassBank CompDb for release 2021.03   AH107049 | MassBank CompDb for release 2022.06   AH111334 | MassBank CompDb for release 2022.12.1   AH116164 | MassBank CompDb for release 2023.06   AH116165 | MassBank CompDb for release 2023.09   AH116166 | MassBank CompDb for release 2023.11 #' Load one MAssBank release mb <- ah[[\"AH116166\"]] downloading 1 resources retrieving 1 resource loading from cache #' Extract compound annotations cmps <- compounds(mb, columns = c(\"compound_id\", \"name\", \"formula\",                                   \"exactmass\", \"inchikey\")) head(cmps) compound_id       formula exactmass                    inchikey 1           1    C27H29NO11  543.1741 AOJJSUZBOXZQNB-UHFFFAOYSA-N 2           2      C40H54O4  598.4022 KFNGKYUGHHQDEE-AXWOCEAUSA-N 3           3    C10H24N2O2  204.1838 AEUTYOVWOVBAKS-UWVGGRQHSA-N 4           4     C16H27NO5  313.1889 LMFKRLGHEKVMNT-UJDVCPFMSA-N 5           5 C20H15Cl3N2OS  435.9971 JLGKQTAYUIMGRK-UHFFFAOYSA-N 6           6      C15H14O5  274.0841 BWNCKEBBYADFPQ-UHFFFAOYSA-N                   name 1           Epirubicin 2 Crassostreaxanthin A 3           Ethambutol 4           Heliotrine 5        Sertaconazole 6    (R)Semivioxanthin #' Prepare query data frame rowData(res)$feature_id <- rownames(rowData(res)) res_sig <- res[rowData(res)$significant.CVD, ]  #' Setup parameters for the matching param <- Mass2MzParam(adducts = c(\"[M+H]+\", \"[M+Na]+\", \"[M+H-NH3]+\"),                       tolerance = 0, ppm = 5)  #' Perform the matching. mtch <- matchValues(res_sig, cmps, param = param, mzColname = \"mzmed\") mtch Object of class Matched Total number of matches: 237 Number of query objects: 6 (4 matched) Number of target objects: 117732 (237 matched) #' Extracting the results mtch_res <- matchedData(mtch, c(\"feature_id\", \"mzmed\", \"rtmed\",                                 \"adduct\", \"ppm_error\",                                 \"target_formula\", \"target_name\",                                 \"target_inchikey\")) mtch_res DataFrame with 239 rows and 8 columns         feature_id     mzmed     rtmed      adduct ppm_error target_formula                 FT0371      FT0371   138.055   148.396      [M+H]+   2.08055        C7H7NO2 FT0371      FT0371   138.055   148.396      [M+H]+   1.93568        C7H7NO2 FT0371      FT0371   138.055   148.396      [M+H]+   1.93568        C7H7NO2 FT0371      FT0371   138.055   148.396      [M+H]+   1.93568        C7H7NO2 FT0371      FT0371   138.055   148.396      [M+H]+   2.08055        C7H7NO2 ...            ...       ...       ...         ...       ...            ... FT1171      FT1171    229.13  181.0883     [M+Na]+   3.07708      C12H18N2O FT1171      FT1171    229.13  181.0883     [M+Na]+   3.07708      C12H18N2O FT1171      FT1171    229.13  181.0883     [M+Na]+   3.07708      C12H18N2O FT1171      FT1171    229.13  181.0883     [M+Na]+   3.07708      C12H18N2O FT5606      FT5606    560.36   33.5492          NA        NA             NA          target_name target_inchikey                FT0371 Benzohydro...   VDEUYMSGMP... FT0371 Trigonelli...   WWNNZCOKKK... FT0371 Trigonelli...   WWNNZCOKKK... FT0371 Trigonelli...   WWNNZCOKKK... FT0371 Salicylami...   SKZKKFZAGN... ...              ...             ... FT1171 Isoproturo...   PUIYMUZLKQ... FT1171 Isoproturo...   PUIYMUZLKQ... FT1171 Isoproturo...   PUIYMUZLKQ... FT1171 Isoproturo...   PUIYMUZLKQ... FT5606            NA              NA rownames(mtch_res) <- NULL  #' Keep only info on features that machted - create a utility function for that mtch_res <- split(mtch_res, mtch_res$feature_id) |>     lapply(function(x) {         lapply(split(x, x$target_inchikey), function(z) {             z[which.min(z$ppm_error), ]         })     }) |>     unlist(recursive = FALSE) |>     do.call(what = rbind)  #' Display the results kable(mtch_res, format = \"pipe\")"},{"path":"https://rformassspectrometry.github.io/metabonaut/articles/a-end-to-end-untargeted-metabolomics.html","id":"ms2-based-annotation","dir":"Articles","previous_headings":"","what":"MS2-based annotation","title":"Complete end-to-end LC-MS/MS Metabolomic Data analysis","text":"MS1 annotation fast efficient method annotate features therefore give first insight compounds significantly different two study groups. However, always accurate. MS2 data can provide higher level confidence annotation process provides, observed fragmentation pattern, information structure compound. MS2 data can generated LC-MS/MS measurement MS2 spectra recorded ions either data dependent acquisition (DDA) data independent acquisition (DIA) mode. Generally, advised include LC-MS/MS runs QC samples randomly selected study samples already acquisition MS1 data used quantification signals. alternative, addition, post-hoc LC-MS/MS acquisition can performed generate MS2 data needed annotation. present experiment, separate LC-MS/MS measurement conducted QC samples selected study samples generate data using inclusion list pre-selected ions. represent features found significantly different CVD CTR samples initial analysis full experiment. use subset second LC-MS/MS data set show data can used MS2-based annotation. differential abundance analysis found features significantly higher abundances CTR samples. Consequently, utilize MS2 data obtained CTR samples annotate significant features. load LC-MS/MS data experiment restrict data acquired CTR sample. Table 10. Samples LC-MS/MS data set. total 3 LC-MS/MS data files control samples, different collision energy fragment ions. show number MS1 MS2 spectra files. Compared number MS2 spectra, far less MS1 spectra acquired. configuration MS instrument set ensure ions specified inclusion list selected fragmentation, even intensity might low. setting, however, recorded MS2 spectra represent noise. plot shows location precursor ions m/z - retention time plane three files.  can see MS2 spectra recorded m/z interest along full retention time range, even actual ions eluting within certain retention time windows. next extract Spectra object MS data data object assign new spectra variable employed collision energy, extract data object sampleData. next filter MS data first restricting MS2 spectra removing mass peaks spectrum intensity lower 5% highest intensity spectrum, assuming low intensity peaks represent background signal. next remove also mass peaks m/z value greater equal precursor m/z ion. puts, later matching reference spectra, weight fragmentation pattern ions avoids hits based precursor m/z peak (hence similar mass compared compounds). last, restrict data spectra least two fragment peaks scale intensities sum 1 spectrum. similarity calculations affected scaling, makes visual comparison fragment spectra easier read. Finally, also speed later comparison spectra reference database, load full MS data memory (changing backend MsBackendMemory) apply processing steps performed data far. Keeping MS data memory performance benefits, generally suggested large data sets. evaluate impact present data set print addition size data object changing backend. thus moderate increase memory demand loading MS data memory (also filtered cleaned MS2 data). proceed match experimental MS2 spectra reference fragment spectra, workflow aim annotate features found significant differential abundance analysis. goal thus identify MS2 spectra second (LC-MS/MS) run represent fragments ions features data first (LC-MS) run. approach match MS2 spectra significant features determined earlier based precursor m/z retention time (given acceptable tolerance) feature’s m/z retention time. can easily done using featureArea() function effectively considers actual m/z retention time ranges features’ chromatographic peaks therefore increase chance finding correct match. however also assumes retention times first second run don’t differ much. Alternatively, need align retention times second LC-MS/MS data set first. first extract feature area, .e., m/z retention time ranges, significant features. next identify fragment spectra precursor m/z retention times within ranges. use filterRanges() function allows filter Spectra object using multiple ranges simultaneously. apply function separately feature (row matrix) extract MS2 spectra representing fragmentation information presumed feature’s ions. result apply() call list Spectra, element representing result one feature. exception last feature, multiple MS2 spectra identified. next combine list Spectra single Spectra object using concatenateSpectra() function add additional spectra variable containing respective feature identifier. now Spectra object fragment spectra significant features differential expression analysis. next build reference data need process way query spectra. extract fragment spectra MassBank database, restrict positive polarity data (since experiment acquired positive polarity) perform processing fragment spectra MassBank database. Note switch MsBackendMemory backend hence loading full data reference database memory. positive impact performance subsequent spectra matching, however also increase memory demand present analysis. Now Spectra object second run database spectra prepared, can proceed matching process. use matchSpectra() function MetaboAnnotation package CompareSpectraParam define settings matching. following parameters: requirePrecursor = TRUE: Limits spectra similarity calculations fragment spectra similar precursor m/z. tolerance ppm: Defines acceptable difference compared m/z values. relaxed tolerance settings ensure find matches even reference spectra acquired instruments lower accuracy. THRESHFUN: Defines matches report. , keep matches resulting spectra similarity score (calculated normalized dot product [@stein_optimization_1994], default similarity function) larger 0.6. Thus, total 315 query MS2 spectra, 16 matched (least) one reference fragment spectrum. restrict results matching spectra extract metadata query target spectra well similarity score (complete list available metadata information can listed colnames() function). Now, query-target pairs spectra similarity higher 0.6. Similar MS1-based annotation also result table contains redundant information: multiple fragment spectra per feature also MassBank contains several fragment spectra compound, measured using differing collision energies MS instruments, different laboratories. thus iterate feature-compound pairs select one highest score. identifier compound, use fragment spectra’s INCHI-key, since compound names MassBank accepted consensus/controlled vocabularies. Table 9.MS2 annotation results. Thus, 6 significant features, one annotated compound based MS2-based approach. many reasons failure find matches features. Although MS2 spectra selected feature, appear represent noise, features, LC-MS/MS run, low MS1 signal recorded, indicating selected sample original compound might (longer) present. Also, reference databases contain predominantly fragment spectra protonated ([M+H]+) ions compounds, features might represent signal types ions result different fragmentation pattern. Finally, fragment spectra compounds interest might also simply present used reference database. Thus, combining information MS1- MS2 based annotation can annotate one feature considerable confidence. feature m/z 195.0879 retention time 32 seconds seems ion caffeine. result somewhat disappointing also clearly shows importance proper experimental planning need control potential confounding factors. present experiment, disease-specific biomarker identified, life-style property individuals suffering disease: coffee consumption probably contraindicated patients CVD group reduce risk heart arrhythmia. plot EIC feature highlighting retention time highest scoring MS2 spectra recorded create mirror plot comparing MS2 spectra reference fragment spectra caffeine.  plot clearly shows higher signal feature CTR compared CVD samples. QC samples exhibit lower highly consistent signal, suggesting absence strong technical noise biases raw data experiment. vertical line indicates retention time fragment spectrum best match reference spectrum. noted , since fragment spectra measured separate LC-MS/MS experiment, considered indication approximate retention time ions fragmented second experiment. fragment spectrum feature, shown upper panel right plot highly similar reference spectrum caffeine MassBank (shown lower panel). addition matching precursor m/z, two fragments (m/z intensity) present spectra. can also extract additional metadata matching reference spectrum, used collision energy, fragmentation mode, instrument type, instrument well ion (adduct) fragmented.","code":"#' Load form the MetaboLights Database param <- MetaboLightsParam(mtblsId = \"MTBLS8735\",                            assayName = paste0(\"a_MTBLS8735_LC-MSMS_positive_\",                            \"hilic_metabolite_profiling.txt\"),                            filePattern = \".mzML\")  lcms2 <- readMsObject(MsExperiment(),                      param,                      keepOntology = FALSE,                      keepProtocol = FALSE,                      simplify = TRUE) #adjust sampleData colnames(sampleData(lcms2)) <- c(\"sample_name\", \"derived_spectra_data_file\",                                 \"metabolite_asssignment_file\",                                 \"source_name\",                                 \"organism\",                                 \"blood_sample_type\",                                 \"sample_type\", \"age\", \"unit\", \"phenotype\")  # filter samples to keep MSMS data from CTR samples: sampleData(lcms2) <- sampleData(lcms2)[sampleData(lcms2)$phenotype == \"CTR\", ]  sampleData(lcms2) <- sampleData(lcms2)[grepl(\"MSMS\", sampleData(lcms2)$derived_spectra_data_file), ]  # Add fragmentation data information (from filenames) sampleData(lcms2)$fragmentation_mode <- c(\"CE20\", \"CE30\", \"CES\")  #let's look at the updated sample data sampleData(lcms2)[, c(\"derived_spectra_data_file\",                      \"phenotype\", \"sample_name\", \"age\")] |>     kable(format = \"pipe\") #' Filter the data to the same RT range as the LC-MS run lcms2 <- filterRt(lcms2, c(10, 240)) Filter spectra #' check the number of spectra per ms level spectra(lcms2) |>     msLevel() |>     split(spectraSampleIndex(lcms2)) |>     lapply(table) |>     do.call(what = cbind) 1    2    3    4   5    6    7    8   9   10   11   12 1 825  186  186  186 825  186  186  186 825  185  186  185 2 825 3121 3118 3124 825 3123 3118 3120 825 3117 3117 3116 plotPrecursorIons(lcms2) ms2_ctr <- spectra(lcms2) ms2_ctr$collision_energy <-     sampleData(lcms2)$fragmentation_mode[spectraSampleIndex(lcms2)] #' Remove low intensity peaks low_int <- function(x, ...) {     x > max(x, na.rm = TRUE) * 0.05 }  ms2_ctr <- filterMsLevel(ms2_ctr, 2L) |>     filterIntensity(intensity = low_int) #' Remove precursor peaks and restrict to spectra with a minimum #' number of peaks ms2_ctr <- filterPrecursorPeaks(ms2_ctr, ppm = 50, mz = \">=\") ms2_ctr <- ms2_ctr[lengths(ms2_ctr) > 1] |>     scalePeaks() #' Size of the object before loading into memory print(object.size(ms2_ctr), units = \"MB\") 5.1 Mb #' Load the MS data subset into memory ms2_ctr <- setBackend(ms2_ctr, MsBackendMemory()) ms2_ctr <- applyProcessing(ms2_ctr)  #' Size of the object after loading into memory print(object.size(ms2_ctr), units = \"MB\") 18.2 Mb #' Define the m/z and retention time ranges for the significant features target <- featureArea(lcms1)[rownames(res_sig), ] target mzmin    mzmax     rtmin     rtmax FT0371 138.0544 138.0552 146.32270 152.86115 FT0565 161.0391 161.0407 159.00234 164.30799 FT0732 182.0726 182.0756  32.71242  42.28755 FT0845 195.0799 195.0887  30.73235  35.67337 FT1171 229.1282 229.1335 178.01450 183.35303 FT5606 560.3539 560.3656  32.06570  35.33456 #' Identify for each feature MS2 spectra with their precursor m/z and #' retention time within the feature's m/z and retention time range ms2_ctr_fts <- apply(target[, c(\"rtmin\", \"rtmax\", \"mzmin\", \"mzmax\")],                      MARGIN = 1, FUN = filterRanges, object = ms2_ctr,                      spectraVariables = c(\"rtime\", \"precursorMz\")) lengths(ms2_ctr_fts) FT0371 FT0565 FT0732 FT0845 FT1171 FT5606     38     36    135     68     38      0 l <- lengths(ms2_ctr_fts) #' Combine the individual Spectra objects ms2_ctr_fts <- concatenateSpectra(ms2_ctr_fts) #' Assign the feature identifier to each MS2 spectrum ms2_ctr_fts$feature_id <- rep(rownames(res_sig), l) ms2_ref <- Spectra(mb) |>     filterPolarity(1L) |>     filterIntensity(intensity = low_int) |>     filterPrecursorPeaks(ppm = 50, mz = \">=\") ms2_ref <- ms2_ref[lengths(ms2_ref) > 1] |>     scalePeaks() register(SerialParam()) #' Define the settings for the spectra matching. prm <- CompareSpectraParam(ppm = 40, tolerance = 0.05,                            requirePrecursor = TRUE,                            THRESHFUN = function(x) which(x >= 0.6))  ms2_mtch <- matchSpectra(ms2_ctr_fts, ms2_ref, param = prm) ms2_mtch Object of class MatchedSpectra Total number of matches: 214 Number of query objects: 315 (16 matched) Number of target objects: 69561 (21 matched) #' Keep only query spectra with matching reference spectra ms2_mtch <- ms2_mtch[whichQuery(ms2_mtch)]  #' Extract the results ms2_mtch_res <- matchedData(ms2_mtch) nrow(ms2_mtch_res) [1] 214 #' - split the result per feature #' - select for each feature the best matching result for each compound #' - combine the result again into a data frame ms2_mtch_res <-     ms2_mtch_res |>     split(f = paste(ms2_mtch_res$feature_id, ms2_mtch_res$target_inchikey)) |>     lapply(function(z) {         z[which.max(z$score), ]     }) |>     do.call(what = rbind) |>     as.data.frame()  #' List the best matching feature-compound pair pandoc.table(ms2_mtch_res[, c(\"feature_id\", \"target_name\", \"score\",                               \"target_inchikey\")],              style = \"rmarkdown\",              caption = \"Table 9.MS2 annotation results.\",              split.table = Inf) par(mfrow = c(1, 2))  col_sample <- col_phenotype[sampleData(lcms1)$phenotype] #' Extract and plot EIC for the annotated feature eic <- featureChromatograms(lcms1, features = ms2_mtch_res$feature_id[1]) plot(eic, col = col_sample, peakCol = col_sample[chromPeaks(eic)[, \"sample\"]],      peakBg = paste0(col_sample[chromPeaks(eic)[, \"sample\"]], 20)) legend(\"topright\", col = col_phenotype, legend = names(col_phenotype), lty = 1)  #' Identify the best matching query-target spectra pair idx <- which.max(ms2_mtch_res$score)  #' Indicate the retention time of the MS2 spectrum in the EIC plot abline(v = ms2_mtch_res$rtime[idx])  #' Get the index of the MS2 spectrum in the query object query_idx <- which(query(ms2_mtch)$.original_query_index ==                                   ms2_mtch_res$.original_query_index[idx]) query_ms2 <- query(ms2_mtch)[query_idx] #' Get the index of the MS2 spectrum in the target object target_idx <- which(target(ms2_mtch)$spectrum_id ==                                     ms2_mtch_res$target_spectrum_id[idx]) target_ms2 <- target(ms2_mtch)[target_idx]  #' Create a mirror plot comparing the two best matching spectra plotSpectraMirror(query_ms2, target_ms2) legend(\"topleft\",        legend = paste0(\"precursor m/z: \", format(precursorMz(query_ms2), 3))) spectraData(target_ms2, c(\"collisionEnergy_text\", \"fragmentation_mode\",                           \"instrument_type\", \"instrument\", \"adduct\")) |>     as.data.frame() collisionEnergy_text fragmentation_mode instrument_type 1         55 (nominal)                HCD     LC-ESI-ITFT                          instrument adduct 1 LTQ Orbitrap XL Thermo Scientific [M+H]+"},{"path":"https://rformassspectrometry.github.io/metabonaut/articles/a-end-to-end-untargeted-metabolomics.html","id":"external-tools-or-alternative-annotation-approaches","dir":"Articles","previous_headings":"","what":"External tools or alternative annotation approaches","title":"Complete end-to-end LC-MS/MS Metabolomic Data analysis","text":"present workflow highlights annotation performed within R using packages Bioconductor project, also excellent external softwares used alternative, SIRIUS [@duhrkop_sirius_2019], mummichog [@li_predicting_2013] GNPS [@nothias_feature-based_2020] among others. use , data need exported format supported . MS2 spectra, data easily exported required MGF file format using MsBackendMgf Bioconductor package. Integration xcms feature-based molecular networking GNPS described GNPS documentation. alternative, addition, evidence potential matching chemical formula feature derived evaluating isotope pattern full MS1 scan. provide information isotope composition. Also , various functions isotopologues() MetaboCoreUtils package functionality envipat R package [@loos_accelerated_2015] used.","code":""},{"path":"https://rformassspectrometry.github.io/metabonaut/articles/a-end-to-end-untargeted-metabolomics.html","id":"summary","dir":"Articles","previous_headings":"","what":"Summary","title":"Complete end-to-end LC-MS/MS Metabolomic Data analysis","text":"tutorial, describe end--end workflow LC-MS-based untargeted metabolomics experiments, conducted entirely within R using packages Bioconductor project base R functionality. excellent software exists perform similar analyses, power R-based workflow lies adaptability individual data sets research questions ability build reproducible workflows documentation. Due space restrictions don’t provide comprehensive listing methodologies individual analysis steps. advanced options approaches available, e.g., normalization data, however also heavily dependent size properties analyzed data set, well annotation features. result, found present analysis set features significant abundance differences compared groups. however reliably annotate single feature, related lifestyle individuals rather pathological properties investigated disease. low proportion annotated signals however uncommon untargeted metabolomics experiments reflects need comprehensive reliable reference annotation libraries.","code":""},{"path":"https://rformassspectrometry.github.io/metabonaut/articles/a-end-to-end-untargeted-metabolomics.html","id":"session-information","dir":"Articles","previous_headings":"","what":"Session information","title":"Complete end-to-end LC-MS/MS Metabolomic Data analysis","text":"","code":"sessionInfo() R version 4.4.1 (2024-06-14) Platform: x86_64-pc-linux-gnu Running under: Ubuntu 22.04.5 LTS  Matrix products: default BLAS:   /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 LAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so;  LAPACK version 3.10.0  locale:  [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C  [3] LC_TIME=en_US.UTF-8        LC_COLLATE=en_US.UTF-8  [5] LC_MONETARY=en_US.UTF-8    LC_MESSAGES=en_US.UTF-8  [7] LC_PAPER=en_US.UTF-8       LC_NAME=C  [9] LC_ADDRESS=C               LC_TELEPHONE=C [11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C  time zone: Etc/UTC tzcode source: system (glibc)  attached base packages: [1] stats4    stats     graphics  grDevices utils     datasets  methods [8] base  other attached packages:  [1] MetaboAnnotation_1.9.2       CompoundDb_1.9.5  [3] AnnotationFilter_1.29.0      AnnotationHub_3.13.3  [5] BiocFileCache_2.13.2         dbplyr_2.5.0  [7] gridExtra_2.3                ggfortify_0.4.17  [9] ggplot2_3.5.1                vioplot_0.5.0 [11] zoo_1.8-12                   sm_2.2-6.0 [13] pheatmap_1.0.12              RColorBrewer_1.1-3 [15] pander_0.6.5                 limma_3.61.12 [17] MetaboCoreUtils_1.13.0       xcms_4.3.3 [19] SummarizedExperiment_1.35.4  Biobase_2.65.1 [21] GenomicRanges_1.57.2         GenomeInfoDb_1.41.2 [23] IRanges_2.39.2               MatrixGenerics_1.17.0 [25] matrixStats_1.4.1            MsBackendMetaboLights_0.99.1 [27] Spectra_1.15.12              BiocParallel_1.39.0 [29] S4Vectors_0.43.2             BiocGenerics_0.51.3 [31] MsIO_0.0.6                   MsExperiment_1.7.0 [33] ProtGenerics_1.37.1          readxl_1.4.3 [35] BiocStyle_2.33.1             quarto_1.4.4 [37] knitr_1.48  loaded via a namespace (and not attached):   [1] later_1.3.2                 bitops_1.0-9   [3] filelock_1.0.3              tibble_3.2.1   [5] cellranger_1.1.0            preprocessCore_1.67.1   [7] XML_3.99-0.17               lifecycle_1.0.4   [9] doParallel_1.0.17           processx_3.8.4  [11] lattice_0.22-6              MASS_7.3-61  [13] alabaster.base_1.5.10       MultiAssayExperiment_1.31.5  [15] magrittr_2.0.3              rmarkdown_2.28  [17] yaml_2.3.10                 MsCoreUtils_1.17.2  [19] DBI_1.2.3                   abind_1.4-8  [21] zlibbioc_1.51.1             purrr_1.0.2  [23] RCurl_1.98-1.16             rappdirs_0.3.3  [25] GenomeInfoDbData_1.2.13     MSnbase_2.31.1  [27] ncdf4_1.23                  codetools_0.2-20  [29] DelayedArray_0.31.14        DT_0.33  [31] xml2_1.3.6                  tidyselect_1.2.1  [33] UCSC.utils_1.1.0            farver_2.1.2  [35] base64enc_0.1-3             jsonlite_1.8.9  [37] iterators_1.0.14            foreach_1.5.2  [39] tools_4.4.1                 progress_1.2.3  [41] Rcpp_1.0.13                 glue_1.8.0  [43] SparseArray_1.5.45          xfun_0.48  [45] dplyr_1.1.4                 withr_3.0.1  [47] BiocManager_1.30.25         fastmap_1.2.0  [49] rhdf5filters_1.17.0         fansi_1.0.6  [51] digest_0.6.37               R6_2.5.1  [53] mime_0.12                   colorspace_2.1-1  [55] rsvg_2.6.1                  RSQLite_2.3.7  [57] utf8_1.2.4                  tidyr_1.3.1  [59] generics_0.1.3              prettyunits_1.2.0  [61] PSMatch_1.9.0               httr_1.4.7  [63] htmlwidgets_1.6.4           S4Arrays_1.5.11  [65] pkgconfig_2.0.3             gtable_0.3.5  [67] blob_1.2.4                  impute_1.79.0  [69] MassSpecWavelet_1.71.0      XVector_0.45.0  [71] htmltools_0.5.8.1           MALDIquant_1.22.3  [73] clue_0.3-65                 scales_1.3.0  [75] png_0.1-8                   rstudioapi_0.17.0  [77] reshape2_1.4.4              rjson_0.2.23  [79] curl_5.2.3                  cachem_1.1.0  [81] rhdf5_2.49.0                stringr_1.5.1  [83] BiocVersion_3.20.0          parallel_4.4.1  [85] AnnotationDbi_1.67.0        mzID_1.43.0  [87] vsn_3.73.0                  pillar_1.9.0  [89] grid_4.4.1                  alabaster.schemas_1.5.0  [91] vctrs_0.6.5                 MsFeatures_1.13.0  [93] pcaMethods_1.97.0           cluster_2.1.6  [95] evaluate_1.0.1              cli_3.6.3  [97] compiler_4.4.1              rlang_1.1.4  [99] crayon_1.5.3                labeling_0.4.3 [101] QFeatures_1.15.3            ChemmineR_3.57.1 [103] ps_1.8.0                    affy_1.83.1 [105] plyr_1.8.9                  fs_1.6.4 [107] stringi_1.8.4               munsell_0.5.1 [109] Biostrings_2.73.2           lazyeval_0.2.2 [111] Matrix_1.7-1                hms_1.1.3 [113] bit64_4.5.2                 Rhdf5lib_1.27.0 [115] KEGGREST_1.45.1             statmod_1.5.0 [117] mzR_2.39.2                  igraph_2.1.1 [119] memoise_2.0.1               affyio_1.75.1 [121] bit_4.5.0"},{"path":[]},{"path":"https://rformassspectrometry.github.io/metabonaut/articles/a-end-to-end-untargeted-metabolomics.html","id":"appendix","dir":"Articles","previous_headings":"","what":"Appendix","title":"Complete end-to-end LC-MS/MS Metabolomic Data analysis","text":"Thanks Steffen Neumann continuous work develop maintain xcms software. … align data set using internal standards. suggested eventually enrich anchor peaks signal ions retention time regions covered internal standards.","code":""},{"path":"https://rformassspectrometry.github.io/metabonaut/articles/a-end-to-end-untargeted-metabolomics.html","id":"aknowledgment","dir":"Articles","previous_headings":"","what":"Aknowledgment","title":"Complete end-to-end LC-MS/MS Metabolomic Data analysis","text":"Thanks Steffen Neumann continuous work develop maintain xcms software. …","code":""},{"path":"https://rformassspectrometry.github.io/metabonaut/articles/a-end-to-end-untargeted-metabolomics.html","id":"alignment-using-manually-selected-anchor-peaks","dir":"Articles","previous_headings":"","what":"Alignment using manually selected anchor peaks","title":"Complete end-to-end LC-MS/MS Metabolomic Data analysis","text":"align data set using internal standards. suggested eventually enrich anchor peaks signal ions retention time regions covered internal standards.","code":""},{"path":"https://rformassspectrometry.github.io/metabonaut/articles/a-end-to-end-untargeted-metabolomics.html","id":"additional-informations","dir":"Articles","previous_headings":"","what":"Additional informations","title":"Complete end-to-end LC-MS/MS Metabolomic Data analysis","text":"","code":"#possible extra info: # -"},{"path":"https://rformassspectrometry.github.io/metabonaut/articles/alignment-to-external-dataset.html","id":"introduction","dir":"Articles","previous_headings":"","what":"Introduction","title":"Seamless Alignment: Merging New Data with and Existing Preprocessed Dataset","text":"certain experiments, aligning datasets recorded different times necessary. can involve comparing runs samples different laboratories matching MS2 data initial MS1 run. Variation retention time across laboratories LC systems often requires alignment step using adjustRtime() LamaParama parameter. described data description vignette, samples run twice: LC-MS mode LC-MS/MS mode. tutorial show align LC-MS/MS run preprocessed LC-MS dataset. following packages needed: Setting parallel processing improve efficiency process: First, let’s load pre-processed LC-MS object, steps get object shown End--end worflow vignette. Next, load unprocessed LC-MS/MS data MetaboLights database: adjust sampleData() LC-MS/MS object make easier access: Table 10. Samples LC-MS/MS data set. keep MS runs (MS/MS) remove pooled samples, focusing samples E common runs. alignment, ensure retention time (RT) ranges match datasets: need adjust RT range LC-MS/MS object match LC-MS data: evaluate retention time shifts, ’ll plot base peak chromatogram (BPC): Compare run1 sample run2 sample  Similarly, compare BPC sample E:  Perform peak detection refining alignment, detailed end--end vignette. setting applied. Now, attempt align two samples previous dataset. first step extract landmark features (referred lamas). achieve , identify features present every phenotype group lcms1 dataset. , categorize (using factor()) data phenotype retain QC samples. variable utilized filter features using PercentMissingFilter parameter within filterFeatures() function. , setting threshold = 0 select features present QC samples. lamas input look like alignment. terms method works, alignment algorithm matches chromatographic peaks experimental data lamas, fitting model based match adjust retention times minimize differences two datasets. Now can define param object LamaParama prepare alignment. Parameters tolerance, toleranceRt, ppm relate matching chromatographic peaks lamas. parameters related type fitting generated data points. details parameter overall method can found searching ?adjustRtime. example using default parameters. matchLamaChromPeaks() function facilitates assessment well lamas correspond chromatographic peaks file. extract matched results using matchedRtimes() function. used later evaluate alignment. Now can adjust retention time LC-MS/MS dataset using adjustRtime() function. extract base peak chromatogram (BPC) aligned object: evaluate performance alignment process, generate plots comparing alignment reference dataset (black) LC-MS data (red) (blue) adjustment.   Although overall matching imperfect due initial sample issues, certain regions show significant improvement. alignment signal’s start particularly well done. Specifically, regions right 150 seconds show substantial improvement. visualization distribution chromatographic peaks matched anchor peaks (Lamas) Sample . red vertical lines represent positions matched peaks.  quantitatively assess quality alignment, compute distance chromatographic peaks LC-MS data anchor peaks (Lamas) alignment. library(vioplot)  Furthermore, detailed examination matching model used fitting file possible. Numerical information can obtained using summarizeLamaMatch() function. , percentage chromatographic peaks utilized alignment can computed relative total number peaks file. Additionally, feasible directly plot() param object file interest, showcasing distribution chromatographic peaks along fitted model line.  tutorial demonstrated align LC-MS LC-MS/MS datasets correct retention time shifts, crucial handling data different runs platforms. preprocessed data, detected chromatographic peaks, used landmark features (lamas) QC samples adjust retention times via adjustRtime() function. Visual comparisons base peak chromatograms alignment, along distance calculations, showed clear improvements RT synchronization. Ultimately, aligning chromatographic data ensures subsequent analyses, feature extraction statistical comparisons, based consistent time points, improving data quality reliability. tutorial outlined end--end workflow can adapted various LC-MS-based metabolomics studies, helping researchers manage retention time variation effectively.","code":"library(MsIO) library(MsBackendMetaboLights) library(xcms) library(MsExperiment) library(Spectra) library(vioplot) #' Set up parallel processing using 2 cores if (.Platform$OS.type == \"unix\") {     register(MulticoreParam(2)) } else {     register(SnowParam(2)) } load(\"/shared/data/preprocessed_lcms1.RData\") #' Load form the MetaboLights Database param <- MetaboLightsParam(mtblsId = \"MTBLS8735\",                            assayName = paste0(\"a_MTBLS8735_LC-MSMS_positive_\",                            \"hilic_metabolite_profiling.txt\"),                            filePattern = \".mzML\")  lcms2 <- readMsObject(MsExperiment(),                      param,                      keepOntology = FALSE,                      keepProtocol = FALSE,                      simplify = TRUE) #adjust sampleData colnames(sampleData(lcms2)) <- c(\"sample_name\", \"derived_spectra_data_file\",                                 \"metabolite_asssignment_file\",                                 \"source_name\",                                 \"organism\",                                 \"blood_sample_type\",                                 \"sample_type\", \"age\", \"unit\", \"phenotype\")  #let's look at the updated sample data sampleData(lcms2)[, c(\"derived_spectra_data_file\",                      \"phenotype\", \"sample_name\", \"age\")] |>     kable(format = \"pipe\") # Only keep MS run lcms2 <- lcms2[!grepl(\"MSMS\", sampleData(lcms2)$derived_spectra_data_file),] range(rtime(lcms1)) [1]   9.674428 240.115311 range(rtime(lcms2)) [1]   0.275 480.176 #' Filter the data to the same RT range as the LC-MS run lcms2 <- filterRt(lcms2, range(rtime(lcms1))) idx_A <- which(sampleData(lcms1)$sample_name == \"A\") idx_E <- which(sampleData(lcms1)$sample_name == \"E\") bpc1 <-chromatogram(lcms1[c(idx_A,idx_E)], aggregationFun = \"max\",                     msLevel = 1) Processing chromatographic peaks bpc2 <- chromatogram(lcms2, aggregationFun = \"max\", msLevel = 1) plot(bpc1[1,1], col = \"#00000080\",      main = \"BPC sample A LC-MS vs A LC-MS/MS\", lwd = 1.5, peakType = \"none\") grid() points(rtime(bpc2[1, 1]), intensity(bpc2[1, 1]), col = \"#0000ff80\", type = \"l\") legend(\"topleft\", col = c(\"#00000080\", \"#0000ff80\"),        legend = c(\"LC-MS\", \"LC-MS/MS\"), lty = 1, lwd = 2, horiz = TRUE, bty = \"n\") plot(bpc1[1, 2], col = \"#00000080\",      main = \"BPC sample E LC-MS vs E LC-MS/MS\", lwd = 1.5, peakType = \"none\") grid() points(rtime(bpc2[1, 2]), intensity(bpc2[1, 2]), col = \"#0000ff80\", type = \"l\") legend(\"topleft\", col = c(\"#00000080\", \"#0000ff80\"),        legend = c(\"LC-MS\", \"LC-MS/MS\"), lty = 1, lwd = 2, horiz = TRUE, bty = \"n\") param <- CentWaveParam(peakwidth = c(1, 8), ppm = 15, integrate = 2) lcms2 <- findChromPeaks(lcms2, param = param, chunkSize = 2) param <- MergeNeighboringPeaksParam(expandRt = 2.5, expandMz = 0.0015,                                     minProp = 0.75) lcms2 <- refineChromPeaks(lcms2, param = param, chunkSize = 2) f <- sampleData(lcms1)$phenotype f[f != \"QC\"] <- NA lcms1 <- filterFeatures(lcms1, PercentMissingFilter(threshold = 0, f = f),                         filled = FALSE) 3694 features were removed lcms1_mz_rt <- featureDefinitions(lcms1)[, c(\"mzmed\",\"rtmed\")] head(lcms1_mz_rt) mzmed    rtmed FT0001 50.98979 203.6001 FT0002 51.05904 191.1675 FT0003 51.98657 203.1467 FT0004 53.02036 203.2343 FT0005 53.52080 203.1936 FT0007 54.01010 235.9032 nrow(lcms1_mz_rt) [1] 5374 param <- LamaParama(lamas = lcms1_mz_rt, method = \"loess\", span = 0.5,                     outlierTolerance = 3, zeroWeight = 10, ppm =20,                     tolerance = 0, toleranceRt = 20, bs = \"tp\") param <- matchLamasChromPeaks(lcms2, param = param) ref_vs_obs <- matchedRtimes(param) #' input into `adjustRtime()` lcms2 <- adjustRtime(lcms2, param = param) lcms2 <- applyAdjustedRtime(lcms2) #' evaluate the results with BPC bpc2_adj <- chromatogram(lcms2, aggregationFun = \"max\",                               msLevel = 1) #' BPC of sample A par(mfrow = c(2, 1),  mar = c(2.5, 2.5, 2.5, 0.5), mgp = c(1.5, 0.5, 0)) plot(bpc1[1, 1], col = \"#00000080\", main = \"Before Alignment\", lwd = 1.5,      peakType = \"none\", xlab = NA) grid() points(rtime(bpc2[1,1]), intensity(bpc2[1,1]),        type = \"l\",        col = \"#0000ff80\") legend(\"topleft\", col = c(\"#00000080\", \"#0000ff80\"),        legend = c(\"LC-MS\", \"LC-MS/MS\"), lty = 1, lwd = 2, horiz = TRUE, bty = \"n\")  plot(bpc1[1, 1], col = \"#00000080\", main = \"After Alignment\", lwd = 1.5,      peakType = \"none\", xlab = \"rtime (s)\") grid() points(rtime(bpc2_adj[1,1]), intensity(bpc2_adj[1,1]),        type = \"l\",        col = \"#0000ff80\") #' BPC of sample B par(mfrow = c(2, 1),  mar = c(2.5, 2.5, 2.5, 0.5), mgp = c(1.5, 0.5, 0)) plot(bpc1[1, 2], col = \"#00000080\", main = \"Before Alignment\", lwd = 1.5,      peakType = \"none\", xlab = NA) grid() points(rtime(bpc2[1, 2]), intensity(bpc2[1, 2]), type = \"l\",        col = \"#0000ff80\") legend(\"topleft\", col = c(\"#00000080\", \"#0000ff80\"),        legend = c(\"LC-MS\", \"LC-MS/MS\"), lty = 1, lwd = 2, horiz = TRUE, bty = \"n\")  plot(bpc1[1, 2], col = \"#00000080\", main = \"After Alignment\", lwd = 1.5,      peakType = \"none\", xlab = \"rtime (s)\") grid() points(rtime(bpc2_adj[1, 2]), intensity(bpc2_adj[1, 2]), type = \"l\",        col = \"#0000ff80\") #' BPC of the first sample with matches to lamas overlay par(mfrow = c(1, 1)) plot(bpc1[1, 1], col = \"#00000080\", main = \"Distribution CP matched to Lamas\",      lwd = 1.5,      peakType = \"none\") points(rtime(bpc2_adj[1, 1]), intensity(bpc2_adj[1, 1]), type = \"l\",        col = \"#0000ff80\") grid() abline(v = ref_vs_obs[[1]]$obs, col = \"#c4114510\") # Extract data for sample 3 directly ref_obs_sample_1 <- ref_vs_obs[[\"1\"]]  # Calculate distances before and after alignment dist_before <- abs(ref_obs_sample_1$obs - ref_obs_sample_1$ref) dist_after <- abs(chromPeaks(lcms2)[ref_obs_sample_1$chromPeaksId,                                              \"rt\"] - ref_obs_sample_1$ref)  # Create a data frame for plotting distances <- data.frame(   Distance = c(dist_before, dist_after),   Alignment = rep(c(\"Before\", \"After\"), each = length(dist_before)) )  # Set factor levels for Alignment to ensure correct order distances$Alignment <- factor(distances$Alignment, levels = c(\"Before\", \"After\"))  # Plot distances between anchor peaks between the two runs before and after alignment. vioplot(Distance ~ Alignment, data = distances, xlab = \"\",         rectCol = \"#c4114580\",         lineCol = \"white\",         col=\"#17138fe8\",         border = \"white\",         ylab = \"Distance (s)\",         main = \"Distance to Anchor Peaks: Before vs. After Alignment\") #' Access summary of matches and model information summary <- summarizeLamaMatch(param) summary Total_peaks Matched_peaks Total_lamas Model_summary 1        6832          1825        5374  1666, c(.... 2        6860          1785        5374  1617, c(.... 3        7588          2082        5374  1869, c(.... #' Coverage for each file summary$Matched_peaks / summary$Total_peaks * 100 [1] 26.71253 26.02041 27.43806 #' Access the information on the model of for the first file summary$Model_summary[[1]] Call: loess(formula = ref ~ obs, data = rt_map, weights = weights,     span = span)  Number of Observations: 1666 Equivalent Number of Parameters: 7.38 Residual Standard Error: 2.315 Trace of smoother matrix: 8.13  (exact)  Control settings:   span     :  0.5   degree   :  2   family   :  gaussian   surface  :  interpolate     cell = 0.2   normalize:  TRUE  parametric:  FALSE drop.square:  FALSE #' Plot obs vs. lcms1 with fitting line plot(param, index = 1L, main = \"ChromPeaks versus Lamas for sample A\",      colPoint = \"red\") abline(0, 1, lty = 3, col = \"grey\") grid()"},{"path":"https://rformassspectrometry.github.io/metabonaut/articles/alignment-to-external-dataset.html","id":"load-preprocessed-lc-ms-object","dir":"Articles","previous_headings":"","what":"Load preprocessed LC-MS object","title":"Seamless Alignment: Merging New Data with and Existing Preprocessed Dataset","text":"First, let’s load pre-processed LC-MS object, steps get object shown End--end worflow vignette.","code":"load(\"/shared/data/preprocessed_lcms1.RData\")"},{"path":"https://rformassspectrometry.github.io/metabonaut/articles/alignment-to-external-dataset.html","id":"load-unprocessed-lc-msms-data","dir":"Articles","previous_headings":"","what":"Load unprocessed LC-MS/MS data","title":"Seamless Alignment: Merging New Data with and Existing Preprocessed Dataset","text":"Next, load unprocessed LC-MS/MS data MetaboLights database: adjust sampleData() LC-MS/MS object make easier access: Table 10. Samples LC-MS/MS data set. keep MS runs (MS/MS) remove pooled samples, focusing samples E common runs. alignment, ensure retention time (RT) ranges match datasets: need adjust RT range LC-MS/MS object match LC-MS data:","code":"#' Load form the MetaboLights Database param <- MetaboLightsParam(mtblsId = \"MTBLS8735\",                            assayName = paste0(\"a_MTBLS8735_LC-MSMS_positive_\",                            \"hilic_metabolite_profiling.txt\"),                            filePattern = \".mzML\")  lcms2 <- readMsObject(MsExperiment(),                      param,                      keepOntology = FALSE,                      keepProtocol = FALSE,                      simplify = TRUE) #adjust sampleData colnames(sampleData(lcms2)) <- c(\"sample_name\", \"derived_spectra_data_file\",                                 \"metabolite_asssignment_file\",                                 \"source_name\",                                 \"organism\",                                 \"blood_sample_type\",                                 \"sample_type\", \"age\", \"unit\", \"phenotype\")  #let's look at the updated sample data sampleData(lcms2)[, c(\"derived_spectra_data_file\",                      \"phenotype\", \"sample_name\", \"age\")] |>     kable(format = \"pipe\") # Only keep MS run lcms2 <- lcms2[!grepl(\"MSMS\", sampleData(lcms2)$derived_spectra_data_file),] range(rtime(lcms1)) [1]   9.674428 240.115311 range(rtime(lcms2)) [1]   0.275 480.176 #' Filter the data to the same RT range as the LC-MS run lcms2 <- filterRt(lcms2, range(rtime(lcms1)))"},{"path":"https://rformassspectrometry.github.io/metabonaut/articles/alignment-to-external-dataset.html","id":"comparing-chromatograms","dir":"Articles","previous_headings":"","what":"Comparing chromatograms","title":"Seamless Alignment: Merging New Data with and Existing Preprocessed Dataset","text":"evaluate retention time shifts, ’ll plot base peak chromatogram (BPC): Compare run1 sample run2 sample  Similarly, compare BPC sample E:","code":"idx_A <- which(sampleData(lcms1)$sample_name == \"A\") idx_E <- which(sampleData(lcms1)$sample_name == \"E\") bpc1 <-chromatogram(lcms1[c(idx_A,idx_E)], aggregationFun = \"max\",                     msLevel = 1) Processing chromatographic peaks bpc2 <- chromatogram(lcms2, aggregationFun = \"max\", msLevel = 1) plot(bpc1[1,1], col = \"#00000080\",      main = \"BPC sample A LC-MS vs A LC-MS/MS\", lwd = 1.5, peakType = \"none\") grid() points(rtime(bpc2[1, 1]), intensity(bpc2[1, 1]), col = \"#0000ff80\", type = \"l\") legend(\"topleft\", col = c(\"#00000080\", \"#0000ff80\"),        legend = c(\"LC-MS\", \"LC-MS/MS\"), lty = 1, lwd = 2, horiz = TRUE, bty = \"n\") plot(bpc1[1, 2], col = \"#00000080\",      main = \"BPC sample E LC-MS vs E LC-MS/MS\", lwd = 1.5, peakType = \"none\") grid() points(rtime(bpc2[1, 2]), intensity(bpc2[1, 2]), col = \"#0000ff80\", type = \"l\") legend(\"topleft\", col = c(\"#00000080\", \"#0000ff80\"),        legend = c(\"LC-MS\", \"LC-MS/MS\"), lty = 1, lwd = 2, horiz = TRUE, bty = \"n\")"},{"path":"https://rformassspectrometry.github.io/metabonaut/articles/alignment-to-external-dataset.html","id":"peak-detection","dir":"Articles","previous_headings":"","what":"Peak detection","title":"Seamless Alignment: Merging New Data with and Existing Preprocessed Dataset","text":"Perform peak detection refining alignment, detailed end--end vignette. setting applied.","code":"param <- CentWaveParam(peakwidth = c(1, 8), ppm = 15, integrate = 2) lcms2 <- findChromPeaks(lcms2, param = param, chunkSize = 2) param <- MergeNeighboringPeaksParam(expandRt = 2.5, expandMz = 0.0015,                                     minProp = 0.75) lcms2 <- refineChromPeaks(lcms2, param = param, chunkSize = 2)"},{"path":"https://rformassspectrometry.github.io/metabonaut/articles/alignment-to-external-dataset.html","id":"alignment","dir":"Articles","previous_headings":"","what":"Alignment","title":"Seamless Alignment: Merging New Data with and Existing Preprocessed Dataset","text":"Now, attempt align two samples previous dataset. first step extract landmark features (referred lamas). achieve , identify features present every phenotype group lcms1 dataset. , categorize (using factor()) data phenotype retain QC samples. variable utilized filter features using PercentMissingFilter parameter within filterFeatures() function. , setting threshold = 0 select features present QC samples. lamas input look like alignment. terms method works, alignment algorithm matches chromatographic peaks experimental data lamas, fitting model based match adjust retention times minimize differences two datasets. Now can define param object LamaParama prepare alignment. Parameters tolerance, toleranceRt, ppm relate matching chromatographic peaks lamas. parameters related type fitting generated data points. details parameter overall method can found searching ?adjustRtime. example using default parameters. matchLamaChromPeaks() function facilitates assessment well lamas correspond chromatographic peaks file. extract matched results using matchedRtimes() function. used later evaluate alignment. Now can adjust retention time LC-MS/MS dataset using adjustRtime() function.","code":"f <- sampleData(lcms1)$phenotype f[f != \"QC\"] <- NA lcms1 <- filterFeatures(lcms1, PercentMissingFilter(threshold = 0, f = f),                         filled = FALSE) 3694 features were removed lcms1_mz_rt <- featureDefinitions(lcms1)[, c(\"mzmed\",\"rtmed\")] head(lcms1_mz_rt) mzmed    rtmed FT0001 50.98979 203.6001 FT0002 51.05904 191.1675 FT0003 51.98657 203.1467 FT0004 53.02036 203.2343 FT0005 53.52080 203.1936 FT0007 54.01010 235.9032 nrow(lcms1_mz_rt) [1] 5374 param <- LamaParama(lamas = lcms1_mz_rt, method = \"loess\", span = 0.5,                     outlierTolerance = 3, zeroWeight = 10, ppm =20,                     tolerance = 0, toleranceRt = 20, bs = \"tp\") param <- matchLamasChromPeaks(lcms2, param = param) ref_vs_obs <- matchedRtimes(param) #' input into `adjustRtime()` lcms2 <- adjustRtime(lcms2, param = param) lcms2 <- applyAdjustedRtime(lcms2)"},{"path":"https://rformassspectrometry.github.io/metabonaut/articles/alignment-to-external-dataset.html","id":"evaluation","dir":"Articles","previous_headings":"","what":"Evaluation","title":"Seamless Alignment: Merging New Data with and Existing Preprocessed Dataset","text":"extract base peak chromatogram (BPC) aligned object: evaluate performance alignment process, generate plots comparing alignment reference dataset (black) LC-MS data (red) (blue) adjustment.   Although overall matching imperfect due initial sample issues, certain regions show significant improvement. alignment signal’s start particularly well done. Specifically, regions right 150 seconds show substantial improvement. visualization distribution chromatographic peaks matched anchor peaks (Lamas) Sample . red vertical lines represent positions matched peaks.  quantitatively assess quality alignment, compute distance chromatographic peaks LC-MS data anchor peaks (Lamas) alignment. library(vioplot)  Furthermore, detailed examination matching model used fitting file possible. Numerical information can obtained using summarizeLamaMatch() function. , percentage chromatographic peaks utilized alignment can computed relative total number peaks file. Additionally, feasible directly plot() param object file interest, showcasing distribution chromatographic peaks along fitted model line.","code":"#' evaluate the results with BPC bpc2_adj <- chromatogram(lcms2, aggregationFun = \"max\",                               msLevel = 1) #' BPC of sample A par(mfrow = c(2, 1),  mar = c(2.5, 2.5, 2.5, 0.5), mgp = c(1.5, 0.5, 0)) plot(bpc1[1, 1], col = \"#00000080\", main = \"Before Alignment\", lwd = 1.5,      peakType = \"none\", xlab = NA) grid() points(rtime(bpc2[1,1]), intensity(bpc2[1,1]),        type = \"l\",        col = \"#0000ff80\") legend(\"topleft\", col = c(\"#00000080\", \"#0000ff80\"),        legend = c(\"LC-MS\", \"LC-MS/MS\"), lty = 1, lwd = 2, horiz = TRUE, bty = \"n\")  plot(bpc1[1, 1], col = \"#00000080\", main = \"After Alignment\", lwd = 1.5,      peakType = \"none\", xlab = \"rtime (s)\") grid() points(rtime(bpc2_adj[1,1]), intensity(bpc2_adj[1,1]),        type = \"l\",        col = \"#0000ff80\") #' BPC of sample B par(mfrow = c(2, 1),  mar = c(2.5, 2.5, 2.5, 0.5), mgp = c(1.5, 0.5, 0)) plot(bpc1[1, 2], col = \"#00000080\", main = \"Before Alignment\", lwd = 1.5,      peakType = \"none\", xlab = NA) grid() points(rtime(bpc2[1, 2]), intensity(bpc2[1, 2]), type = \"l\",        col = \"#0000ff80\") legend(\"topleft\", col = c(\"#00000080\", \"#0000ff80\"),        legend = c(\"LC-MS\", \"LC-MS/MS\"), lty = 1, lwd = 2, horiz = TRUE, bty = \"n\")  plot(bpc1[1, 2], col = \"#00000080\", main = \"After Alignment\", lwd = 1.5,      peakType = \"none\", xlab = \"rtime (s)\") grid() points(rtime(bpc2_adj[1, 2]), intensity(bpc2_adj[1, 2]), type = \"l\",        col = \"#0000ff80\") #' BPC of the first sample with matches to lamas overlay par(mfrow = c(1, 1)) plot(bpc1[1, 1], col = \"#00000080\", main = \"Distribution CP matched to Lamas\",      lwd = 1.5,      peakType = \"none\") points(rtime(bpc2_adj[1, 1]), intensity(bpc2_adj[1, 1]), type = \"l\",        col = \"#0000ff80\") grid() abline(v = ref_vs_obs[[1]]$obs, col = \"#c4114510\") # Extract data for sample 3 directly ref_obs_sample_1 <- ref_vs_obs[[\"1\"]]  # Calculate distances before and after alignment dist_before <- abs(ref_obs_sample_1$obs - ref_obs_sample_1$ref) dist_after <- abs(chromPeaks(lcms2)[ref_obs_sample_1$chromPeaksId,                                              \"rt\"] - ref_obs_sample_1$ref)  # Create a data frame for plotting distances <- data.frame(   Distance = c(dist_before, dist_after),   Alignment = rep(c(\"Before\", \"After\"), each = length(dist_before)) )  # Set factor levels for Alignment to ensure correct order distances$Alignment <- factor(distances$Alignment, levels = c(\"Before\", \"After\"))  # Plot distances between anchor peaks between the two runs before and after alignment. vioplot(Distance ~ Alignment, data = distances, xlab = \"\",         rectCol = \"#c4114580\",         lineCol = \"white\",         col=\"#17138fe8\",         border = \"white\",         ylab = \"Distance (s)\",         main = \"Distance to Anchor Peaks: Before vs. After Alignment\") #' Access summary of matches and model information summary <- summarizeLamaMatch(param) summary Total_peaks Matched_peaks Total_lamas Model_summary 1        6832          1825        5374  1666, c(.... 2        6860          1785        5374  1617, c(.... 3        7588          2082        5374  1869, c(.... #' Coverage for each file summary$Matched_peaks / summary$Total_peaks * 100 [1] 26.71253 26.02041 27.43806 #' Access the information on the model of for the first file summary$Model_summary[[1]] Call: loess(formula = ref ~ obs, data = rt_map, weights = weights,     span = span)  Number of Observations: 1666 Equivalent Number of Parameters: 7.38 Residual Standard Error: 2.315 Trace of smoother matrix: 8.13  (exact)  Control settings:   span     :  0.5   degree   :  2   family   :  gaussian   surface  :  interpolate     cell = 0.2   normalize:  TRUE  parametric:  FALSE drop.square:  FALSE #' Plot obs vs. lcms1 with fitting line plot(param, index = 1L, main = \"ChromPeaks versus Lamas for sample A\",      colPoint = \"red\") abline(0, 1, lty = 3, col = \"grey\") grid()"},{"path":"https://rformassspectrometry.github.io/metabonaut/articles/alignment-to-external-dataset.html","id":"visualizing-alignment-quality","dir":"Articles","previous_headings":"Introduction","what":"Visualizing Alignment Quality","title":"Seamless Alignment: Merging New Data with and Existing Preprocessed Dataset","text":"evaluate performance alignment process, generate plots comparing alignment reference dataset (black) LC-MS data (red) (blue) adjustment.   Although overall matching imperfect due initial sample issues, certain regions show significant improvement. alignment signal’s start particularly well done. Specifically, regions right 150 seconds show substantial improvement. visualization distribution chromatographic peaks matched anchor peaks (Lamas) Sample . red vertical lines represent positions matched peaks.","code":"#' BPC of sample A par(mfrow = c(2, 1),  mar = c(2.5, 2.5, 2.5, 0.5), mgp = c(1.5, 0.5, 0)) plot(bpc1[1, 1], col = \"#00000080\", main = \"Before Alignment\", lwd = 1.5,      peakType = \"none\", xlab = NA) grid() points(rtime(bpc2[1,1]), intensity(bpc2[1,1]),        type = \"l\",        col = \"#0000ff80\") legend(\"topleft\", col = c(\"#00000080\", \"#0000ff80\"),        legend = c(\"LC-MS\", \"LC-MS/MS\"), lty = 1, lwd = 2, horiz = TRUE, bty = \"n\")  plot(bpc1[1, 1], col = \"#00000080\", main = \"After Alignment\", lwd = 1.5,      peakType = \"none\", xlab = \"rtime (s)\") grid() points(rtime(bpc2_adj[1,1]), intensity(bpc2_adj[1,1]),        type = \"l\",        col = \"#0000ff80\") #' BPC of sample B par(mfrow = c(2, 1),  mar = c(2.5, 2.5, 2.5, 0.5), mgp = c(1.5, 0.5, 0)) plot(bpc1[1, 2], col = \"#00000080\", main = \"Before Alignment\", lwd = 1.5,      peakType = \"none\", xlab = NA) grid() points(rtime(bpc2[1, 2]), intensity(bpc2[1, 2]), type = \"l\",        col = \"#0000ff80\") legend(\"topleft\", col = c(\"#00000080\", \"#0000ff80\"),        legend = c(\"LC-MS\", \"LC-MS/MS\"), lty = 1, lwd = 2, horiz = TRUE, bty = \"n\")  plot(bpc1[1, 2], col = \"#00000080\", main = \"After Alignment\", lwd = 1.5,      peakType = \"none\", xlab = \"rtime (s)\") grid() points(rtime(bpc2_adj[1, 2]), intensity(bpc2_adj[1, 2]), type = \"l\",        col = \"#0000ff80\") #' BPC of the first sample with matches to lamas overlay par(mfrow = c(1, 1)) plot(bpc1[1, 1], col = \"#00000080\", main = \"Distribution CP matched to Lamas\",      lwd = 1.5,      peakType = \"none\") points(rtime(bpc2_adj[1, 1]), intensity(bpc2_adj[1, 1]), type = \"l\",        col = \"#0000ff80\") grid() abline(v = ref_vs_obs[[1]]$obs, col = \"#c4114510\")"},{"path":"https://rformassspectrometry.github.io/metabonaut/articles/alignment-to-external-dataset.html","id":"quantitative-evaluation-of-alignment","dir":"Articles","previous_headings":"Introduction","what":"Quantitative Evaluation of Alignment","title":"Seamless Alignment: Merging New Data with and Existing Preprocessed Dataset","text":"quantitatively assess quality alignment, compute distance chromatographic peaks LC-MS data anchor peaks (Lamas) alignment. library(vioplot)  Furthermore, detailed examination matching model used fitting file possible. Numerical information can obtained using summarizeLamaMatch() function. , percentage chromatographic peaks utilized alignment can computed relative total number peaks file. Additionally, feasible directly plot() param object file interest, showcasing distribution chromatographic peaks along fitted model line.","code":"# Extract data for sample 3 directly ref_obs_sample_1 <- ref_vs_obs[[\"1\"]]  # Calculate distances before and after alignment dist_before <- abs(ref_obs_sample_1$obs - ref_obs_sample_1$ref) dist_after <- abs(chromPeaks(lcms2)[ref_obs_sample_1$chromPeaksId,                                              \"rt\"] - ref_obs_sample_1$ref)  # Create a data frame for plotting distances <- data.frame(   Distance = c(dist_before, dist_after),   Alignment = rep(c(\"Before\", \"After\"), each = length(dist_before)) )  # Set factor levels for Alignment to ensure correct order distances$Alignment <- factor(distances$Alignment, levels = c(\"Before\", \"After\"))  # Plot distances between anchor peaks between the two runs before and after alignment. vioplot(Distance ~ Alignment, data = distances, xlab = \"\",         rectCol = \"#c4114580\",         lineCol = \"white\",         col=\"#17138fe8\",         border = \"white\",         ylab = \"Distance (s)\",         main = \"Distance to Anchor Peaks: Before vs. After Alignment\") #' Access summary of matches and model information summary <- summarizeLamaMatch(param) summary Total_peaks Matched_peaks Total_lamas Model_summary 1        6832          1825        5374  1666, c(.... 2        6860          1785        5374  1617, c(.... 3        7588          2082        5374  1869, c(.... #' Coverage for each file summary$Matched_peaks / summary$Total_peaks * 100 [1] 26.71253 26.02041 27.43806 #' Access the information on the model of for the first file summary$Model_summary[[1]] Call: loess(formula = ref ~ obs, data = rt_map, weights = weights,     span = span)  Number of Observations: 1666 Equivalent Number of Parameters: 7.38 Residual Standard Error: 2.315 Trace of smoother matrix: 8.13  (exact)  Control settings:   span     :  0.5   degree   :  2   family   :  gaussian   surface  :  interpolate     cell = 0.2   normalize:  TRUE  parametric:  FALSE drop.square:  FALSE #' Plot obs vs. lcms1 with fitting line plot(param, index = 1L, main = \"ChromPeaks versus Lamas for sample A\",      colPoint = \"red\") abline(0, 1, lty = 3, col = \"grey\") grid()"},{"path":"https://rformassspectrometry.github.io/metabonaut/articles/alignment-to-external-dataset.html","id":"conclusion","dir":"Articles","previous_headings":"","what":"Conclusion","title":"Seamless Alignment: Merging New Data with and Existing Preprocessed Dataset","text":"tutorial demonstrated align LC-MS LC-MS/MS datasets correct retention time shifts, crucial handling data different runs platforms. preprocessed data, detected chromatographic peaks, used landmark features (lamas) QC samples adjust retention times via adjustRtime() function. Visual comparisons base peak chromatograms alignment, along distance calculations, showed clear improvements RT synchronization. Ultimately, aligning chromatographic data ensures subsequent analyses, feature extraction statistical comparisons, based consistent time points, improving data quality reliability. tutorial outlined end--end workflow can adapted various LC-MS-based metabolomics studies, helping researchers manage retention time variation effectively.","code":""},{"path":[]},{"path":"https://rformassspectrometry.github.io/metabonaut/articles/dataset-investigation.html","id":"introduction","dir":"Articles","previous_headings":"","what":"Introduction","title":"Dataset investigation: What to do when you get your data","text":", (amazing lab mate) finally finished data acquisition, now dataset hand. ’s next? Unfortunately, work isn’t yet. diving analysis, ’s crucial understand dataset . first step data analysis workflow, ensuring data good quality well-prepared preprocessing downstream analysis plan perform. vignette, present dataset used throughout different vignettes website. ’s far perfect dataset, actually mirrors reality datasets ’ll encounter research. issues indeed specific described dataset. However, purpose vignette encourage think critically data guide steps can help avoid spending hours analysis, realize later samples features removed flagged earlier .","code":""},{"path":"https://rformassspectrometry.github.io/metabonaut/articles/dataset-investigation.html","id":"dataset-description","dir":"Articles","previous_headings":"","what":"Dataset Description","title":"Dataset investigation: What to do when you get your data","text":"workflow, two datasets used: LC-MS-based (MS1 level ) untargeted metabolomics dataset quantify small polar metabolites human plasma samples. additional LC-MS/MS dataset selected samples former study identification annotation significant features. samples randomly selected larger study aimed identifying metabolites varying abundances individuals suffering cardiovascular disease (CVD) healthy controls (CTR). subset analyzed includes data three CVD patients, three CTR individuals, four quality control (QC) samples. QC samples, representing pooled serum sample large cohort, measured repeatedly throughout experiment monitor signal stability. data metadata workflow available MetaboLights database ID: MTBLS8735. detailed materials methods used sample analysis also available MetaboLights entry. particularly important understanding analysis parameters used. noted samples analyzed using ultra-high-performance liquid chromatography (UHPLC) coupled Q-TOF mass spectrometer (TripleTOF 5600+), chromatographic separation achieved using hydrophilic interaction liquid chromatography (HILIC). Consider moving visualizations end--end vignette clearer understanding dataset. Provide -depth visualizations explore understand dataset quality. Compare pool lc-ms pool lc-ms/ms show better separation second run.","code":""},{"path":"https://rformassspectrometry.github.io/metabonaut/articles/install_v0.html","id":"running-workflows-locally","dir":"Articles","previous_headings":"","what":"Running workflows locally","title":"Install","text":"install computer packages necessary workflows run code follow: BiocManager::install(“rformassspectrometry/metabonaut”, dependencies = TRUE, ask = FALSE, update = TRUE)","code":"install.packages(\"BiocManager\")  ## Packa BiocManager::install(c('RforMassSpectrometry/MsIO', 'RforMassSpectrometry/MsBackendMetaboLights'), ask = FALSE, dependencies = TRUE)  BiocManager::install(\"rformassspectrometry/metabonaut\",                      dependencies = TRUE, ask = FALSE, update = TRUE)"},{"path":"https://rformassspectrometry.github.io/metabonaut/articles/install_v0.html","id":"docker-image","dir":"Articles","previous_headings":"","what":"Docker image","title":"Install","text":"vignettes files along R runtime environment including required packages RStudio (Posit) editor bundled docker container. installation, docker container can run computer code examples vignettes can evaluated within environment (without need install additional packages files). don’t already , install docker. Find installation information . Get docker image tutorial e.g. command line : Start docker container, either Docker Desktop, command line Enter http://localhost:8787 web browser log username rstudio password bioc. RStudio server version: open Quarto files vignettes folder evaluate R code blocks document.","code":"docker pull rformassspectrometry/metabonaut:latest docker run -e PASSWORD=bioc -p 8787:8787 rformassspectrometry/metabonaut:latest"},{"path":"https://rformassspectrometry.github.io/metabonaut/authors.html","id":null,"dir":"","previous_headings":"","what":"Authors","title":"Authors and Citation","text":"Philippine Louail. Author, maintainer.           ORCID: 0009-0007-5429-6846 Anna Tagliaferri. Contributor.           ORCID: 0009-0001-4044-4285 Vinicius Verri Hernandes. Contributor.           ORCID: 0000-0002-3057-6460 Daniel Marques de Sá e Silva. Contributor.           ORCID: 0000-0002-9674-042X Johannes Rainer. Author.           ORCID: 0000-0002-6977-7147","code":""},{"path":"https://rformassspectrometry.github.io/metabonaut/authors.html","id":"citation","dir":"","previous_headings":"","what":"Citation","title":"Authors and Citation","text":"Philippine Louail, & Johannes Rainer. (2024). Streamlining LC-MS/MS Data Analysis R Open-Source xcms RforMassSpectrometry: End--End Workflow (Version v1).Zenodo. https://doi.org/10.5281/zenodo.11370612","code":"@Manual{,   title = {Streamlining LC-MS/MS Data Analysis in R with Open-Source xcms and RforMassSpectrometry: An End-to-End Workflow},   author = {Philippine Louail and Johannes Rainer},   publisher = {Zenodo},   year = {2024},   month = {may},   version = {v1.1.0},   doi = {10.5281/zenodo.11370612},   url = {https://doi.org/10.5281/zenodo.11370612}, }"},{"path":"https://rformassspectrometry.github.io/metabonaut/index.html","id":"lets-explore-and-learn-to-analyze-untargeted-metabolomics-data","dir":"","previous_headings":"","what":"Let’s explore and learn to analyze untargeted metabolomics data","title":"Exploring and Analyzing LC-MS Data","text":"Welcome Metabonaut! 🧑‍🚀 initiative presents series workflows based small LC-MS/MS dataset, utilizing R Bioconductor packages. Throughout workflows, demonstrate adapt various algorithms specific datasets seamlessly integrate R packages ensure efficient, reproducible processing. primary workflow “Complete End--End LC-MS/MS Metabolomic Data Analysis”. full R code examples, along detailed descriptions, available end--end-untargeted-metabolomics.qmd file. file can opened RStudio, allowing execute individual R command. vignettes website interlinked, can find detailed description dataset used throughout . strive reproducibility. workflows designed remain stable time, allowing run vignettes together one comprehensive “super-vignette”. major change document smaller updates check News","code":""},{"path":"https://rformassspectrometry.github.io/metabonaut/index.html","id":"for-r-beginners","dir":"","previous_headings":"","what":"For R beginners","title":"Exploring and Analyzing LC-MS Data","text":"tutorials provided assume users basic knowledge R RMarkdown. ’re unfamiliar either, recommend completing short tutorial help test code adapt data. vignettes written Quarto format, learn go , farily new format, functionallity shared RMarkdown format, therefore learning can usefull . basic R course documentation, recommand check website try interactive course fun introduction basic R programming. cheatsheet also help.","code":""},{"path":"https://rformassspectrometry.github.io/metabonaut/index.html","id":"known-issues","dir":"","previous_headings":"","what":"Known Issues","title":"Exploring and Analyzing LC-MS Data","text":"just beginning Metabonaut journey, website still refined. ’re actively addressing ongoing issues. ’re aware problem, ’ll list . Currently, known issues code. encounter , please ensure latest versions required packages (detailed ). issue persists, please report reproducible example GitHub . encounter issues, don’t hesitate let us know!","code":""},{"path":"https://rformassspectrometry.github.io/metabonaut/index.html","id":"contribution","dir":"","previous_headings":"","what":"Contribution","title":"Exploring and Analyzing LC-MS Data","text":"contributions, please see RforMassSpectrometry contributions guideline.","code":""},{"path":"https://rformassspectrometry.github.io/metabonaut/index.html","id":"code-of-conduct","dir":"","previous_headings":"","what":"Code of Conduct","title":"Exploring and Analyzing LC-MS Data","text":"Please review RforMassSpectrometry Code Conduct.","code":""},{"path":[]},{"path":"https://rformassspectrometry.github.io/metabonaut/news/index.html","id":"changes-in-0-0-2","dir":"Changelog","previous_headings":"","what":"Changes in 0.0.2","title":"metabonaut 0.0.2","text":"Switch Quarto instead Rmarkdown Addition Alignment reference dataset vignette Addition Data investigation vignette Addition Install vignette","code":""},{"path":"https://rformassspectrometry.github.io/metabonaut/news/index.html","id":"changes-in-0-0-2-1","dir":"Changelog","previous_headings":"","what":"Changes in 0.0.1","title":"metabonaut 0.0.2","text":"Addition basic files workflow package. Addition end--end vignette.","code":""}]
+[{"path":"https://rformassspectrometry.github.io/metabonaut/articles/a-end-to-end-untargeted-metabolomics.html","id":"introduction","dir":"Articles","previous_headings":"","what":"Introduction","title":"Complete end-to-end LC-MS/MS Metabolomic Data analysis","text":"present workflow describes steps analysis LC-MS/MS experiment, includes preprocessing raw data generate abundance matrix features various samples, followed data normalization, differential abundance analysis finally annotation features metabolites. Note also alternative analysis options R packages used different steps examples mentioned throughout workflow.  Steps end--end workflow possible alternatives","code":""},{"path":"https://rformassspectrometry.github.io/metabonaut/articles/a-end-to-end-untargeted-metabolomics.html","id":"data-description","dir":"Articles","previous_headings":"","what":"Data description","title":"Complete end-to-end LC-MS/MS Metabolomic Data analysis","text":"See data description vignette detailed explanation dataset go workflow general tips done first get data.","code":""},{"path":"https://rformassspectrometry.github.io/metabonaut/articles/a-end-to-end-untargeted-metabolomics.html","id":"packages-needed","dir":"Articles","previous_headings":"","what":"Packages needed","title":"Complete end-to-end LC-MS/MS Metabolomic Data analysis","text":"workflow therefore based following dependencies:","code":"## Data Import and handling library(readxl) library(MsExperiment) library(MsIO) library(MsBackendMetaboLights) library(SummarizedExperiment)  ## Preprocessing of LC-MS data library(xcms) library(Spectra) library(MetaboCoreUtils)  ## Statistical analysis library(limma) # Differential abundance library(matrixStats) # Summaries over matrices  ## Visualisation library(pander) library(RColorBrewer) library(pheatmap) library(vioplot) library(ggfortify)   # Plot PCA library(gridExtra)   # To arrange multiple ggplots into single plots  ## Annotation library(AnnotationHub) # Annotation resources library(CompoundDb)    # Access small compound annotation data. library(MetaboAnnotation) # Functionality for metabolite annotation."},{"path":"https://rformassspectrometry.github.io/metabonaut/articles/a-end-to-end-untargeted-metabolomics.html","id":"data-import","dir":"Articles","previous_headings":"","what":"Data import","title":"Complete end-to-end LC-MS/MS Metabolomic Data analysis","text":"Note different equipment generate various file extensions, conversion step might needed beforehand, though apply dataset. Spectra package supports variety ways store retrieve MS data, including mzML, mzXML, CDF files, simple flat files, database systems. necessary, several tools, ProteoWizard’s MSConvert, can used convert files .mzML format [@chambers_cross-platform_2012]. show extract dataset MetaboLigths database load MsExperiment object. information load data MetaboLights database, refer vignette. type data loading, check xcms vignette specific vignette created data import soon. next configure parallel processing setup. functions xcms package allow per-sample parallel processing, can improve performance analysis, especially large data sets. xcms packages RforMassSpectrometry package ecosystem use parallel processing setup configured BiocParallel Bioconductor package. code use fork-based parallel processing unix system, socket-based parallel processing Windows operating system.","code":"param <- MetaboLightsParam(mtblsId = \"MTBLS8735\",                            assayName = paste0(\"a_MTBLS8735_LC-MS_positive_\",                                               \"hilic_metabolite_profiling.txt\"),                            filePattern = \".mzML\")  lcms1 <- readMsObject(MsExperiment(),                       param,                       keepOntology = FALSE,                       keepProtocol = FALSE,                       simplify = TRUE) #' Set up parallel processing using 2 cores if (.Platform$OS.type == \"unix\") {     register(MulticoreParam(2)) } else {     register(SnowParam(2)) }"},{"path":"https://rformassspectrometry.github.io/metabonaut/articles/a-end-to-end-untargeted-metabolomics.html","id":"data-organisation","dir":"Articles","previous_headings":"","what":"Data organisation","title":"Complete end-to-end LC-MS/MS Metabolomic Data analysis","text":"experimental data now represented MsExperiment object MsExperiment package. MsExperiment object container metadata spectral data provides manages also linkage samples spectra. provide brief overview data structure content. sampleData() function extracts sample information object. next extract data use pander package render show information Table 1 . Throughout document use R pipe operator (|>) avoid nested function calls hence improve code readability. sampleData() output MetaboLights always ideal direct easy access data. therefore rename transform user-friendly way. user can add, transform remove column want using base R functionalities. Table 1. Samples data set. Table 2. Simplified sample data. 11 samples data set. abbreviations essential proper interpretation metadata information: injection_index: index representing order (position) individual sample measured (injected) within LC-MS measurement run experiment. \"QC\": Quality control sample (pool serum samples external, large cohort). \"CVD\": Sample individual cardiovascular disease. \"CTR\": Sample presumably healthy control. sample_name: arbitrary name/identifier sample. age: (rounded) age individuals. define colors sample groups based sample group using RColorBrewer package: MS data experiment stored Spectra object (Spectra Bioconductor package) within MsExperiment object can accessed using spectra() function. element object spectrum - organised linearly combined Spectra object one (ordered retention time samples). access dataset’s Spectra object summarize available information provide, among things, total number spectra data set. can also summarize number spectra respective MS level (extracted msLevel() function). fromFile() function returns spectrum index sample (data file) can thus used split information (MS level case) sample summarize using base R table() function combine result matrix. Note number spectra acquired run, number spectral features sample. present data set thus contains MS1 data, ideal quantification signal. second (LC-MS/MS) data set also fragment (MS2) spectra samples used later workflow. Note users restrict data evaluation examples shown tutorials. Spectra package enables user-friendly access full MS data functionality extensively used explore, visualize summarize data. another example, determine retention time range entire data set. Data obtained LC-MS experiments typically analyzed along retention time axis, MS data organized spectrum, orthogonal retention time axis.","code":"lcms1 Object of class MsExperiment  Spectra: MS1 (17210)  Experiment data: 10 sample(s)  Sample data links:   - spectra: 10 sample(s) to 17210 element(s). sampleData(lcms1)[, c(\"Derived_Spectral_Data_File\",                       \"Characteristics[Sample type]\",                       \"Factor Value[Phenotype]\",                       \"Sample Name\",                       \"Factor Value[Age]\")] |>     kable(format = \"pipe\") # Let's rename the column for easier access colnames(sampleData(lcms1)) <- c(\"sample_name\", \"derived_spectra_data_file\",                                 \"metabolite_asssignment_file\",                                 \"source_name\",                                 \"organism\",                                 \"blood_sample_type\",                                 \"sample_type\", \"age\", \"unit\", \"phenotype\")  # Add \"QC\" to the phenotype of the QC samples sampleData(lcms1)$phenotype[sampleData(lcms1)$sample_name == \"POOL\"] <- \"QC\" sampleData(lcms1)$sample_name[sampleData(lcms1)$sample_name == \"POOL\" ] <- c(\"POOL1\", \"POOL2\", \"POOL3\", \"POOL4\")  #  Add injection index column sampleData(lcms1)$injection_index <- seq_len(nrow(sampleData(lcms1)))  #let's look at the updated sample data sampleData(lcms1)[, c(\"derived_spectra_data_file\",                      \"phenotype\", \"sample_name\", \"age\",                      \"injection_index\")] |>     kable(format = \"pipe\") #' Access Spectra Object spectra(lcms1) MSn data (Spectra) with 17210 spectra in a MsBackendMetaboLights backend:         msLevel     rtime scanIndex          1             1     0.274         1 2             1     0.553         2 3             1     0.832         3 4             1     1.111         4 5             1     1.390         5 ...         ...       ...       ... 17206         1   479.052      1717 17207         1   479.331      1718 17208         1   479.610      1719 17209         1   479.889      1720 17210         1   480.168      1721  ... 36 more variables/columns.  file(s): MS_QC_POOL_1_POS.mzML MS_A_POS.mzML MS_B_POS.mzML  ... 7 more files #' Count the number of spectra with a specific MS level per file. spectra(lcms1) |>     msLevel() |>     split(fromFile(lcms1)) |>     lapply(table) |>     do.call(what = cbind) 1    2    3    4    5    6    7    8    9   10 1 1721 1721 1721 1721 1721 1721 1721 1721 1721 1721 #' Retention time range for entire dataset spectra(lcms1) |>     rtime() |>     range() [1]   0.273 480.169"},{"path":"https://rformassspectrometry.github.io/metabonaut/articles/a-end-to-end-untargeted-metabolomics.html","id":"data-visualization-and-general-quality-assessment","dir":"Articles","previous_headings":"","what":"Data visualization and general quality assessment","title":"Complete end-to-end LC-MS/MS Metabolomic Data analysis","text":"Effective visualization paramount inspecting assessing quality MS data. general overview LC-MS data, can: Combine mass peaks (MS1) spectra sample single spectrum mass peak represents maximum signal mass peaks similar m/z. spectrum might called Base Peak Spectrum (BPS), providing information abundant ions sample. Aggregate mass peak intensities spectrum, resulting Base Peak Chromatogram (BPC). BPC shows highest measured intensity distinct retention time (hence spectrum) thus orthogonal BPS. Sum mass peak intensities spectrum create Total Ion Chromatogram (TIC). Compare BPS samples experiment evaluate similarity ion content. Compare BPC samples experiment identify samples similar dissimilar chromatographic signal. addition general data evaluation visualization, also crucial investigate specific signal e.g. internal standards compounds/ions known present samples. providing reliable reference, internal standards help achieve consistent accurate analytical results. BPS collapses data retention time dimension reveals prevalent ions present samples, creation BPS however straightforward. Mass peaks, even representing signals ion, never identical m/z values consecutive spectra due measurement error/resolution instrument. use combineSpectra function combine spectra one file (defined using parameter f = fromFile(data)) single spectrum. mass peaks difference m/z value smaller 3 parts-per-million (ppm) combined one mass peak, intensity representing maximum grouped mass peaks. reduce memory requirement, addition first bin spectrum combining mass peaks within spectrum, aggregating mass peaks bins 0.01 m/z width. case large datasets, also recommended set processingChunkSize() parameter MsExperiment object finite value (default Inf) causing data processed (loaded memory) chunks processingChunkSize() spectra. can reduce memory demand speed process. can now generate BPS sample plot() . , observable overlap ion content files, particularly around 300 m/z 700 m/z. however also differences sets samples. particular, BPS 1, 4, 7 10 (counting row-wise left right) seem different others. fact, four BPS QC samples, remaining six study samples. observed differences might explained fact QC samples pools serum samples different cohort, study samples represent plasma samples, different sample collection. Next visual inspection , can also calculate express similarity BPS heatmap. use compareSpectra() function calculate pairwise similarities BPS use pheatmap() function pheatmap package cluster visualize result. get first glance different samples distribute terms similarity. heatmap confirms observations made BPS, showing distinct clusters QCs study samples, owing different matrices sample collections. also strongly recommended delve deeper data exploring detail. can accomplished carefully assessing data extracting spectra regions interest examination. next chunk, look extract information specific spectrum distinct samples.  Figure 3. Intensity m/z values 125th spectrum two CTR samples. significant dissimilarities peak distribution intensity confirm difference composition QCs study samples. next compare full MS1 spectrum CVD CTR sample.  Figure 4. Intensity m/z values 125th spectrum one CVD one CTR sample. , can observe spectra CVD CTR samples entirely similar, exhibit similar main peaks 200 600 m/z general higher intensity control samples. However peak distribution (least intensity) seems vary m/z 10 210 m/z 600. CTR spectrum exhibits significant peaks around m/z 150 - 200 much lower intensity CVD sample. delve details specific spectrum, wide range functions can employed: Table 3. Intensity m/z values 125th spectrum one CTR sample. chromatogram() function facilitates extraction intensities along retention time. However, access chromatographic information currently efficient seamless spectral information. Work underway develop/improve infrastructure chromatographic data new Chromatograms object aimed flexible user-friendly Spectra object. visualizing LC-MS data, BPC TIC serves valuable tool assess performance liquid chromatography across various samples experiment. case, extract BPC data create plot. BPC captures maximum peak signal spectrum data file plots information retention time spectrum y-axis. BPC can extracted using chromatogram function. setting parameter aggregationFun = \"max\", instruct function report maximum signal per spectrum. Conversely, setting aggregationFun = \"sum\", sums intensities spectrum, thereby creating TIC.  Figure 5. BPC samples colored phenotype. 240 seconds signal seems measured. Thus, filter data removing part well first 10 seconds measured LC run.  Figure 6. BPC filtering retention time. Initially, examined entire BPC subsequently filtered based desired retention times. results smaller file size also facilitates straightforward interpretation BPC. final plot illustrates BPC sample colored phenotype, providing insights signal measured along retention times sample. reveals points compounds eluted LC column. essence, BPC condenses three-dimensional LC-MS data (m/z retention time intensity) two dimensions (retention time intensity). can also compare similarities BPCs heatmap. retention times however identical different samples. Thus bin() chromatographic signal per sample along retention time axis bins two seconds resulting data number bins/data points. can calculate pairwise similarities data vectors using cor() function visualize result using pheatmap().  Figure 7. Heatmap BPC similarities. heatmap reinforces exploration spectra data showed, strong separation QC study samples. important bear mind later analyses. Additionally, study samples group two clusters, cluster containing samples C F cluster II samples. plot TIC samples, using different color cluster.  Figure 8. Example TIC unusual signal. TIC samples look similar, samples cluster show different signal retention time range 40 160 seconds. Whether, strong difference impact following analysis remains determined. Throughout entire process, crucial reference points within dataset, well-known ions. experiments nowadays include internal standards (), case . strongly recommend using visualization throughout entire analysis. experiment, set 15 spiked samples. reviewing signal , selected two guide analysis process. However, also advise plot evaluate ions steps. illustrate , generate Extracted Ion Chromatograms (EIC) selected test ions. restricting MS data intensities within restricted, small m/z range selected retention time window, EICs expected contain signal single type ion. expected m/z retention times set determined different experiment. Additionally, cases internal standards available, commonly present ions sample matrix can serve suitable alternatives. Ideally, compounds distributed across entire retention time range experiment. Table 4. Internal standard list respective m/z expected retention time [s]. plot EICs isotope labeled cystine methionine.  Figure 9. EIC cystine methionine. can observe clear concentration difference QCs study samples isotope labeled cystine ion. Meanwhile, labeled methionine internal standard exhibits discernible signal amidst noise noticeable retention time shift samples. artificially isotope labeled compounds spiked individual samples, also signal endogenous compounds serum (plasma) samples. Thus, calculate next mass m/z [M+H]+ ion endogenous cystine chemical formula extract also EIC ion. calculation exact mass m/z selected ion adduct use calculateMass() mass2mz() functions MetaboCoreUtils package.  Figure 10. EIC endogenous cystine vs spiked. two cystine EICs look highly similar (endogenous shown left, isotope labeled right plot ), shift m/z, arises artificial labeling. shift allows us discriminate endogenous non-endogenous compound.","code":"#' Setting the chunksize chunksize <- 1000 processingChunkSize(spectra(lcms1)) <- chunksize #' Combining all spectra per file into a single spectrum bps <- spectra(lcms1) |>     bin(binSize = 0.01) |>     combineSpectra(f = fromFile(lcms1), intensityFun = max, ppm = 3)  #' Plot the base peak spectra par(mar = c(2, 1, 1, 1)) plotSpectra(bps, main= \"\") #' Calculate similarities between BPS sim_matrix <- compareSpectra(bps)  #' Add sample names as rownames and colnames rownames(sim_matrix) <- colnames(sim_matrix) <- sampleData(lcms1)$sample_name ann <- data.frame(phenotype = sampleData(lcms1)[, \"phenotype\"]) rownames(ann) <- rownames(sim_matrix)  #' Plot the heatmap pheatmap(sim_matrix, annotation_col = ann,          annotation_colors = list(phenotype = col_phenotype)) #' Accessing a single spectrum - comparing with QC par(mfrow = c(1,2), mar = c(2, 2, 2, 2)) spec1 <- spectra(lcms1[1])[125] spec2 <- spectra(lcms1[3])[125] plotSpectra(spec1, main = \"QC sample\") plotSpectra(spec2, main = \"CTR sample\") #' Accessing a single spectrum - comparing CVD and CTR par(mfrow = c(1,2), mar = c(2, 2, 2, 2)) spec1 <- spectra(lcms1[2])[125] spec2 <- spectra(lcms1[3])[125] plotSpectra(spec1, main = \"CVD sample\") plotSpectra(spec2, main = \"CTR sample\") #' Checking its intensity intensity(spec2) NumericList of length 1 [[1]] 18.3266733266736 45.1666666666667 ... 27.1048951048951 34.9020979020979 #' Checking its rtime rtime(spec2) [1] 34.872 #' Checking its m/z mz(spec2) NumericList of length 1 [[1]] 51.1677328505635 53.0461968245186 ... 999.139446289161 999.315208803072 #' Filtering for a specific m/z range and viewing in a tabular format filt_spec <- filterMzRange(spec2,c(50,200))  data.frame(intensity = unlist(intensity(filt_spec)),            mz = unlist(mz(filt_spec))) |>   head() |> kable(format = \"markdown\") #' Extract and plot BPC for full data bpc <- chromatogram(lcms1, aggregationFun = \"max\")  plot(bpc, col = paste0(col_sample, 80), main = \"BPC\", lwd = 1.5) grid() legend(\"topright\", col = col_phenotype,        legend = names(col_phenotype), lty = 1, lwd = 2, horiz = TRUE,        bty = \"n\") #' Filter the data based on retention time lcms1 <- filterRt(lcms1, c(10, 240)) Filter spectra bpc <- chromatogram(lcms1, aggregationFun = \"max\")  #' Plot after filtering plot(bpc, col = paste0(col_sample, 80),      main = \"BPC after filtering retention time\", lwd = 1.5) grid() legend(\"topright\", col = col_phenotype,        legend = names(col_phenotype), lty = 1, lwd = 2, horiz = TRUE, bty = \"n\") #' Total ion chromatogram tic <- chromatogram(lcms1, aggregationFun = \"sum\") |>   bin(binSize = 2)  #' Calculate similarity (Pearson correlation) between BPCs ticmap <- do.call(cbind, lapply(tic, intensity)) |>   cor()  rownames(ticmap) <- colnames(ticmap) <- sampleData(lcms1)$sample_name ann <- data.frame(phenotype = sampleData(lcms1)[, \"phenotype\"]) rownames(ann) <- rownames(ticmap)  #' Plot heatmap pheatmap(ticmap, annotation_col = ann,          annotation_colors = list(phenotype = col_phenotype)) cluster_I_idx <- sampleData(lcms1)$sample_name %in% c(\"F\", \"C\") cluster_II_idx <- sampleData(lcms1)$sample_name %in% c(\"A\", \"B\", \"D\", \"E\")  temp_col <- c(\"grey\", \"red\") names(temp_col) <- c(\"Cluster II\", \"Cluster I\") col <- rep(temp_col[1], length(lcms1)) col[cluster_I_idx] <- temp_col[2] col[sampleData(lcms1)$phenotype == \"QC\"] <- NA  lcms1 |>     chromatogram(aggregationFun = \"sum\") |>     plot( col = col,      main = \"TIC after filtering retention time\", lwd = 1.5) grid() legend(\"topright\", col = temp_col,        legend = names(temp_col), lty = 1, lwd = 2,        horiz = TRUE, bty = \"n\") #' Load our list of standard intern_standard <- read.delim(\"intern_standard_list.txt\")  # Extract EICs for the list eic_is <- chromatogram(     lcms1,     rt = as.matrix(intern_standard[, c(\"rtmin\", \"rtmax\")]),     mz = as.matrix(intern_standard[, c(\"mzmin\", \"mzmax\")]))  #' Add internal standard metadata fData(eic_is)$mz <- intern_standard$mz fData(eic_is)$rt <- intern_standard$RT fData(eic_is)$name <- intern_standard$name fData(eic_is)$abbreviation <- intern_standard$abbreviation rownames(fData(eic_is)) <- intern_standard$abbreviation  #' Summary of IS information fData(eic_is)[, c(\"name\", \"mz\", \"rt\")] |>     kable(format = \"pipe\") #' Extract the two IS from the chromatogram object. eic_cystine <- eic_is[\"cystine_13C_15N\"] eic_met <- eic_is[\"methionine_13C_15N\"]  #' plot both EIC par(mfrow = c(1, 2), mar = c(4, 2, 2, 0.5)) plot(eic_cystine, main = fData(eic_cystine)$name, cex.axis = 0.8,      cex.main = 0.8,      col = paste0(col_sample, 80)) grid() abline(v = fData(eic_cystine)$rt, col = \"red\", lty = 3)  plot(eic_met, main = fData(eic_met)$name, cex.axis = 0.8, cex.main = 0.8,      col = paste0(col_sample, 80)) grid() abline(v = fData(eic_met)$rt, col = \"red\", lty = 3) legend(\"topright\", col = col_phenotype, legend = names(col_phenotype), lty = 1,        bty = \"n\") #' extract endogenous cystine mass and EIC and plot. cysmass <- calculateMass(\"C6H12N2O4S2\") cys_endo <- mass2mz(cysmass, adduct = \"[M+H]+\")[, 1]  #' Plot versus spiked par(mfrow = c(1, 2)) chromatogram(lcms1, mz = cys_endo + c(-0.005, 0.005),              rt = unlist(fData(eic_cystine)[, c(\"rtmin\", \"rtmax\")]),              aggregationFun = \"max\") |>     plot(col = paste0(col_sample, 80)) |>     grid()  plot(eic_cystine, col = paste0(col_sample, 80)) grid() legend(\"topright\", col = col_phenotype, legend = names(col_phenotype), lty = 1,        bty = \"n\")"},{"path":"https://rformassspectrometry.github.io/metabonaut/articles/a-end-to-end-untargeted-metabolomics.html","id":"spectra-data-visualization-bps","dir":"Articles","previous_headings":"","what":"Spectra Data Visualization: BPS","title":"Complete end-to-end LC-MS/MS Metabolomic Data analysis","text":"BPS collapses data retention time dimension reveals prevalent ions present samples, creation BPS however straightforward. Mass peaks, even representing signals ion, never identical m/z values consecutive spectra due measurement error/resolution instrument. use combineSpectra function combine spectra one file (defined using parameter f = fromFile(data)) single spectrum. mass peaks difference m/z value smaller 3 parts-per-million (ppm) combined one mass peak, intensity representing maximum grouped mass peaks. reduce memory requirement, addition first bin spectrum combining mass peaks within spectrum, aggregating mass peaks bins 0.01 m/z width. case large datasets, also recommended set processingChunkSize() parameter MsExperiment object finite value (default Inf) causing data processed (loaded memory) chunks processingChunkSize() spectra. can reduce memory demand speed process. can now generate BPS sample plot() . , observable overlap ion content files, particularly around 300 m/z 700 m/z. however also differences sets samples. particular, BPS 1, 4, 7 10 (counting row-wise left right) seem different others. fact, four BPS QC samples, remaining six study samples. observed differences might explained fact QC samples pools serum samples different cohort, study samples represent plasma samples, different sample collection. Next visual inspection , can also calculate express similarity BPS heatmap. use compareSpectra() function calculate pairwise similarities BPS use pheatmap() function pheatmap package cluster visualize result. get first glance different samples distribute terms similarity. heatmap confirms observations made BPS, showing distinct clusters QCs study samples, owing different matrices sample collections. also strongly recommended delve deeper data exploring detail. can accomplished carefully assessing data extracting spectra regions interest examination. next chunk, look extract information specific spectrum distinct samples.  Figure 3. Intensity m/z values 125th spectrum two CTR samples. significant dissimilarities peak distribution intensity confirm difference composition QCs study samples. next compare full MS1 spectrum CVD CTR sample.  Figure 4. Intensity m/z values 125th spectrum one CVD one CTR sample. , can observe spectra CVD CTR samples entirely similar, exhibit similar main peaks 200 600 m/z general higher intensity control samples. However peak distribution (least intensity) seems vary m/z 10 210 m/z 600. CTR spectrum exhibits significant peaks around m/z 150 - 200 much lower intensity CVD sample. delve details specific spectrum, wide range functions can employed: Table 3. Intensity m/z values 125th spectrum one CTR sample.","code":"#' Setting the chunksize chunksize <- 1000 processingChunkSize(spectra(lcms1)) <- chunksize #' Combining all spectra per file into a single spectrum bps <- spectra(lcms1) |>     bin(binSize = 0.01) |>     combineSpectra(f = fromFile(lcms1), intensityFun = max, ppm = 3)  #' Plot the base peak spectra par(mar = c(2, 1, 1, 1)) plotSpectra(bps, main= \"\") #' Calculate similarities between BPS sim_matrix <- compareSpectra(bps)  #' Add sample names as rownames and colnames rownames(sim_matrix) <- colnames(sim_matrix) <- sampleData(lcms1)$sample_name ann <- data.frame(phenotype = sampleData(lcms1)[, \"phenotype\"]) rownames(ann) <- rownames(sim_matrix)  #' Plot the heatmap pheatmap(sim_matrix, annotation_col = ann,          annotation_colors = list(phenotype = col_phenotype)) #' Accessing a single spectrum - comparing with QC par(mfrow = c(1,2), mar = c(2, 2, 2, 2)) spec1 <- spectra(lcms1[1])[125] spec2 <- spectra(lcms1[3])[125] plotSpectra(spec1, main = \"QC sample\") plotSpectra(spec2, main = \"CTR sample\") #' Accessing a single spectrum - comparing CVD and CTR par(mfrow = c(1,2), mar = c(2, 2, 2, 2)) spec1 <- spectra(lcms1[2])[125] spec2 <- spectra(lcms1[3])[125] plotSpectra(spec1, main = \"CVD sample\") plotSpectra(spec2, main = \"CTR sample\") #' Checking its intensity intensity(spec2) NumericList of length 1 [[1]] 18.3266733266736 45.1666666666667 ... 27.1048951048951 34.9020979020979 #' Checking its rtime rtime(spec2) [1] 34.872 #' Checking its m/z mz(spec2) NumericList of length 1 [[1]] 51.1677328505635 53.0461968245186 ... 999.139446289161 999.315208803072 #' Filtering for a specific m/z range and viewing in a tabular format filt_spec <- filterMzRange(spec2,c(50,200))  data.frame(intensity = unlist(intensity(filt_spec)),            mz = unlist(mz(filt_spec))) |>   head() |> kable(format = \"markdown\")"},{"path":"https://rformassspectrometry.github.io/metabonaut/articles/a-end-to-end-untargeted-metabolomics.html","id":"chromatographic-data-visualization-bpc-and-tic","dir":"Articles","previous_headings":"","what":"Chromatographic Data Visualization: BPC and TIC","title":"Complete end-to-end LC-MS/MS Metabolomic Data analysis","text":"chromatogram() function facilitates extraction intensities along retention time. However, access chromatographic information currently efficient seamless spectral information. Work underway develop/improve infrastructure chromatographic data new Chromatograms object aimed flexible user-friendly Spectra object. visualizing LC-MS data, BPC TIC serves valuable tool assess performance liquid chromatography across various samples experiment. case, extract BPC data create plot. BPC captures maximum peak signal spectrum data file plots information retention time spectrum y-axis. BPC can extracted using chromatogram function. setting parameter aggregationFun = \"max\", instruct function report maximum signal per spectrum. Conversely, setting aggregationFun = \"sum\", sums intensities spectrum, thereby creating TIC.  Figure 5. BPC samples colored phenotype. 240 seconds signal seems measured. Thus, filter data removing part well first 10 seconds measured LC run.  Figure 6. BPC filtering retention time. Initially, examined entire BPC subsequently filtered based desired retention times. results smaller file size also facilitates straightforward interpretation BPC. final plot illustrates BPC sample colored phenotype, providing insights signal measured along retention times sample. reveals points compounds eluted LC column. essence, BPC condenses three-dimensional LC-MS data (m/z retention time intensity) two dimensions (retention time intensity). can also compare similarities BPCs heatmap. retention times however identical different samples. Thus bin() chromatographic signal per sample along retention time axis bins two seconds resulting data number bins/data points. can calculate pairwise similarities data vectors using cor() function visualize result using pheatmap().  Figure 7. Heatmap BPC similarities. heatmap reinforces exploration spectra data showed, strong separation QC study samples. important bear mind later analyses. Additionally, study samples group two clusters, cluster containing samples C F cluster II samples. plot TIC samples, using different color cluster.  Figure 8. Example TIC unusual signal. TIC samples look similar, samples cluster show different signal retention time range 40 160 seconds. Whether, strong difference impact following analysis remains determined. Throughout entire process, crucial reference points within dataset, well-known ions. experiments nowadays include internal standards (), case . strongly recommend using visualization throughout entire analysis. experiment, set 15 spiked samples. reviewing signal , selected two guide analysis process. However, also advise plot evaluate ions steps. illustrate , generate Extracted Ion Chromatograms (EIC) selected test ions. restricting MS data intensities within restricted, small m/z range selected retention time window, EICs expected contain signal single type ion. expected m/z retention times set determined different experiment. Additionally, cases internal standards available, commonly present ions sample matrix can serve suitable alternatives. Ideally, compounds distributed across entire retention time range experiment. Table 4. Internal standard list respective m/z expected retention time [s]. plot EICs isotope labeled cystine methionine.  Figure 9. EIC cystine methionine. can observe clear concentration difference QCs study samples isotope labeled cystine ion. Meanwhile, labeled methionine internal standard exhibits discernible signal amidst noise noticeable retention time shift samples. artificially isotope labeled compounds spiked individual samples, also signal endogenous compounds serum (plasma) samples. Thus, calculate next mass m/z [M+H]+ ion endogenous cystine chemical formula extract also EIC ion. calculation exact mass m/z selected ion adduct use calculateMass() mass2mz() functions MetaboCoreUtils package.  Figure 10. EIC endogenous cystine vs spiked. two cystine EICs look highly similar (endogenous shown left, isotope labeled right plot ), shift m/z, arises artificial labeling. shift allows us discriminate endogenous non-endogenous compound.","code":"#' Extract and plot BPC for full data bpc <- chromatogram(lcms1, aggregationFun = \"max\")  plot(bpc, col = paste0(col_sample, 80), main = \"BPC\", lwd = 1.5) grid() legend(\"topright\", col = col_phenotype,        legend = names(col_phenotype), lty = 1, lwd = 2, horiz = TRUE,        bty = \"n\") #' Filter the data based on retention time lcms1 <- filterRt(lcms1, c(10, 240)) Filter spectra bpc <- chromatogram(lcms1, aggregationFun = \"max\")  #' Plot after filtering plot(bpc, col = paste0(col_sample, 80),      main = \"BPC after filtering retention time\", lwd = 1.5) grid() legend(\"topright\", col = col_phenotype,        legend = names(col_phenotype), lty = 1, lwd = 2, horiz = TRUE, bty = \"n\") #' Total ion chromatogram tic <- chromatogram(lcms1, aggregationFun = \"sum\") |>   bin(binSize = 2)  #' Calculate similarity (Pearson correlation) between BPCs ticmap <- do.call(cbind, lapply(tic, intensity)) |>   cor()  rownames(ticmap) <- colnames(ticmap) <- sampleData(lcms1)$sample_name ann <- data.frame(phenotype = sampleData(lcms1)[, \"phenotype\"]) rownames(ann) <- rownames(ticmap)  #' Plot heatmap pheatmap(ticmap, annotation_col = ann,          annotation_colors = list(phenotype = col_phenotype)) cluster_I_idx <- sampleData(lcms1)$sample_name %in% c(\"F\", \"C\") cluster_II_idx <- sampleData(lcms1)$sample_name %in% c(\"A\", \"B\", \"D\", \"E\")  temp_col <- c(\"grey\", \"red\") names(temp_col) <- c(\"Cluster II\", \"Cluster I\") col <- rep(temp_col[1], length(lcms1)) col[cluster_I_idx] <- temp_col[2] col[sampleData(lcms1)$phenotype == \"QC\"] <- NA  lcms1 |>     chromatogram(aggregationFun = \"sum\") |>     plot( col = col,      main = \"TIC after filtering retention time\", lwd = 1.5) grid() legend(\"topright\", col = temp_col,        legend = names(temp_col), lty = 1, lwd = 2,        horiz = TRUE, bty = \"n\") #' Load our list of standard intern_standard <- read.delim(\"intern_standard_list.txt\")  # Extract EICs for the list eic_is <- chromatogram(     lcms1,     rt = as.matrix(intern_standard[, c(\"rtmin\", \"rtmax\")]),     mz = as.matrix(intern_standard[, c(\"mzmin\", \"mzmax\")]))  #' Add internal standard metadata fData(eic_is)$mz <- intern_standard$mz fData(eic_is)$rt <- intern_standard$RT fData(eic_is)$name <- intern_standard$name fData(eic_is)$abbreviation <- intern_standard$abbreviation rownames(fData(eic_is)) <- intern_standard$abbreviation  #' Summary of IS information fData(eic_is)[, c(\"name\", \"mz\", \"rt\")] |>     kable(format = \"pipe\") #' Extract the two IS from the chromatogram object. eic_cystine <- eic_is[\"cystine_13C_15N\"] eic_met <- eic_is[\"methionine_13C_15N\"]  #' plot both EIC par(mfrow = c(1, 2), mar = c(4, 2, 2, 0.5)) plot(eic_cystine, main = fData(eic_cystine)$name, cex.axis = 0.8,      cex.main = 0.8,      col = paste0(col_sample, 80)) grid() abline(v = fData(eic_cystine)$rt, col = \"red\", lty = 3)  plot(eic_met, main = fData(eic_met)$name, cex.axis = 0.8, cex.main = 0.8,      col = paste0(col_sample, 80)) grid() abline(v = fData(eic_met)$rt, col = \"red\", lty = 3) legend(\"topright\", col = col_phenotype, legend = names(col_phenotype), lty = 1,        bty = \"n\") #' extract endogenous cystine mass and EIC and plot. cysmass <- calculateMass(\"C6H12N2O4S2\") cys_endo <- mass2mz(cysmass, adduct = \"[M+H]+\")[, 1]  #' Plot versus spiked par(mfrow = c(1, 2)) chromatogram(lcms1, mz = cys_endo + c(-0.005, 0.005),              rt = unlist(fData(eic_cystine)[, c(\"rtmin\", \"rtmax\")]),              aggregationFun = \"max\") |>     plot(col = paste0(col_sample, 80)) |>     grid()  plot(eic_cystine, col = paste0(col_sample, 80)) grid() legend(\"topright\", col = col_phenotype, legend = names(col_phenotype), lty = 1,        bty = \"n\")"},{"path":"https://rformassspectrometry.github.io/metabonaut/articles/a-end-to-end-untargeted-metabolomics.html","id":"known-compounds","dir":"Articles","previous_headings":"Data visualization and general quality assessment","what":"Known compounds","title":"Complete end-to-end LC-MS/MS Metabolomic Data analysis","text":"Throughout entire process, crucial reference points within dataset, well-known ions. experiments nowadays include internal standards (), case . strongly recommend using visualization throughout entire analysis. experiment, set 15 spiked samples. reviewing signal , selected two guide analysis process. However, also advise plot evaluate ions steps. illustrate , generate Extracted Ion Chromatograms (EIC) selected test ions. restricting MS data intensities within restricted, small m/z range selected retention time window, EICs expected contain signal single type ion. expected m/z retention times set determined different experiment. Additionally, cases internal standards available, commonly present ions sample matrix can serve suitable alternatives. Ideally, compounds distributed across entire retention time range experiment. Table 4. Internal standard list respective m/z expected retention time [s]. plot EICs isotope labeled cystine methionine.  Figure 9. EIC cystine methionine. can observe clear concentration difference QCs study samples isotope labeled cystine ion. Meanwhile, labeled methionine internal standard exhibits discernible signal amidst noise noticeable retention time shift samples. artificially isotope labeled compounds spiked individual samples, also signal endogenous compounds serum (plasma) samples. Thus, calculate next mass m/z [M+H]+ ion endogenous cystine chemical formula extract also EIC ion. calculation exact mass m/z selected ion adduct use calculateMass() mass2mz() functions MetaboCoreUtils package.  Figure 10. EIC endogenous cystine vs spiked. two cystine EICs look highly similar (endogenous shown left, isotope labeled right plot ), shift m/z, arises artificial labeling. shift allows us discriminate endogenous non-endogenous compound.","code":"#' Load our list of standard intern_standard <- read.delim(\"intern_standard_list.txt\")  # Extract EICs for the list eic_is <- chromatogram(     lcms1,     rt = as.matrix(intern_standard[, c(\"rtmin\", \"rtmax\")]),     mz = as.matrix(intern_standard[, c(\"mzmin\", \"mzmax\")]))  #' Add internal standard metadata fData(eic_is)$mz <- intern_standard$mz fData(eic_is)$rt <- intern_standard$RT fData(eic_is)$name <- intern_standard$name fData(eic_is)$abbreviation <- intern_standard$abbreviation rownames(fData(eic_is)) <- intern_standard$abbreviation  #' Summary of IS information fData(eic_is)[, c(\"name\", \"mz\", \"rt\")] |>     kable(format = \"pipe\") #' Extract the two IS from the chromatogram object. eic_cystine <- eic_is[\"cystine_13C_15N\"] eic_met <- eic_is[\"methionine_13C_15N\"]  #' plot both EIC par(mfrow = c(1, 2), mar = c(4, 2, 2, 0.5)) plot(eic_cystine, main = fData(eic_cystine)$name, cex.axis = 0.8,      cex.main = 0.8,      col = paste0(col_sample, 80)) grid() abline(v = fData(eic_cystine)$rt, col = \"red\", lty = 3)  plot(eic_met, main = fData(eic_met)$name, cex.axis = 0.8, cex.main = 0.8,      col = paste0(col_sample, 80)) grid() abline(v = fData(eic_met)$rt, col = \"red\", lty = 3) legend(\"topright\", col = col_phenotype, legend = names(col_phenotype), lty = 1,        bty = \"n\") #' extract endogenous cystine mass and EIC and plot. cysmass <- calculateMass(\"C6H12N2O4S2\") cys_endo <- mass2mz(cysmass, adduct = \"[M+H]+\")[, 1]  #' Plot versus spiked par(mfrow = c(1, 2)) chromatogram(lcms1, mz = cys_endo + c(-0.005, 0.005),              rt = unlist(fData(eic_cystine)[, c(\"rtmin\", \"rtmax\")]),              aggregationFun = \"max\") |>     plot(col = paste0(col_sample, 80)) |>     grid()  plot(eic_cystine, col = paste0(col_sample, 80)) grid() legend(\"topright\", col = col_phenotype, legend = names(col_phenotype), lty = 1,        bty = \"n\")"},{"path":"https://rformassspectrometry.github.io/metabonaut/articles/a-end-to-end-untargeted-metabolomics.html","id":"data-preprocessing","dir":"Articles","previous_headings":"","what":"Data preprocessing","title":"Complete end-to-end LC-MS/MS Metabolomic Data analysis","text":"Preprocessing stands inaugural step analysis untargeted LC-MS. characterized 3 main stages: chromatographic peak detection, retention time shift correction (alignment) correspondence results features defined. primary objective preprocessing quantification signals ions measured sample, addressing potential retention time drifts samples, ensuring alignment quantified signals across samples within experiment. final result LC-MS data preprocessing numeric matrix abundances quantified entities samples experiment. initial preprocessing step involves detecting intensity peaks along retention time axis, called chromatographic peaks. achieve , employ findChromPeaks() function within xcms. function supports various algorithms peak detection, can selected configured respective parameter objects. preferred algorithm case, CentWave, utilizes continuous wavelet transformation (CWT)-based peak detection [@tautenhahn_highly_2008]. method known effectiveness handling non-Gaussian shaped chromatographic peaks peaks varying retention time widths, commonly encountered HILIC separations. apply CentWave algorithm default settings extracted ion chromatogram cystine methionine ions evaluate results. CentWave highly performant algorithm, requires costumized dataset. implies parameters fine-tuned based user’s data. example serves clear motivation users familiarize various parameters need adapt data set. discuss main parameters can easily adjusted suit user’s dataset: peakwidth: Specifies minimal maximal expected width peaks retention time dimension. Highly dependent chromatographic settings used. ppm: maximal allowed difference mass peaks’ m/z values (parts-per-million) consecutive scans consider representing signal ion. integrate: parameter defines integration method. , primarily use integrate = 2 integrates also signal chromatographic peak’s tail considered accurate developers. determine peakwidth, recommend users refer previous EICs estimate range peak widths observe dataset. Ideally, examining multiple EICs goal. dataset, peak widths appear around 2 10 seconds. advise choosing range wide narrow peakwidth parameter can lead false positives negatives. determine ppm, deeper analysis dataset needed. clarified ppm depends instrument, users necessarily input vendor-advertised ppm. ’s determine accurately possible: following steps involve generating highly restricted MS area single mass peak per spectrum, representing cystine ion. m/z peaks extracted, absolute difference calculated finally expressed ppm. therefore, choose value close maximum within range parameter ppm, .e., 15 ppm. can now perform chromatographic peak detection adapted settings EICs. important note , properly estimate background noise, sufficient data points outside chromatographic peak need present. generally problem peak detection performed full LC-MS data set, peak detection EICs retention time range EIC needs sufficiently wide. function fails find peak EIC, initial troubleshooting step increase range. Additionally, signal--noise threshold snthresh reduced peak detection EICs, within small retention time range, enough signal present properly estimate background noise. Finally, case MS1 data points per peaks, setting CentWave’s advanced parameter extendLengthMSW TRUE can help peak detection. customized parameters, chromatographic peak detected sample. , use plot() function EICs visualize results.  Figure 11. Chromatographic peak detection EICs. can see peak seems ot detected sample ions. indicates custom settings seem thus suitable dataset. now proceed apply entire dataset, extracting EICs ions evaluate confirm chromatographic peak detection worked expected. Note: revert value parameter snthresh default, , mentioned , background noise estimation reliable performed full data set. Parameter chunkSize findChromPeaks() defines number data files loaded memory processed simultaneously. parameter thus allows fine-tune memory demand well performance chromatographic peak detection step. plot EICs two selected internal standards evaluate chromatographic peak detection results.  Figure 12. Chromatographic peak detection EICs processing. Peaks seem detected properly samples ions. indicates peak detection process entire dataset successful. identification chromatographic peaks using CentWave algorithm can sometimes result artifacts, overlapping split peaks. address issue, refineChromPeaks() function utilized, conjunction MergeNeighboringPeaksParam, aims merging split peaks. show examples CentWave peak detection artifacts. examples pre-selected illustrate necessity next step:  Figure 13. Examples CentWave peak detection artifacts. cases signal presumably single type ion split two separate chromatographic peaks (indicated vertical line). MergeNeigboringPeaksParam allows combine split peaks. parameters algorithm defined : expandMz: Suggested kept relatively small (0.0015) prevent merging isotopes. expandRt: Usually set approximately half size average retention time width used chromatographic peak detection (case, 2.5 seconds). minProp: Used determine whether candidates merged. Chromatographic peaks overlapping m/z ranges (expanded side expandMz) tail--head distance retention time dimension less 2 * expandRt, signal higher minProp apex intensity chromatographic peak lower intensity, merged. Values parameter small avoid merging closely co-eluting ions, isomers. test settings EICs split peaks.  Figure 14. Examples CentWave peak detection artifacts merging. can observe artificially split peaks appropriately merged. Therefore, next apply settings entire dataset. peak merging, column \"merged\" result object’s chromPeakData() data frame can used evaluate chromatographic peaks result represent signal merged, originally identified chromatographic peaks. proceeding next preprocessing step generally suggested evaluate results chromatographic peak detection EICs e.g. internal standards compounds/ions known present samples. Additionally, evaluating comparing number identified chromatographic peaks samples data set can help spotting potentially problematic samples. count number chromatographic peaks per sample show numbers table. Table 5. Samples number identified chromatographic peaks. similar number chromatographic peaks identified within various samples data set. Additional options evaluate results chromatographic peak detection can implemented using plotChromPeaks() function summarizing results using base R commands. Despite using chromatographic settings conditions retention time shifts unavoidable. Indeed, performance instrument can change time, example due small variations environmental conditions, temperature pressure. shifts generally small samples measured within batch/measurement run, can considerable data experiment acquired across longer time period. evaluate presence shift extract plot BPC QC samples.  Figure 15. BPC QC samples. QC samples representing sample (pool) measured regular intervals measurement run experiment measured day. Still, small shifts can observed, especially region 100 150 seconds. facilitate proper correspondence signals across samples (hence definition LC-MS features), essential minimize differences retention times. Theoretically, proceed two steps: first select QC samples dataset first alignment , using -called anchor peaks. way can assume linear shift time, since always measuring sample different regular time intervals. Despite external QCs data set, still use subset-based alignment assuming retention time shifts independent different sample matrix (human serum plasma) instead mostly instrument-dependent. Note also possible manually specify anchor peaks, respectively retention times align data set external, reference, data set. information provided vignettes xcms package. calculating much adjust retention time samples, apply shift also study samples. xcms retention time alignment can performed using adjustRtime() function alignment algorithm. example use PeakGroups method [@smith_xcms_2006] performs alignment minimizing differences retention times set anchor peaks different samples. method requires initial correspondence analysis match/group chromatographic peaks across samples algorithm selects anchor peaks alignment. initial correspondence, use PeakDensity approach [@smith_xcms_2006] groups chromatographic peaks similar m/z retention time LC-MS features. parameters algorithm, can configured using PeakDensityParam object, sampleGroups, minFraction, binSize, ppm bw. binSize, ppm bw allow specify similar chromatographic peaks’ m/z retention time values need consider grouping feature. binSize ppm define required similarity m/z values. Within m/z bin (defined binSize ppm) areas along retention time axis high chromatographic peak density (considering peaks samples) identified, chromatographic peaks within regions considered grouping feature. High density areas identified using base R density() function, bw parameter: higher values define wider retention time areas, lower values require chromatographic peaks similar retention times. parameter can seen black line plot , corresponding smoothness density curve. Whether candidate peaks get grouped feature depends also parameters sampleGroups minFraction: sampleGroups provide, sample, sample group belongs . minFraction expected value 0 1 defining proportion samples within least one sample groups (defined sampleGroups) chromatographic peaks detected group feature. initial correspondence, parameters don’t need fully optimized. Selection dataset-specific parameter values described detail next section. dataset, use small values binSize ppm , importantly, also parameter bw, since data set ultra high performance (UHP) LC setup used. minFraction use high value (0.9) ensure features defined chromatographic peaks present almost samples one sample group (can used anchor peaks actual alignment). base alignment later QC samples hence define sampleGroups binary variable grouping samples either study, QC group.  Figure 16. Initial correspondence analysis. PeakGroups-based alignment can next performed using adjustRtime() function PeakGroupsParam parameter object. parameters algorithm : subsetAdjust subset: Allows subset alignment. base retention time alignment QC samples, .e., retention time shifts estimated based repeatedly measured samples. resulting adjustment applied entire data. data sets QC samples (e.g. sample pools) measured repeatedly, strongly suggest use method. Note also subset-based alignment samples ordered injection index (.e., order measured measurement run). minFraction: value 0 1 defining proportion samples (full data set, data subset defined subset) chromatographic peak identified use anchor peak. contrast PeakDensityParam parameter used define proportion within sample group. span: PeakGroups method allows, depending data, adjust regions along retention time axis differently. enable local alignments LOESS function used parameter defines degree smoothing function. Generally, values 0.4 0.6 used, however, suggested evaluate alignment results eventually adapt parameters result satisfactory. perform alignment data set based retention times anchor peaks defined subset QC samples. Alignment adjusted retention times spectra data set, well retention times identified chromatographic peaks. alignment performed, user evaluate results using plotAdjustedRtime() function. function visualizes difference adjusted raw retention time sample y-axis along adjusted retention time x-axis. Dot points represent position used anchor peak along retention time axis. optimal alignment areas along retention time axis, anchor peaks scattered retention time dimension.  Figure 17. Retention time alignment results. samples present data set measured within measurement run, resulting small retention time shifts. Therefore, little adjustments needed performed (shifts maximum 1 second can seen plot ). Generally, magnitude adjustment seen plots match expectation analyst. can also compare BPC alignment. get original data, .e. raw retention times, can use dropAdjustedRtime() function:  Figure 18. BPC alignment. largest shift can observed retention time range 120 130s. Apart retention time range, little changes can observed. next evaluate impact alignment EICs selected internal standards. thus first extract ion chromatograms alignment. can now evaluate alignment effect test ions. plot EICs alignment isotope labeled cystine methionine.  Figure 19. EICs cystine methionine alignment. non-endogenous cystine ion already well aligned difference minimal. methionine ion, however, shows improvement alignment. addition visual inspection results, also evaluate impact alignment comparing variance retention times internal standards alignment. end, first need identify chromatographic peaks sample m/z retention time close expected values internal standard. use matchValues() function MetaboAnnotation package [@rainer_modular_2022] using MzRtParam method identify chromatographic peaks similar m/z (+/- 50 ppm) retention time (+/- 10 seconds) internal standard’s values. parameters mzColname rtColname specify column names query () target (chromatographic peaks) contain m/z retention time values match entities. perform matching separately sample. internal standard every sample, use filterMatches() function SingleMatchParam() parameter select chromatographic peak highest intensity. now internal standard ID chromatographic peak sample likely represents signal ion. can now extract retention times chromatographic peaks alignment. can now evaluate impact alignment retention times internal standards across full data set:  Figure 20. Retention time variation internal standards alignment. average, variation retention times internal standards across samples slightly reduced alignment. briefly touched subject correspondence determine anchor peaks alignment. Generally, goal correspondence analysis identify chromatographic peaks originate types ions samples experiment group LC-MS features. point, proper configuration parameter bw crucial. illustrate sensible choices parameter’s value can made. use plotChromPeakDensity() function simulate correspondence analysis default values PeakGroups extracted ion chromatograms two selected isotope labeled ions. plot shows EIC top panel, apex position chromatographic peaks different samples (y-axis), along retention time (x-axis) lower panel.  Figure 21. Initial correspondence analysis, Cystine.  Figure 22. Initial correspondence analysis, Methionine. Grouping peaks depends smoothness previousl mentionned density curve can configured parameter bw. seen , smoothness high properly group features. looking default parameters, can observe indeed, bw parameter set bw = 30, high modern UHPLC-MS setups. reduce value parameter 1.8 evaluate impact.  Figure 23. Correspondence analysis optimized parameters, Cystine.  Figure 24. Correspondence analysis optimized parameters, Methionine. can observe peaks now grouped accurately single feature test ion. important parameters optimized : binsize: data generated high resolution MS instrument, thus select low value paramete. ppm: TOF instruments, suggested use value ppm larger 0 accommodate higher measurement error instrument larger m/z values. minFraction: set minFraction = 0.75, hence defining features chromatographic peak identified least 75% samples one sample groups. sampleGroups: use information available sampleData’s \"phenotype\" column. correspondence analysis suggested evaluate results selected EICs. extract signal m/z similar isotope labeled methionine larger retention time range. Importantly, show actual correspondence results, set simulate = FALSE plotChromPeakDensity() function.  Figure 25. Correspondence analysis results, Methionine. hoped, signal two different ions now grouped separate features. Generally, correspondence results evaluated extracted chromatograms. Another interesting information look distribution features along retention time axis. Table 5. Distribution features along retention time axis. results correspondence analysis now stored, along results preprocessing steps, within XcmsExperiment result object. correspondence results, .e., definition LC-MS features, can extracted using featureDefinitions() function. data frame provides average m/z retention time (columns \"mzmed\" \"rtmed\") characterize LC-MS feature. Column, \"peakidx\" contains indices chromatographic peaks assigned feature. actual abundances features, represent also final preprocessing results, can extracted featureValues() function: can note features (e.g. F0003 F0006) missing values samples. expected certain degree samples features, respectively ions, need present. address next section. previously observed missing values (NA) attributed various reasons. Although might represent genuinely missing value, indicating ion (feature) truly present particular sample, also result failure preceding chromatographic peak detection step. crucial able recover missing values latter category much possible reduce eventual need data imputation. next examine prevalent missing values present dataset: can observe substantial number missing values values dataset. Let’s therefore delve process gap-filling. first evaluate example features chromatographic peak detected samples:  Figure 26. Examples chromatographic peaks missing values. instances, chromatographic peak identified one two selected samples (red line), hence missing value reported feature particular samples (blue line). However, cases, signal measured samples, thus, reporting missing value correct example. signal feature low, likely reason peak detection failed. rescue signal cases, fillChromPeaks() function can used ChromPeakAreaParam approach. method defines m/z-retention time area feature based detected peaks, signal respective ion expected. integrates intensities within area samples missing values feature. reported feature abundance. apply method using default parameters. fillChromPeaks() thus rescue missing data data set. Note , even sample ion present, worst case noise integrated, expected much lower actual chromatographic peak signal. Let’s look previously missing values :  Figure 27. Examples chromatographic peaks missing values gap-filling. gap-filling, also blue colored sample chromatographic peak present peak area reported feature abundance sample. assess effectiveness gap-filling method rescuing signals, can also plot average signal features least one missing value average filled-signal. advisable perform analysis repeatedly measured samples; case, QC samples used. , extract: Feature values detected chromatographic peaks setting filled = FALSE featuresValues() call. filled-signal first extracting detected gap-filled abundances replace values detected chromatographic peaks NA. , calculate row averages matrices plot .  detected (x-axis) gap-filled (y-axis) values QC samples highly correlated. Especially higher abundances, agreement high, low intensities, can expected, differences higher trending correlation line. , addition, fit linear regression line data summarize results linear regression line slope 1.12 intercept -1.62. indicates filled-signal average 1.12 times higher detected signal. final results LC-MS data preprocessing stored within XcmsExperiment object. includes identified chromatographic peaks, alignment results, well correspondence results. addition, guarantee reproducibility, result object keeps track performed processing steps, including individual parameter objects used configure . processHistory() function returns list various applied processing steps chronological order. , extract information first step performed preprocessing. processParam() function used extract actual parameter class used configure processing step. final result whole LC-MS data preprocessing two-dimensional matrix abundances -called LC-MS features samples. Note stage analysis features characterized m/z retention time don’t yet information metabolite feature represent. seen , feature matrix can extracted featureValues() function corresponding feature characteristics (.e., m/z retention time values) using featureDefinitions() function. Thus, two arrays extracted xcms result object used/imported analysis packages processing. example also exported tab delimited text files, used external tool, used, also MS2 spectra available, feature-based molecular networking GNPS analysis environment [@nothias_feature-based_2020]. processing R, reference link raw MS data required, suggested extract xcms preprocessing result using quantify() function SummarizedExperiment object, Bioconductor’s default container data biological assays/experiments. simplifies integration Bioconductor analysis packages. quantify() function takes parameters featureValues() function, thus, call extract SummarizedExperiment detected, gap-filled, feature abundances: Sample identifications xcms result’s sampleData() now available colData() (column, sample annotations) featureDefinitions() rowData() (row, feature annotations). feature values added first assay() SummarizedExperiment even processing history available object’s metadata(). SummarizedExperiment supports multiple assays, numeric matrices dimensions. thus add detected gap-filled feature abundances additional assay SummarizedExperiment. Feature abundances can extracted assay() function. extract first 6 lines detected gap-filled feature abundances: advantage, addition container full preprocessing results also possibility easy intuitive creation data subsets ensuring data integrity. example easy subset full data selection features /samples: moving next step analysis, advisable save preprocessing results. multiple format options save , can found MsIO package documentation. save XcmsExperiment object file format handled alabster framework, ensures object can easily read languages like Python Javascript well loaded easily back R.","code":"#' Use default Centwave parameter param <- CentWaveParam()  #' Look at the default parameters param Object of class:  CentWaveParam  Parameters:  - ppm: [1] 25  - peakwidth: [1] 20 50  - snthresh: [1] 10  - prefilter: [1]   3 100  - mzCenterFun: [1] \"wMean\"  - integrate: [1] 1  - mzdiff: [1] -0.001  - fitgauss: [1] FALSE  - noise: [1] 0  - verboseColumns: [1] FALSE  - roiList: list()  - firstBaselineCheck: [1] TRUE  - roiScales: numeric(0)  - extendLengthMSW: [1] FALSE  - verboseBetaColumns: [1] FALSE #' Evaluate for Cystine cystine_test <- findChromPeaks(eic_cystine, param = param) chromPeaks(cystine_test) rt rtmin rtmax into intb maxo sn row column #' Evaluate for Methionine met_test <- findChromPeaks(eic_met, param = param) chromPeaks(met_test) rt rtmin rtmax into intb maxo sn row column #' Restrict the data to signal from cystine in the first sample cst <- lcms1[1L] |>   spectra() |>   filterRt(rt = c(208, 218)) |>   filterMzRange(mz = fData(eic_cystine)[\"cystine_13C_15N\", c(\"mzmin\", \"mzmax\")])  #' Show the number of peaks per m/z filtered spectra lengths(cst) [1] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 #' Calculate the difference in m/z values between scans mz_diff <- cst |>     mz() |>     unlist() |>     diff() |>     abs()  #' Express differences in ppm range(mz_diff * 1e6 / mean(unlist(mz(cst)))) [1]  0.08829605 14.82188728 #' Parameters adapted for chromatographic peak detection on EICs. param <- CentWaveParam(peakwidth = c(1, 8), ppm = 15, integrate = 2,                        snthresh = 2)  #' Evaluate on the cystine ion cystine_test <- findChromPeaks(eic_cystine, param = param) chromPeaks(cystine_test) rt   rtmin   rtmax      into      intb      maxo sn row column  [1,] 209.251 207.577 212.878  4085.675  2911.376  2157.459  4   1      1  [2,] 209.251 206.182 213.995 24625.728 19074.407 12907.487  4   1      2  [3,] 209.252 207.020 214.274 19467.836 14594.041  9996.466  4   1      3  [4,] 209.251 207.577 212.041  4648.229  3202.617  2458.485  3   1      4  [5,] 208.974 206.184 213.159 23801.825 18126.978 11300.289  3   1      5  [6,] 209.250 207.018 213.714 25990.327 21036.768 13650.329  5   1      6  [7,] 209.252 207.857 212.879  4528.767  3259.039  2445.841  4   1      7  [8,] 209.252 207.299 213.995 23119.449 17274.140 12153.410  4   1      8  [9,] 208.972 206.740 212.878 28943.188 23436.119 14451.023  4   1      9 [10,] 209.252 207.578 213.437  4470.552  3065.402  2292.881  4   1     10 #' Evaluate on the methionine ion met_test <- findChromPeaks(eic_met, param = param) chromPeaks(met_test) rt   rtmin   rtmax     into     intb      maxo sn row column  [1,] 159.867 157.913 162.378 20026.61 14715.42 12555.601  4   1      1  [2,] 160.425 157.077 163.215 16827.76 11843.39  8407.699  3   1      2  [3,] 160.425 157.356 163.215 18262.45 12881.67  9283.375  3   1      3  [4,] 159.588 157.635 161.820 20987.72 15424.25 13327.811  4   1      4  [5,] 160.985 156.799 163.217 16601.72 11968.46 10012.396  4   1      5  [6,] 160.982 157.634 163.214 17243.24 12389.94  9150.079  4   1      6  [7,] 159.867 158.193 162.099 21120.10 16202.05 13531.844  3   1      7  [8,] 160.426 157.356 162.937 18937.40 13739.73 10336.000  3   1      8  [9,] 160.704 158.472 163.215 17882.21 12299.43  9395.548  3   1      9 [10,] 160.146 157.914 162.379 20275.80 14279.50 12669.821  3   1     10 #' Using the same settings, but with default snthresh param <- CentWaveParam(peakwidth = c(1, 8), ppm = 15, integrate = 2) lcms1 <- findChromPeaks(lcms1, param = param, chunkSize = 5)  #' Update EIC internal standard object eics_is_noprocess <- eic_is eic_is <- chromatogram(lcms1,,                        rt = as.matrix(intern_standard[, c(\"rtmin\", \"rtmax\")]),                        mz = as.matrix(intern_standard[, c(\"mzmin\", \"mzmax\")])) Processing chromatographic peaks fData(eic_is) <- fData(eics_is_noprocess) Processing chromatographic peaks #' set up the parameter param <- MergeNeighboringPeaksParam(expandRt = 2.5, expandMz = 0.0015,                                     minProp = 0.75)  #' Perform the peak refinement on the EICs eics <- refineChromPeaks(eics, param = param) plot(eics) #' Apply on whole dataset lcms1 <- refineChromPeaks(lcms1, param = param, chunkSize = 5) Reduced from 106714 to 89182 chromatographic peaks. chromPeakData(lcms1)$merged |>                       table() FALSE  TRUE 79908  9274 eics_is_chrompeaks <- eic_is  eic_is <- chromatogram(lcms1,                        rt = as.matrix(intern_standard[, c(\"rtmin\", \"rtmax\")]),                        mz = as.matrix(intern_standard[, c(\"mzmin\", \"mzmax\")])) Processing chromatographic peaks fData(eic_is) <- fData(eics_is_chrompeaks)  eic_cystine <- eic_is[\"cystine_13C_15N\", ] eic_met <- eic_is[\"methionine_13C_15N\", ] #' Count the number of peaks per sample and summarize them in a table. data.frame(sample_name = sampleData(lcms1)$sample_name,            peak_count = as.integer(table(chromPeaks(lcms1)[, \"sample\"]))) |>     kable(format = \"pipe\") #' Get QC samples QC_samples <- sampleData(lcms1)$phenotype == \"QC\"  #' extract BPC lcms1[QC_samples] |>     chromatogram(aggregationFun = \"max\", chromPeaks = \"none\") |>     plot(col = col_phenotype[\"QC\"], main = \"BPC of QC samples\") |>     grid() # Initial correspondence analysis param <- PeakDensityParam(sampleGroups = sampleData(lcms1)$phenotype == \"QC\",                           minFraction = 0.9,                           binSize = 0.01, ppm = 10,                           bw = 2) lcms1 <- groupChromPeaks(lcms1, param = param)  plotChromPeakDensity(     eic_cystine, param = param,     col = paste0(col_sample, \"80\"),     peakCol = col_sample[chromPeaks(eic_cystine)[, \"sample\"]],     peakBg = paste0(col_sample[chromPeaks(eic_cystine)[, \"sample\"]], 20),     peakPch = 16) #' Define parameters of choice subset <- which(sampleData(lcms1)$phenotype == \"QC\") param <- PeakGroupsParam(minFraction = 0.9, extraPeaks = 50, span = 0.5,                          subsetAdjust = \"average\",                          subset = subset)  #' Perform the alignment lcms1 <- adjustRtime(lcms1, param = param) Performing retention time correction using 5373 peak groups. Aligning sample number 2 against subset ... OK Aligning sample number 3 against subset ... OK Aligning sample number 5 against subset ... OK Aligning sample number 6 against subset ... OK Aligning sample number 8 against subset ... OK Aligning sample number 9 against subset ... OK #' Visualize alignment results plotAdjustedRtime(lcms1, col = paste0(col_sample, 80), peakGroupsPch = 1) grid() legend(\"topright\", col = col_phenotype,        legend = names(col_phenotype), lty = 1, bty = \"n\") #' Get data before alignment lcms1_raw <- dropAdjustedRtime(lcms1)  #' Apply the adjusted retention time to our dataset lcms1 <- applyAdjustedRtime(lcms1) #' Plot the BPC before and after alignment par(mfrow = c(2, 1), mar = c(2, 1, 1, 0.5)) chromatogram(lcms1_raw, aggregationFun = \"max\", chromPeaks = \"none\") |>     plot(main = \"BPC before alignment\", col = paste0(col_sample, 80)) grid() legend(\"topright\", col = col_phenotype,        legend = names(col_phenotype), lty = 1, bty = \"n\", horiz = TRUE)  chromatogram(lcms1, aggregationFun = \"max\", chromPeaks = \"none\") |>     plot(main = \"BPC after alignment\",          col = paste0(col_sample, 80)) grid() legend(\"topright\", col = col_phenotype,        legend = names(col_phenotype), lty = 1, bty = \"n\", horiz = TRUE) #' Store the EICs before alignment eics_is_refined <- eic_is  #' Update the EICs eic_is <- chromatogram(lcms1,                        rt = as.matrix(intern_standard[, c(\"rtmin\", \"rtmax\")]),                        mz = as.matrix(intern_standard[, c(\"mzmin\", \"mzmax\")])) Processing chromatographic peaks fData(eic_is) <- fData(eics_is_refined)  #' Extract the EICs for the test ions eic_cystine <- eic_is[\"cystine_13C_15N\"] eic_met <- eic_is[\"methionine_13C_15N\"] par(mfrow = c(2, 2), mar = c(4, 4.5, 2, 1))  old_eic_cystine <- eics_is_refined[\"cystine_13C_15N\"] plot(old_eic_cystine, main = \"Cystine before alignment\", peakType = \"none\",      col = paste0(col_sample, 80)) grid() abline(v = intern_standard[\"cystine_13C_15N\", \"RT\"], col = \"red\", lty = 3)  old_eic_met <- eics_is_refined[\"methionine_13C_15N\"] plot(old_eic_met, main = \"Methionine before alignment\",      peakType = \"none\", col = paste0(col_sample, 80)) grid() abline(v = intern_standard[\"methionine_13C_15N\", \"RT\"], col = \"red\", lty = 3)  plot(eic_cystine, main = \"Cystine after alignment\", peakType = \"none\",      col = paste0(col_sample, 80)) grid() abline(v = intern_standard[\"cystine_13C_15N\", \"RT\"], col = \"red\", lty = 3) legend(\"topright\", col = col_phenotype,        legend = names(col_phenotype), lty = 1, bty = \"n\")  plot(eic_met, main = \"Methionine after alignment\",      peakType = \"none\", col = paste0(col_sample, 80)) grid() abline(v = intern_standard[\"methionine_13C_15N\", \"RT\"], col = \"red\", lty = 3) #' Extract the matrix with all chromatographic peaks and add a column #' with the ID of the chromatographic peak chrom_peaks <- chromPeaks(lcms1) |> as.data.frame() chrom_peaks$peak_id <- rownames(chrom_peaks)  #' Define the parameters for the matching and filtering of the matches p_1 <- MzRtParam(ppm = 50, toleranceRt = 10) p_2 <- SingleMatchParam(duplicates = \"top_ranked\", column = \"target_maxo\",                         decreasing = TRUE)  #' Iterate over samples and identify for each the chromatographic peaks #' with similar m/z and retention time than the onse from the internal #' standard, and extract among them the ID of the peaks with the #' highest intensity. intern_standard_peaks <- lapply(seq_along(lcms1), function(i) {     tmp <- chrom_peaks[chrom_peaks[, \"sample\"] == i, , drop = FALSE]     mtch <- matchValues(intern_standard, tmp,                         mzColname = c(\"mz\", \"mz\"),                         rtColname = c(\"RT\", \"rt\"),                         param = p_1)     mtch <- filterMatches(mtch, p_2)     mtch$target_peak_id }) |>     do.call(what = cbind) #' Define the index of the selected chromatographic peaks in the #' full chromPeaks matrix idx <- match(intern_standard_peaks, rownames(chromPeaks(lcms1)))  #' Extract the raw retention times for these rt_raw <- chromPeaks(lcms1_raw)[idx, \"rt\"] |>     matrix(ncol = length(lcms1_raw))  #' Extract the adjusted retention times for these rt_adj <- chromPeaks(lcms1)[idx, \"rt\"] |>     matrix(ncol = length(lcms1_raw)) list(all_raw = rowSds(rt_raw, na.rm = TRUE),      all_adj = rowSds(rt_adj, na.rm = TRUE)      ) |>     vioplot(ylab = \"sd(retention time)\") grid() #' Default parameter for the grouping and apply them to the test ions BPC param <- PeakDensityParam(sampleGroups = sampleData(lcms1)$phenotype, bw = 30)  param Object of class:  PeakDensityParam  Parameters:  - sampleGroups:  [1] \"QC\"  \"CVD\" \"CTR\" \"QC\"  \"CTR\" \"CVD\" \"QC\"  \"CTR\" \"CVD\" \"QC\"  - bw: [1] 30  - minFraction: [1] 0.5  - minSamples: [1] 1  - binSize: [1] 0.25  - maxFeatures: [1] 50  - ppm: [1] 0 plotChromPeakDensity(     eic_cystine, param = param,     col = paste0(col_sample, \"80\"),     peakCol = col_sample[chromPeaks(eic_cystine)[, \"sample\"]],     peakBg = paste0(col_sample[chromPeaks(eic_cystine)[, \"sample\"]], 20),     peakPch = 16) plotChromPeakDensity(eic_met, param = param,     col = paste0(col_sample, \"80\"),     peakCol = col_sample[chromPeaks(eic_met)[, \"sample\"]],     peakBg = paste0(col_sample[chromPeaks(eic_met)[, \"sample\"]], 20),     peakPch = 16) #' Updating parameters param <- PeakDensityParam(sampleGroups = sampleData(lcms1)$phenotype, bw = 1.8)  plotChromPeakDensity(     eic_cystine, param = param,     col = paste0(col_sample, \"80\"),     peakCol = col_sample[chromPeaks(eic_cystine)[, \"sample\"]],     peakBg = paste0(col_sample[chromPeaks(eic_cystine)[, \"sample\"]], 20),     peakPch = 16) plotChromPeakDensity(eic_met, param = param,     col = paste0(col_sample, \"80\"),     peakCol = col_sample[chromPeaks(eic_met)[, \"sample\"]],     peakBg = paste0(col_sample[chromPeaks(eic_met)[, \"sample\"]], 20),     peakPch = 16) #' Define the settings for the param param <- PeakDensityParam(sampleGroups = sampleData(lcms1)$phenotype,                           minFraction = 0.75, binSize = 0.01, ppm = 10,                           bw = 1.8)  #' Apply to whole data lcms1 <- groupChromPeaks(lcms1, param = param) #' Extract chromatogram for an m/z similar to the one of the labeled methionine chr_test <- chromatogram(lcms1,                          mz = as.matrix(intern_standard[\"methionine_13C_15N\",                                                         c(\"mzmin\", \"mzmax\")]),                          rt = c(145, 200),                          aggregationFun = \"max\") Processing chromatographic peaks Processing features plotChromPeakDensity(     chr_test, simulate = FALSE,     col = paste0(col_sample, \"80\"),     peakCol = col_sample[chromPeaks(chr_test)[, \"sample\"]],     peakBg = paste0(col_sample[chromPeaks(chr_test)[, \"sample\"]], 20),     peakPch = 16) # Bin features per RT slices vc <- featureDefinitions(lcms1)$rtmed breaks <- seq(0, max(vc, na.rm = TRUE) + 1, length.out = 15) |>     round(0) cuts <- cut(vc, breaks = breaks, include.lowest = TRUE)  table(cuts) |>     kable(format = \"pipe\") #' Definition of the features featureDefinitions(lcms1) |>   head() mzmed    mzmin    mzmax    rtmed    rtmin    rtmax npeaks CTR CVD QC FT0001 50.98979 50.98949 50.99038 203.6001 203.1181 204.2331      8   1   3  4 FT0002 51.05904 51.05880 51.05941 191.1675 190.8787 191.5050      9   2   3  4 FT0003 51.98657 51.98631 51.98699 203.1467 202.6406 203.6710      7   0   3  4 FT0004 53.02036 53.02009 53.02043 203.2343 202.5652 204.0901     10   3   3  4 FT0005 53.52080 53.52051 53.52102 203.1936 202.8490 204.0901     10   3   3  4 FT0006 54.01007 54.00988 54.01015 159.2816 158.8499 159.4484      6   1   3  2             peakidx ms_level FT0001 7702, 16....        1 FT0002 7176, 16....        1 FT0003 7680, 17....        1 FT0004 7763, 17....        1 FT0005 8353, 17....        1 FT0006 5800, 15....        1 #' Extract feature abundances featureValues(lcms1, method = \"sum\") |>     head() MS_QC_POOL_1_POS.mzML MS_A_POS.mzML MS_B_POS.mzML MS_QC_POOL_2_POS.mzML FT0001              421.6162      689.2422            NA              481.7436 FT0002              710.8078      875.9192            NA              693.6997 FT0003              445.5711      613.4410            NA              497.8866 FT0004            16994.5260    24605.7340     19766.707            17808.0933 FT0005             3284.2664     4526.0531      3521.822             3379.8909 FT0006            10681.7476    10009.6602            NA            10800.5449        MS_C_POS.mzML MS_D_POS.mzML MS_QC_POOL_3_POS.mzML MS_E_POS.mzML FT0001            NA      635.2732              439.6086      570.5849 FT0002      781.2416      648.4344              700.9716     1054.0207 FT0003            NA      634.9370              449.0933            NA FT0004    22780.6683    22873.1061            16965.7762    23432.1252 FT0005     4396.0762     4317.7734             3270.5290     4533.8667 FT0006            NA     7296.4262                    NA     9236.9799        MS_F_POS.mzML MS_QC_POOL_4_POS.mzML FT0001      579.9360              437.0340 FT0002      534.4577              711.0361 FT0003      461.0465              232.1075 FT0004    22198.4607            16796.4497 FT0005     4161.0132             3142.2268 FT0006     6817.8785                    NA #' Percentage of missing values sum(is.na(featureValues(lcms1))) /     length(featureValues(lcms1)) * 100 [1] 26.41597 ftidx <- which(is.na(rowSums(featureValues(lcms1)))) fts <- rownames(featureDefinitions(lcms1))[ftidx] farea <- featureArea(lcms1, features = fts[1:2])  chromatogram(lcms1[c(2, 3)],              rt = farea[, c(\"rtmin\", \"rtmax\")],              mz = farea[, c(\"mzmin\", \"mzmax\")]) |>     plot(col = c(\"red\", \"blue\"), lwd = 2) Processing chromatographic peaks #' Fill in the missing values in the whole dataset lcms1 <- fillChromPeaks(lcms1, param = ChromPeakAreaParam(), chunkSize = 5)  #' Percentage of missing values after gap-filling sum(is.na(featureValues(lcms1))) /     length(featureValues(lcms1)) * 100 [1] 5.155492 Processing chromatographic peaks #' Get only detected signal in QC samples vals_detect <- featureValues(lcms1, filled = FALSE)[, QC_samples]  #' Get detected and filled-in signal vals_filled <- featureValues(lcms1)[, QC_samples]  #' Replace detected signal with NA vals_filled[!is.na(vals_detect)] <- NA  #' Identify features with at least one filled peak has_filled <- is.na(rowSums(vals_detect))  #' Calculate row averages for features with missing values avg_detect <- rowMeans(vals_detect[has_filled, ], na.rm = TRUE) avg_filled <- rowMeans(vals_filled[has_filled, ], na.rm = TRUE)  #' Plot the values against each other (in log2 scale) plot(log2(avg_detect), log2(avg_filled),      xlim = range(log2(c(avg_detect, avg_filled)), na.rm = TRUE),      ylim = range(log2(c(avg_detect, avg_filled)), na.rm = TRUE),      pch = 21, bg = \"#00000020\", col = \"#00000080\") grid() abline(0, 1) #' fit a linear regression line to the data l <- lm(log2(avg_filled) ~ log2(avg_detect)) summary(l) Call: lm(formula = log2(avg_filled) ~ log2(avg_detect))  Residuals:     Min      1Q  Median      3Q     Max -6.8176 -0.3807  0.1725  0.5492  6.7504  Coefficients:                  Estimate Std. Error t value Pr(>|t|) (Intercept)      -1.62359    0.11545  -14.06   <2e-16 *** log2(avg_detect)  1.11763    0.01259   88.75   <2e-16 *** --- Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1  Residual standard error: 0.9366 on 2846 degrees of freedom   (846 observations deleted due to missingness) Multiple R-squared:  0.7346,    Adjusted R-squared:  0.7345 F-statistic:  7877 on 1 and 2846 DF,  p-value: < 2.2e-16 #' Check first step of the process history processHistory(lcms1)[[1]] Object of class \"XProcessHistory\"  type: Peak detection  date: Mon Oct 21 23:01:56 2024  info:  fileIndex: 1,2,3,4,5,6,7,8,9,10  Parameter class: CentWaveParam  MS level(s) 1 #' Extract results as a SummarizedExperiment res <- quantify(lcms1, method = \"sum\", filled = FALSE) res class: SummarizedExperiment dim: 9068 10 metadata(6): '' '' ... '' '' assays(1): raw rownames(9068): FT0001 FT0002 ... FT9067 FT9068 rowData names(11): mzmed mzmin ... QC ms_level colnames(10): MS_QC_POOL_1_POS.mzML MS_A_POS.mzML ... MS_F_POS.mzML   MS_QC_POOL_4_POS.mzML colData names(11): sample_name derived_spectra_data_file ... phenotype   injection_index assays(res)$raw_filled <- featureValues(lcms1, method = \"sum\",                                         filled = TRUE )  #' Different assay in the SummarizedExperiment object assayNames(res) [1] \"raw\"        \"raw_filled\" assay(res, \"raw_filled\") |> head() MS_QC_POOL_1_POS.mzML MS_A_POS.mzML MS_B_POS.mzML MS_QC_POOL_2_POS.mzML FT0001              421.6162      689.2422      411.3295              481.7436 FT0002              710.8078      875.9192      457.5920              693.6997 FT0003              445.5711      613.4410      277.5022              497.8866 FT0004            16994.5260    24605.7340    19766.7069            17808.0933 FT0005             3284.2664     4526.0531     3521.8221             3379.8909 FT0006            10681.7476    10009.6602     9599.9701            10800.5449        MS_C_POS.mzML MS_D_POS.mzML MS_QC_POOL_3_POS.mzML MS_E_POS.mzML FT0001      314.7567      635.2732              439.6086      570.5849 FT0002      781.2416      648.4344              700.9716     1054.0207 FT0003      425.3774      634.9370              449.0933      556.2544 FT0004    22780.6683    22873.1061            16965.7762    23432.1252 FT0005     4396.0762     4317.7734             3270.5290     4533.8667 FT0006     4792.2390     7296.4262             2382.1788     9236.9799        MS_F_POS.mzML MS_QC_POOL_4_POS.mzML FT0001      579.9360              437.0340 FT0002      534.4577              711.0361 FT0003      461.0465              232.1075 FT0004    22198.4607            16796.4497 FT0005     4161.0132             3142.2268 FT0006     6817.8785             6911.5439 res[1:14, 3:8] class: SummarizedExperiment dim: 14 6 metadata(6): '' '' ... '' '' assays(2): raw raw_filled rownames(14): FT0001 FT0002 ... FT0013 FT0014 rowData names(11): mzmed mzmin ... QC ms_level colnames(6): MS_B_POS.mzML MS_QC_POOL_2_POS.mzML ...   MS_QC_POOL_3_POS.mzML MS_E_POS.mzML colData names(11): sample_name derived_spectra_data_file ... phenotype   injection_index #' Save the preprocessing results #' d <- file.path(tempdir(), \"objects/lcms1\") # saveMsObject(lcms1, AlabasterParam(path = d)) #' for now let's do R object because the previous method is not implemented yet. save(lcms1, file = \"preprocessed_lcms1.RData\")"},{"path":"https://rformassspectrometry.github.io/metabonaut/articles/a-end-to-end-untargeted-metabolomics.html","id":"chromatographic-peak-detection","dir":"Articles","previous_headings":"","what":"Chromatographic peak detection","title":"Complete end-to-end LC-MS/MS Metabolomic Data analysis","text":"initial preprocessing step involves detecting intensity peaks along retention time axis, called chromatographic peaks. achieve , employ findChromPeaks() function within xcms. function supports various algorithms peak detection, can selected configured respective parameter objects. preferred algorithm case, CentWave, utilizes continuous wavelet transformation (CWT)-based peak detection [@tautenhahn_highly_2008]. method known effectiveness handling non-Gaussian shaped chromatographic peaks peaks varying retention time widths, commonly encountered HILIC separations. apply CentWave algorithm default settings extracted ion chromatogram cystine methionine ions evaluate results. CentWave highly performant algorithm, requires costumized dataset. implies parameters fine-tuned based user’s data. example serves clear motivation users familiarize various parameters need adapt data set. discuss main parameters can easily adjusted suit user’s dataset: peakwidth: Specifies minimal maximal expected width peaks retention time dimension. Highly dependent chromatographic settings used. ppm: maximal allowed difference mass peaks’ m/z values (parts-per-million) consecutive scans consider representing signal ion. integrate: parameter defines integration method. , primarily use integrate = 2 integrates also signal chromatographic peak’s tail considered accurate developers. determine peakwidth, recommend users refer previous EICs estimate range peak widths observe dataset. Ideally, examining multiple EICs goal. dataset, peak widths appear around 2 10 seconds. advise choosing range wide narrow peakwidth parameter can lead false positives negatives. determine ppm, deeper analysis dataset needed. clarified ppm depends instrument, users necessarily input vendor-advertised ppm. ’s determine accurately possible: following steps involve generating highly restricted MS area single mass peak per spectrum, representing cystine ion. m/z peaks extracted, absolute difference calculated finally expressed ppm. therefore, choose value close maximum within range parameter ppm, .e., 15 ppm. can now perform chromatographic peak detection adapted settings EICs. important note , properly estimate background noise, sufficient data points outside chromatographic peak need present. generally problem peak detection performed full LC-MS data set, peak detection EICs retention time range EIC needs sufficiently wide. function fails find peak EIC, initial troubleshooting step increase range. Additionally, signal--noise threshold snthresh reduced peak detection EICs, within small retention time range, enough signal present properly estimate background noise. Finally, case MS1 data points per peaks, setting CentWave’s advanced parameter extendLengthMSW TRUE can help peak detection. customized parameters, chromatographic peak detected sample. , use plot() function EICs visualize results.  Figure 11. Chromatographic peak detection EICs. can see peak seems ot detected sample ions. indicates custom settings seem thus suitable dataset. now proceed apply entire dataset, extracting EICs ions evaluate confirm chromatographic peak detection worked expected. Note: revert value parameter snthresh default, , mentioned , background noise estimation reliable performed full data set. Parameter chunkSize findChromPeaks() defines number data files loaded memory processed simultaneously. parameter thus allows fine-tune memory demand well performance chromatographic peak detection step. plot EICs two selected internal standards evaluate chromatographic peak detection results.  Figure 12. Chromatographic peak detection EICs processing. Peaks seem detected properly samples ions. indicates peak detection process entire dataset successful. identification chromatographic peaks using CentWave algorithm can sometimes result artifacts, overlapping split peaks. address issue, refineChromPeaks() function utilized, conjunction MergeNeighboringPeaksParam, aims merging split peaks. show examples CentWave peak detection artifacts. examples pre-selected illustrate necessity next step:  Figure 13. Examples CentWave peak detection artifacts. cases signal presumably single type ion split two separate chromatographic peaks (indicated vertical line). MergeNeigboringPeaksParam allows combine split peaks. parameters algorithm defined : expandMz: Suggested kept relatively small (0.0015) prevent merging isotopes. expandRt: Usually set approximately half size average retention time width used chromatographic peak detection (case, 2.5 seconds). minProp: Used determine whether candidates merged. Chromatographic peaks overlapping m/z ranges (expanded side expandMz) tail--head distance retention time dimension less 2 * expandRt, signal higher minProp apex intensity chromatographic peak lower intensity, merged. Values parameter small avoid merging closely co-eluting ions, isomers. test settings EICs split peaks.  Figure 14. Examples CentWave peak detection artifacts merging. can observe artificially split peaks appropriately merged. Therefore, next apply settings entire dataset. peak merging, column \"merged\" result object’s chromPeakData() data frame can used evaluate chromatographic peaks result represent signal merged, originally identified chromatographic peaks. proceeding next preprocessing step generally suggested evaluate results chromatographic peak detection EICs e.g. internal standards compounds/ions known present samples. Additionally, evaluating comparing number identified chromatographic peaks samples data set can help spotting potentially problematic samples. count number chromatographic peaks per sample show numbers table. Table 5. Samples number identified chromatographic peaks. similar number chromatographic peaks identified within various samples data set. Additional options evaluate results chromatographic peak detection can implemented using plotChromPeaks() function summarizing results using base R commands.","code":"#' Use default Centwave parameter param <- CentWaveParam()  #' Look at the default parameters param Object of class:  CentWaveParam  Parameters:  - ppm: [1] 25  - peakwidth: [1] 20 50  - snthresh: [1] 10  - prefilter: [1]   3 100  - mzCenterFun: [1] \"wMean\"  - integrate: [1] 1  - mzdiff: [1] -0.001  - fitgauss: [1] FALSE  - noise: [1] 0  - verboseColumns: [1] FALSE  - roiList: list()  - firstBaselineCheck: [1] TRUE  - roiScales: numeric(0)  - extendLengthMSW: [1] FALSE  - verboseBetaColumns: [1] FALSE #' Evaluate for Cystine cystine_test <- findChromPeaks(eic_cystine, param = param) chromPeaks(cystine_test) rt rtmin rtmax into intb maxo sn row column #' Evaluate for Methionine met_test <- findChromPeaks(eic_met, param = param) chromPeaks(met_test) rt rtmin rtmax into intb maxo sn row column #' Restrict the data to signal from cystine in the first sample cst <- lcms1[1L] |>   spectra() |>   filterRt(rt = c(208, 218)) |>   filterMzRange(mz = fData(eic_cystine)[\"cystine_13C_15N\", c(\"mzmin\", \"mzmax\")])  #' Show the number of peaks per m/z filtered spectra lengths(cst) [1] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 #' Calculate the difference in m/z values between scans mz_diff <- cst |>     mz() |>     unlist() |>     diff() |>     abs()  #' Express differences in ppm range(mz_diff * 1e6 / mean(unlist(mz(cst)))) [1]  0.08829605 14.82188728 #' Parameters adapted for chromatographic peak detection on EICs. param <- CentWaveParam(peakwidth = c(1, 8), ppm = 15, integrate = 2,                        snthresh = 2)  #' Evaluate on the cystine ion cystine_test <- findChromPeaks(eic_cystine, param = param) chromPeaks(cystine_test) rt   rtmin   rtmax      into      intb      maxo sn row column  [1,] 209.251 207.577 212.878  4085.675  2911.376  2157.459  4   1      1  [2,] 209.251 206.182 213.995 24625.728 19074.407 12907.487  4   1      2  [3,] 209.252 207.020 214.274 19467.836 14594.041  9996.466  4   1      3  [4,] 209.251 207.577 212.041  4648.229  3202.617  2458.485  3   1      4  [5,] 208.974 206.184 213.159 23801.825 18126.978 11300.289  3   1      5  [6,] 209.250 207.018 213.714 25990.327 21036.768 13650.329  5   1      6  [7,] 209.252 207.857 212.879  4528.767  3259.039  2445.841  4   1      7  [8,] 209.252 207.299 213.995 23119.449 17274.140 12153.410  4   1      8  [9,] 208.972 206.740 212.878 28943.188 23436.119 14451.023  4   1      9 [10,] 209.252 207.578 213.437  4470.552  3065.402  2292.881  4   1     10 #' Evaluate on the methionine ion met_test <- findChromPeaks(eic_met, param = param) chromPeaks(met_test) rt   rtmin   rtmax     into     intb      maxo sn row column  [1,] 159.867 157.913 162.378 20026.61 14715.42 12555.601  4   1      1  [2,] 160.425 157.077 163.215 16827.76 11843.39  8407.699  3   1      2  [3,] 160.425 157.356 163.215 18262.45 12881.67  9283.375  3   1      3  [4,] 159.588 157.635 161.820 20987.72 15424.25 13327.811  4   1      4  [5,] 160.985 156.799 163.217 16601.72 11968.46 10012.396  4   1      5  [6,] 160.982 157.634 163.214 17243.24 12389.94  9150.079  4   1      6  [7,] 159.867 158.193 162.099 21120.10 16202.05 13531.844  3   1      7  [8,] 160.426 157.356 162.937 18937.40 13739.73 10336.000  3   1      8  [9,] 160.704 158.472 163.215 17882.21 12299.43  9395.548  3   1      9 [10,] 160.146 157.914 162.379 20275.80 14279.50 12669.821  3   1     10 #' Using the same settings, but with default snthresh param <- CentWaveParam(peakwidth = c(1, 8), ppm = 15, integrate = 2) lcms1 <- findChromPeaks(lcms1, param = param, chunkSize = 5)  #' Update EIC internal standard object eics_is_noprocess <- eic_is eic_is <- chromatogram(lcms1,,                        rt = as.matrix(intern_standard[, c(\"rtmin\", \"rtmax\")]),                        mz = as.matrix(intern_standard[, c(\"mzmin\", \"mzmax\")])) Processing chromatographic peaks fData(eic_is) <- fData(eics_is_noprocess) Processing chromatographic peaks #' set up the parameter param <- MergeNeighboringPeaksParam(expandRt = 2.5, expandMz = 0.0015,                                     minProp = 0.75)  #' Perform the peak refinement on the EICs eics <- refineChromPeaks(eics, param = param) plot(eics) #' Apply on whole dataset lcms1 <- refineChromPeaks(lcms1, param = param, chunkSize = 5) Reduced from 106714 to 89182 chromatographic peaks. chromPeakData(lcms1)$merged |>                       table() FALSE  TRUE 79908  9274 eics_is_chrompeaks <- eic_is  eic_is <- chromatogram(lcms1,                        rt = as.matrix(intern_standard[, c(\"rtmin\", \"rtmax\")]),                        mz = as.matrix(intern_standard[, c(\"mzmin\", \"mzmax\")])) Processing chromatographic peaks fData(eic_is) <- fData(eics_is_chrompeaks)  eic_cystine <- eic_is[\"cystine_13C_15N\", ] eic_met <- eic_is[\"methionine_13C_15N\", ] #' Count the number of peaks per sample and summarize them in a table. data.frame(sample_name = sampleData(lcms1)$sample_name,            peak_count = as.integer(table(chromPeaks(lcms1)[, \"sample\"]))) |>     kable(format = \"pipe\")"},{"path":"https://rformassspectrometry.github.io/metabonaut/articles/a-end-to-end-untargeted-metabolomics.html","id":"refine-identified-chromatographic-peaks","dir":"Articles","previous_headings":"Data preprocessing","what":"Refine identified chromatographic peaks","title":"Complete end-to-end LC-MS/MS Metabolomic Data analysis","text":"identification chromatographic peaks using CentWave algorithm can sometimes result artifacts, overlapping split peaks. address issue, refineChromPeaks() function utilized, conjunction MergeNeighboringPeaksParam, aims merging split peaks. show examples CentWave peak detection artifacts. examples pre-selected illustrate necessity next step:  Figure 13. Examples CentWave peak detection artifacts. cases signal presumably single type ion split two separate chromatographic peaks (indicated vertical line). MergeNeigboringPeaksParam allows combine split peaks. parameters algorithm defined : expandMz: Suggested kept relatively small (0.0015) prevent merging isotopes. expandRt: Usually set approximately half size average retention time width used chromatographic peak detection (case, 2.5 seconds). minProp: Used determine whether candidates merged. Chromatographic peaks overlapping m/z ranges (expanded side expandMz) tail--head distance retention time dimension less 2 * expandRt, signal higher minProp apex intensity chromatographic peak lower intensity, merged. Values parameter small avoid merging closely co-eluting ions, isomers. test settings EICs split peaks.  Figure 14. Examples CentWave peak detection artifacts merging. can observe artificially split peaks appropriately merged. Therefore, next apply settings entire dataset. peak merging, column \"merged\" result object’s chromPeakData() data frame can used evaluate chromatographic peaks result represent signal merged, originally identified chromatographic peaks. proceeding next preprocessing step generally suggested evaluate results chromatographic peak detection EICs e.g. internal standards compounds/ions known present samples. Additionally, evaluating comparing number identified chromatographic peaks samples data set can help spotting potentially problematic samples. count number chromatographic peaks per sample show numbers table. Table 5. Samples number identified chromatographic peaks. similar number chromatographic peaks identified within various samples data set. Additional options evaluate results chromatographic peak detection can implemented using plotChromPeaks() function summarizing results using base R commands.","code":"Processing chromatographic peaks #' set up the parameter param <- MergeNeighboringPeaksParam(expandRt = 2.5, expandMz = 0.0015,                                     minProp = 0.75)  #' Perform the peak refinement on the EICs eics <- refineChromPeaks(eics, param = param) plot(eics) #' Apply on whole dataset lcms1 <- refineChromPeaks(lcms1, param = param, chunkSize = 5) Reduced from 106714 to 89182 chromatographic peaks. chromPeakData(lcms1)$merged |>                       table() FALSE  TRUE 79908  9274 eics_is_chrompeaks <- eic_is  eic_is <- chromatogram(lcms1,                        rt = as.matrix(intern_standard[, c(\"rtmin\", \"rtmax\")]),                        mz = as.matrix(intern_standard[, c(\"mzmin\", \"mzmax\")])) Processing chromatographic peaks fData(eic_is) <- fData(eics_is_chrompeaks)  eic_cystine <- eic_is[\"cystine_13C_15N\", ] eic_met <- eic_is[\"methionine_13C_15N\", ] #' Count the number of peaks per sample and summarize them in a table. data.frame(sample_name = sampleData(lcms1)$sample_name,            peak_count = as.integer(table(chromPeaks(lcms1)[, \"sample\"]))) |>     kable(format = \"pipe\")"},{"path":"https://rformassspectrometry.github.io/metabonaut/articles/a-end-to-end-untargeted-metabolomics.html","id":"retention-time-alignment","dir":"Articles","previous_headings":"","what":"Retention time alignment","title":"Complete end-to-end LC-MS/MS Metabolomic Data analysis","text":"Despite using chromatographic settings conditions retention time shifts unavoidable. Indeed, performance instrument can change time, example due small variations environmental conditions, temperature pressure. shifts generally small samples measured within batch/measurement run, can considerable data experiment acquired across longer time period. evaluate presence shift extract plot BPC QC samples.  Figure 15. BPC QC samples. QC samples representing sample (pool) measured regular intervals measurement run experiment measured day. Still, small shifts can observed, especially region 100 150 seconds. facilitate proper correspondence signals across samples (hence definition LC-MS features), essential minimize differences retention times. Theoretically, proceed two steps: first select QC samples dataset first alignment , using -called anchor peaks. way can assume linear shift time, since always measuring sample different regular time intervals. Despite external QCs data set, still use subset-based alignment assuming retention time shifts independent different sample matrix (human serum plasma) instead mostly instrument-dependent. Note also possible manually specify anchor peaks, respectively retention times align data set external, reference, data set. information provided vignettes xcms package. calculating much adjust retention time samples, apply shift also study samples. xcms retention time alignment can performed using adjustRtime() function alignment algorithm. example use PeakGroups method [@smith_xcms_2006] performs alignment minimizing differences retention times set anchor peaks different samples. method requires initial correspondence analysis match/group chromatographic peaks across samples algorithm selects anchor peaks alignment. initial correspondence, use PeakDensity approach [@smith_xcms_2006] groups chromatographic peaks similar m/z retention time LC-MS features. parameters algorithm, can configured using PeakDensityParam object, sampleGroups, minFraction, binSize, ppm bw. binSize, ppm bw allow specify similar chromatographic peaks’ m/z retention time values need consider grouping feature. binSize ppm define required similarity m/z values. Within m/z bin (defined binSize ppm) areas along retention time axis high chromatographic peak density (considering peaks samples) identified, chromatographic peaks within regions considered grouping feature. High density areas identified using base R density() function, bw parameter: higher values define wider retention time areas, lower values require chromatographic peaks similar retention times. parameter can seen black line plot , corresponding smoothness density curve. Whether candidate peaks get grouped feature depends also parameters sampleGroups minFraction: sampleGroups provide, sample, sample group belongs . minFraction expected value 0 1 defining proportion samples within least one sample groups (defined sampleGroups) chromatographic peaks detected group feature. initial correspondence, parameters don’t need fully optimized. Selection dataset-specific parameter values described detail next section. dataset, use small values binSize ppm , importantly, also parameter bw, since data set ultra high performance (UHP) LC setup used. minFraction use high value (0.9) ensure features defined chromatographic peaks present almost samples one sample group (can used anchor peaks actual alignment). base alignment later QC samples hence define sampleGroups binary variable grouping samples either study, QC group.  Figure 16. Initial correspondence analysis. PeakGroups-based alignment can next performed using adjustRtime() function PeakGroupsParam parameter object. parameters algorithm : subsetAdjust subset: Allows subset alignment. base retention time alignment QC samples, .e., retention time shifts estimated based repeatedly measured samples. resulting adjustment applied entire data. data sets QC samples (e.g. sample pools) measured repeatedly, strongly suggest use method. Note also subset-based alignment samples ordered injection index (.e., order measured measurement run). minFraction: value 0 1 defining proportion samples (full data set, data subset defined subset) chromatographic peak identified use anchor peak. contrast PeakDensityParam parameter used define proportion within sample group. span: PeakGroups method allows, depending data, adjust regions along retention time axis differently. enable local alignments LOESS function used parameter defines degree smoothing function. Generally, values 0.4 0.6 used, however, suggested evaluate alignment results eventually adapt parameters result satisfactory. perform alignment data set based retention times anchor peaks defined subset QC samples. Alignment adjusted retention times spectra data set, well retention times identified chromatographic peaks. alignment performed, user evaluate results using plotAdjustedRtime() function. function visualizes difference adjusted raw retention time sample y-axis along adjusted retention time x-axis. Dot points represent position used anchor peak along retention time axis. optimal alignment areas along retention time axis, anchor peaks scattered retention time dimension.  Figure 17. Retention time alignment results. samples present data set measured within measurement run, resulting small retention time shifts. Therefore, little adjustments needed performed (shifts maximum 1 second can seen plot ). Generally, magnitude adjustment seen plots match expectation analyst. can also compare BPC alignment. get original data, .e. raw retention times, can use dropAdjustedRtime() function:  Figure 18. BPC alignment. largest shift can observed retention time range 120 130s. Apart retention time range, little changes can observed. next evaluate impact alignment EICs selected internal standards. thus first extract ion chromatograms alignment. can now evaluate alignment effect test ions. plot EICs alignment isotope labeled cystine methionine.  Figure 19. EICs cystine methionine alignment. non-endogenous cystine ion already well aligned difference minimal. methionine ion, however, shows improvement alignment. addition visual inspection results, also evaluate impact alignment comparing variance retention times internal standards alignment. end, first need identify chromatographic peaks sample m/z retention time close expected values internal standard. use matchValues() function MetaboAnnotation package [@rainer_modular_2022] using MzRtParam method identify chromatographic peaks similar m/z (+/- 50 ppm) retention time (+/- 10 seconds) internal standard’s values. parameters mzColname rtColname specify column names query () target (chromatographic peaks) contain m/z retention time values match entities. perform matching separately sample. internal standard every sample, use filterMatches() function SingleMatchParam() parameter select chromatographic peak highest intensity. now internal standard ID chromatographic peak sample likely represents signal ion. can now extract retention times chromatographic peaks alignment. can now evaluate impact alignment retention times internal standards across full data set:  Figure 20. Retention time variation internal standards alignment. average, variation retention times internal standards across samples slightly reduced alignment.","code":"#' Get QC samples QC_samples <- sampleData(lcms1)$phenotype == \"QC\"  #' extract BPC lcms1[QC_samples] |>     chromatogram(aggregationFun = \"max\", chromPeaks = \"none\") |>     plot(col = col_phenotype[\"QC\"], main = \"BPC of QC samples\") |>     grid() # Initial correspondence analysis param <- PeakDensityParam(sampleGroups = sampleData(lcms1)$phenotype == \"QC\",                           minFraction = 0.9,                           binSize = 0.01, ppm = 10,                           bw = 2) lcms1 <- groupChromPeaks(lcms1, param = param)  plotChromPeakDensity(     eic_cystine, param = param,     col = paste0(col_sample, \"80\"),     peakCol = col_sample[chromPeaks(eic_cystine)[, \"sample\"]],     peakBg = paste0(col_sample[chromPeaks(eic_cystine)[, \"sample\"]], 20),     peakPch = 16) #' Define parameters of choice subset <- which(sampleData(lcms1)$phenotype == \"QC\") param <- PeakGroupsParam(minFraction = 0.9, extraPeaks = 50, span = 0.5,                          subsetAdjust = \"average\",                          subset = subset)  #' Perform the alignment lcms1 <- adjustRtime(lcms1, param = param) Performing retention time correction using 5373 peak groups. Aligning sample number 2 against subset ... OK Aligning sample number 3 against subset ... OK Aligning sample number 5 against subset ... OK Aligning sample number 6 against subset ... OK Aligning sample number 8 against subset ... OK Aligning sample number 9 against subset ... OK #' Visualize alignment results plotAdjustedRtime(lcms1, col = paste0(col_sample, 80), peakGroupsPch = 1) grid() legend(\"topright\", col = col_phenotype,        legend = names(col_phenotype), lty = 1, bty = \"n\") #' Get data before alignment lcms1_raw <- dropAdjustedRtime(lcms1)  #' Apply the adjusted retention time to our dataset lcms1 <- applyAdjustedRtime(lcms1) #' Plot the BPC before and after alignment par(mfrow = c(2, 1), mar = c(2, 1, 1, 0.5)) chromatogram(lcms1_raw, aggregationFun = \"max\", chromPeaks = \"none\") |>     plot(main = \"BPC before alignment\", col = paste0(col_sample, 80)) grid() legend(\"topright\", col = col_phenotype,        legend = names(col_phenotype), lty = 1, bty = \"n\", horiz = TRUE)  chromatogram(lcms1, aggregationFun = \"max\", chromPeaks = \"none\") |>     plot(main = \"BPC after alignment\",          col = paste0(col_sample, 80)) grid() legend(\"topright\", col = col_phenotype,        legend = names(col_phenotype), lty = 1, bty = \"n\", horiz = TRUE) #' Store the EICs before alignment eics_is_refined <- eic_is  #' Update the EICs eic_is <- chromatogram(lcms1,                        rt = as.matrix(intern_standard[, c(\"rtmin\", \"rtmax\")]),                        mz = as.matrix(intern_standard[, c(\"mzmin\", \"mzmax\")])) Processing chromatographic peaks fData(eic_is) <- fData(eics_is_refined)  #' Extract the EICs for the test ions eic_cystine <- eic_is[\"cystine_13C_15N\"] eic_met <- eic_is[\"methionine_13C_15N\"] par(mfrow = c(2, 2), mar = c(4, 4.5, 2, 1))  old_eic_cystine <- eics_is_refined[\"cystine_13C_15N\"] plot(old_eic_cystine, main = \"Cystine before alignment\", peakType = \"none\",      col = paste0(col_sample, 80)) grid() abline(v = intern_standard[\"cystine_13C_15N\", \"RT\"], col = \"red\", lty = 3)  old_eic_met <- eics_is_refined[\"methionine_13C_15N\"] plot(old_eic_met, main = \"Methionine before alignment\",      peakType = \"none\", col = paste0(col_sample, 80)) grid() abline(v = intern_standard[\"methionine_13C_15N\", \"RT\"], col = \"red\", lty = 3)  plot(eic_cystine, main = \"Cystine after alignment\", peakType = \"none\",      col = paste0(col_sample, 80)) grid() abline(v = intern_standard[\"cystine_13C_15N\", \"RT\"], col = \"red\", lty = 3) legend(\"topright\", col = col_phenotype,        legend = names(col_phenotype), lty = 1, bty = \"n\")  plot(eic_met, main = \"Methionine after alignment\",      peakType = \"none\", col = paste0(col_sample, 80)) grid() abline(v = intern_standard[\"methionine_13C_15N\", \"RT\"], col = \"red\", lty = 3) #' Extract the matrix with all chromatographic peaks and add a column #' with the ID of the chromatographic peak chrom_peaks <- chromPeaks(lcms1) |> as.data.frame() chrom_peaks$peak_id <- rownames(chrom_peaks)  #' Define the parameters for the matching and filtering of the matches p_1 <- MzRtParam(ppm = 50, toleranceRt = 10) p_2 <- SingleMatchParam(duplicates = \"top_ranked\", column = \"target_maxo\",                         decreasing = TRUE)  #' Iterate over samples and identify for each the chromatographic peaks #' with similar m/z and retention time than the onse from the internal #' standard, and extract among them the ID of the peaks with the #' highest intensity. intern_standard_peaks <- lapply(seq_along(lcms1), function(i) {     tmp <- chrom_peaks[chrom_peaks[, \"sample\"] == i, , drop = FALSE]     mtch <- matchValues(intern_standard, tmp,                         mzColname = c(\"mz\", \"mz\"),                         rtColname = c(\"RT\", \"rt\"),                         param = p_1)     mtch <- filterMatches(mtch, p_2)     mtch$target_peak_id }) |>     do.call(what = cbind) #' Define the index of the selected chromatographic peaks in the #' full chromPeaks matrix idx <- match(intern_standard_peaks, rownames(chromPeaks(lcms1)))  #' Extract the raw retention times for these rt_raw <- chromPeaks(lcms1_raw)[idx, \"rt\"] |>     matrix(ncol = length(lcms1_raw))  #' Extract the adjusted retention times for these rt_adj <- chromPeaks(lcms1)[idx, \"rt\"] |>     matrix(ncol = length(lcms1_raw)) list(all_raw = rowSds(rt_raw, na.rm = TRUE),      all_adj = rowSds(rt_adj, na.rm = TRUE)      ) |>     vioplot(ylab = \"sd(retention time)\") grid()"},{"path":"https://rformassspectrometry.github.io/metabonaut/articles/a-end-to-end-untargeted-metabolomics.html","id":"correspondence","dir":"Articles","previous_headings":"","what":"Correspondence","title":"Complete end-to-end LC-MS/MS Metabolomic Data analysis","text":"briefly touched subject correspondence determine anchor peaks alignment. Generally, goal correspondence analysis identify chromatographic peaks originate types ions samples experiment group LC-MS features. point, proper configuration parameter bw crucial. illustrate sensible choices parameter’s value can made. use plotChromPeakDensity() function simulate correspondence analysis default values PeakGroups extracted ion chromatograms two selected isotope labeled ions. plot shows EIC top panel, apex position chromatographic peaks different samples (y-axis), along retention time (x-axis) lower panel.  Figure 21. Initial correspondence analysis, Cystine.  Figure 22. Initial correspondence analysis, Methionine. Grouping peaks depends smoothness previousl mentionned density curve can configured parameter bw. seen , smoothness high properly group features. looking default parameters, can observe indeed, bw parameter set bw = 30, high modern UHPLC-MS setups. reduce value parameter 1.8 evaluate impact.  Figure 23. Correspondence analysis optimized parameters, Cystine.  Figure 24. Correspondence analysis optimized parameters, Methionine. can observe peaks now grouped accurately single feature test ion. important parameters optimized : binsize: data generated high resolution MS instrument, thus select low value paramete. ppm: TOF instruments, suggested use value ppm larger 0 accommodate higher measurement error instrument larger m/z values. minFraction: set minFraction = 0.75, hence defining features chromatographic peak identified least 75% samples one sample groups. sampleGroups: use information available sampleData’s \"phenotype\" column. correspondence analysis suggested evaluate results selected EICs. extract signal m/z similar isotope labeled methionine larger retention time range. Importantly, show actual correspondence results, set simulate = FALSE plotChromPeakDensity() function.  Figure 25. Correspondence analysis results, Methionine. hoped, signal two different ions now grouped separate features. Generally, correspondence results evaluated extracted chromatograms. Another interesting information look distribution features along retention time axis. Table 5. Distribution features along retention time axis. results correspondence analysis now stored, along results preprocessing steps, within XcmsExperiment result object. correspondence results, .e., definition LC-MS features, can extracted using featureDefinitions() function. data frame provides average m/z retention time (columns \"mzmed\" \"rtmed\") characterize LC-MS feature. Column, \"peakidx\" contains indices chromatographic peaks assigned feature. actual abundances features, represent also final preprocessing results, can extracted featureValues() function: can note features (e.g. F0003 F0006) missing values samples. expected certain degree samples features, respectively ions, need present. address next section.","code":"#' Default parameter for the grouping and apply them to the test ions BPC param <- PeakDensityParam(sampleGroups = sampleData(lcms1)$phenotype, bw = 30)  param Object of class:  PeakDensityParam  Parameters:  - sampleGroups:  [1] \"QC\"  \"CVD\" \"CTR\" \"QC\"  \"CTR\" \"CVD\" \"QC\"  \"CTR\" \"CVD\" \"QC\"  - bw: [1] 30  - minFraction: [1] 0.5  - minSamples: [1] 1  - binSize: [1] 0.25  - maxFeatures: [1] 50  - ppm: [1] 0 plotChromPeakDensity(     eic_cystine, param = param,     col = paste0(col_sample, \"80\"),     peakCol = col_sample[chromPeaks(eic_cystine)[, \"sample\"]],     peakBg = paste0(col_sample[chromPeaks(eic_cystine)[, \"sample\"]], 20),     peakPch = 16) plotChromPeakDensity(eic_met, param = param,     col = paste0(col_sample, \"80\"),     peakCol = col_sample[chromPeaks(eic_met)[, \"sample\"]],     peakBg = paste0(col_sample[chromPeaks(eic_met)[, \"sample\"]], 20),     peakPch = 16) #' Updating parameters param <- PeakDensityParam(sampleGroups = sampleData(lcms1)$phenotype, bw = 1.8)  plotChromPeakDensity(     eic_cystine, param = param,     col = paste0(col_sample, \"80\"),     peakCol = col_sample[chromPeaks(eic_cystine)[, \"sample\"]],     peakBg = paste0(col_sample[chromPeaks(eic_cystine)[, \"sample\"]], 20),     peakPch = 16) plotChromPeakDensity(eic_met, param = param,     col = paste0(col_sample, \"80\"),     peakCol = col_sample[chromPeaks(eic_met)[, \"sample\"]],     peakBg = paste0(col_sample[chromPeaks(eic_met)[, \"sample\"]], 20),     peakPch = 16) #' Define the settings for the param param <- PeakDensityParam(sampleGroups = sampleData(lcms1)$phenotype,                           minFraction = 0.75, binSize = 0.01, ppm = 10,                           bw = 1.8)  #' Apply to whole data lcms1 <- groupChromPeaks(lcms1, param = param) #' Extract chromatogram for an m/z similar to the one of the labeled methionine chr_test <- chromatogram(lcms1,                          mz = as.matrix(intern_standard[\"methionine_13C_15N\",                                                         c(\"mzmin\", \"mzmax\")]),                          rt = c(145, 200),                          aggregationFun = \"max\") Processing chromatographic peaks Processing features plotChromPeakDensity(     chr_test, simulate = FALSE,     col = paste0(col_sample, \"80\"),     peakCol = col_sample[chromPeaks(chr_test)[, \"sample\"]],     peakBg = paste0(col_sample[chromPeaks(chr_test)[, \"sample\"]], 20),     peakPch = 16) # Bin features per RT slices vc <- featureDefinitions(lcms1)$rtmed breaks <- seq(0, max(vc, na.rm = TRUE) + 1, length.out = 15) |>     round(0) cuts <- cut(vc, breaks = breaks, include.lowest = TRUE)  table(cuts) |>     kable(format = \"pipe\") #' Definition of the features featureDefinitions(lcms1) |>   head() mzmed    mzmin    mzmax    rtmed    rtmin    rtmax npeaks CTR CVD QC FT0001 50.98979 50.98949 50.99038 203.6001 203.1181 204.2331      8   1   3  4 FT0002 51.05904 51.05880 51.05941 191.1675 190.8787 191.5050      9   2   3  4 FT0003 51.98657 51.98631 51.98699 203.1467 202.6406 203.6710      7   0   3  4 FT0004 53.02036 53.02009 53.02043 203.2343 202.5652 204.0901     10   3   3  4 FT0005 53.52080 53.52051 53.52102 203.1936 202.8490 204.0901     10   3   3  4 FT0006 54.01007 54.00988 54.01015 159.2816 158.8499 159.4484      6   1   3  2             peakidx ms_level FT0001 7702, 16....        1 FT0002 7176, 16....        1 FT0003 7680, 17....        1 FT0004 7763, 17....        1 FT0005 8353, 17....        1 FT0006 5800, 15....        1 #' Extract feature abundances featureValues(lcms1, method = \"sum\") |>     head() MS_QC_POOL_1_POS.mzML MS_A_POS.mzML MS_B_POS.mzML MS_QC_POOL_2_POS.mzML FT0001              421.6162      689.2422            NA              481.7436 FT0002              710.8078      875.9192            NA              693.6997 FT0003              445.5711      613.4410            NA              497.8866 FT0004            16994.5260    24605.7340     19766.707            17808.0933 FT0005             3284.2664     4526.0531      3521.822             3379.8909 FT0006            10681.7476    10009.6602            NA            10800.5449        MS_C_POS.mzML MS_D_POS.mzML MS_QC_POOL_3_POS.mzML MS_E_POS.mzML FT0001            NA      635.2732              439.6086      570.5849 FT0002      781.2416      648.4344              700.9716     1054.0207 FT0003            NA      634.9370              449.0933            NA FT0004    22780.6683    22873.1061            16965.7762    23432.1252 FT0005     4396.0762     4317.7734             3270.5290     4533.8667 FT0006            NA     7296.4262                    NA     9236.9799        MS_F_POS.mzML MS_QC_POOL_4_POS.mzML FT0001      579.9360              437.0340 FT0002      534.4577              711.0361 FT0003      461.0465              232.1075 FT0004    22198.4607            16796.4497 FT0005     4161.0132             3142.2268 FT0006     6817.8785                    NA"},{"path":"https://rformassspectrometry.github.io/metabonaut/articles/a-end-to-end-untargeted-metabolomics.html","id":"gap-filling","dir":"Articles","previous_headings":"","what":"Gap filling","title":"Complete end-to-end LC-MS/MS Metabolomic Data analysis","text":"previously observed missing values (NA) attributed various reasons. Although might represent genuinely missing value, indicating ion (feature) truly present particular sample, also result failure preceding chromatographic peak detection step. crucial able recover missing values latter category much possible reduce eventual need data imputation. next examine prevalent missing values present dataset: can observe substantial number missing values values dataset. Let’s therefore delve process gap-filling. first evaluate example features chromatographic peak detected samples:  Figure 26. Examples chromatographic peaks missing values. instances, chromatographic peak identified one two selected samples (red line), hence missing value reported feature particular samples (blue line). However, cases, signal measured samples, thus, reporting missing value correct example. signal feature low, likely reason peak detection failed. rescue signal cases, fillChromPeaks() function can used ChromPeakAreaParam approach. method defines m/z-retention time area feature based detected peaks, signal respective ion expected. integrates intensities within area samples missing values feature. reported feature abundance. apply method using default parameters. fillChromPeaks() thus rescue missing data data set. Note , even sample ion present, worst case noise integrated, expected much lower actual chromatographic peak signal. Let’s look previously missing values :  Figure 27. Examples chromatographic peaks missing values gap-filling. gap-filling, also blue colored sample chromatographic peak present peak area reported feature abundance sample. assess effectiveness gap-filling method rescuing signals, can also plot average signal features least one missing value average filled-signal. advisable perform analysis repeatedly measured samples; case, QC samples used. , extract: Feature values detected chromatographic peaks setting filled = FALSE featuresValues() call. filled-signal first extracting detected gap-filled abundances replace values detected chromatographic peaks NA. , calculate row averages matrices plot .  detected (x-axis) gap-filled (y-axis) values QC samples highly correlated. Especially higher abundances, agreement high, low intensities, can expected, differences higher trending correlation line. , addition, fit linear regression line data summarize results linear regression line slope 1.12 intercept -1.62. indicates filled-signal average 1.12 times higher detected signal.","code":"#' Percentage of missing values sum(is.na(featureValues(lcms1))) /     length(featureValues(lcms1)) * 100 [1] 26.41597 ftidx <- which(is.na(rowSums(featureValues(lcms1)))) fts <- rownames(featureDefinitions(lcms1))[ftidx] farea <- featureArea(lcms1, features = fts[1:2])  chromatogram(lcms1[c(2, 3)],              rt = farea[, c(\"rtmin\", \"rtmax\")],              mz = farea[, c(\"mzmin\", \"mzmax\")]) |>     plot(col = c(\"red\", \"blue\"), lwd = 2) Processing chromatographic peaks #' Fill in the missing values in the whole dataset lcms1 <- fillChromPeaks(lcms1, param = ChromPeakAreaParam(), chunkSize = 5)  #' Percentage of missing values after gap-filling sum(is.na(featureValues(lcms1))) /     length(featureValues(lcms1)) * 100 [1] 5.155492 Processing chromatographic peaks #' Get only detected signal in QC samples vals_detect <- featureValues(lcms1, filled = FALSE)[, QC_samples]  #' Get detected and filled-in signal vals_filled <- featureValues(lcms1)[, QC_samples]  #' Replace detected signal with NA vals_filled[!is.na(vals_detect)] <- NA  #' Identify features with at least one filled peak has_filled <- is.na(rowSums(vals_detect))  #' Calculate row averages for features with missing values avg_detect <- rowMeans(vals_detect[has_filled, ], na.rm = TRUE) avg_filled <- rowMeans(vals_filled[has_filled, ], na.rm = TRUE)  #' Plot the values against each other (in log2 scale) plot(log2(avg_detect), log2(avg_filled),      xlim = range(log2(c(avg_detect, avg_filled)), na.rm = TRUE),      ylim = range(log2(c(avg_detect, avg_filled)), na.rm = TRUE),      pch = 21, bg = \"#00000020\", col = \"#00000080\") grid() abline(0, 1) #' fit a linear regression line to the data l <- lm(log2(avg_filled) ~ log2(avg_detect)) summary(l) Call: lm(formula = log2(avg_filled) ~ log2(avg_detect))  Residuals:     Min      1Q  Median      3Q     Max -6.8176 -0.3807  0.1725  0.5492  6.7504  Coefficients:                  Estimate Std. Error t value Pr(>|t|) (Intercept)      -1.62359    0.11545  -14.06   <2e-16 *** log2(avg_detect)  1.11763    0.01259   88.75   <2e-16 *** --- Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1  Residual standard error: 0.9366 on 2846 degrees of freedom   (846 observations deleted due to missingness) Multiple R-squared:  0.7346,    Adjusted R-squared:  0.7345 F-statistic:  7877 on 1 and 2846 DF,  p-value: < 2.2e-16"},{"path":"https://rformassspectrometry.github.io/metabonaut/articles/a-end-to-end-untargeted-metabolomics.html","id":"preprocessing-results","dir":"Articles","previous_headings":"","what":"Preprocessing results","title":"Complete end-to-end LC-MS/MS Metabolomic Data analysis","text":"final results LC-MS data preprocessing stored within XcmsExperiment object. includes identified chromatographic peaks, alignment results, well correspondence results. addition, guarantee reproducibility, result object keeps track performed processing steps, including individual parameter objects used configure . processHistory() function returns list various applied processing steps chronological order. , extract information first step performed preprocessing. processParam() function used extract actual parameter class used configure processing step. final result whole LC-MS data preprocessing two-dimensional matrix abundances -called LC-MS features samples. Note stage analysis features characterized m/z retention time don’t yet information metabolite feature represent. seen , feature matrix can extracted featureValues() function corresponding feature characteristics (.e., m/z retention time values) using featureDefinitions() function. Thus, two arrays extracted xcms result object used/imported analysis packages processing. example also exported tab delimited text files, used external tool, used, also MS2 spectra available, feature-based molecular networking GNPS analysis environment [@nothias_feature-based_2020]. processing R, reference link raw MS data required, suggested extract xcms preprocessing result using quantify() function SummarizedExperiment object, Bioconductor’s default container data biological assays/experiments. simplifies integration Bioconductor analysis packages. quantify() function takes parameters featureValues() function, thus, call extract SummarizedExperiment detected, gap-filled, feature abundances: Sample identifications xcms result’s sampleData() now available colData() (column, sample annotations) featureDefinitions() rowData() (row, feature annotations). feature values added first assay() SummarizedExperiment even processing history available object’s metadata(). SummarizedExperiment supports multiple assays, numeric matrices dimensions. thus add detected gap-filled feature abundances additional assay SummarizedExperiment. Feature abundances can extracted assay() function. extract first 6 lines detected gap-filled feature abundances: advantage, addition container full preprocessing results also possibility easy intuitive creation data subsets ensuring data integrity. example easy subset full data selection features /samples: moving next step analysis, advisable save preprocessing results. multiple format options save , can found MsIO package documentation. save XcmsExperiment object file format handled alabster framework, ensures object can easily read languages like Python Javascript well loaded easily back R.","code":"#' Check first step of the process history processHistory(lcms1)[[1]] Object of class \"XProcessHistory\"  type: Peak detection  date: Mon Oct 21 23:01:56 2024  info:  fileIndex: 1,2,3,4,5,6,7,8,9,10  Parameter class: CentWaveParam  MS level(s) 1 #' Extract results as a SummarizedExperiment res <- quantify(lcms1, method = \"sum\", filled = FALSE) res class: SummarizedExperiment dim: 9068 10 metadata(6): '' '' ... '' '' assays(1): raw rownames(9068): FT0001 FT0002 ... FT9067 FT9068 rowData names(11): mzmed mzmin ... QC ms_level colnames(10): MS_QC_POOL_1_POS.mzML MS_A_POS.mzML ... MS_F_POS.mzML   MS_QC_POOL_4_POS.mzML colData names(11): sample_name derived_spectra_data_file ... phenotype   injection_index assays(res)$raw_filled <- featureValues(lcms1, method = \"sum\",                                         filled = TRUE )  #' Different assay in the SummarizedExperiment object assayNames(res) [1] \"raw\"        \"raw_filled\" assay(res, \"raw_filled\") |> head() MS_QC_POOL_1_POS.mzML MS_A_POS.mzML MS_B_POS.mzML MS_QC_POOL_2_POS.mzML FT0001              421.6162      689.2422      411.3295              481.7436 FT0002              710.8078      875.9192      457.5920              693.6997 FT0003              445.5711      613.4410      277.5022              497.8866 FT0004            16994.5260    24605.7340    19766.7069            17808.0933 FT0005             3284.2664     4526.0531     3521.8221             3379.8909 FT0006            10681.7476    10009.6602     9599.9701            10800.5449        MS_C_POS.mzML MS_D_POS.mzML MS_QC_POOL_3_POS.mzML MS_E_POS.mzML FT0001      314.7567      635.2732              439.6086      570.5849 FT0002      781.2416      648.4344              700.9716     1054.0207 FT0003      425.3774      634.9370              449.0933      556.2544 FT0004    22780.6683    22873.1061            16965.7762    23432.1252 FT0005     4396.0762     4317.7734             3270.5290     4533.8667 FT0006     4792.2390     7296.4262             2382.1788     9236.9799        MS_F_POS.mzML MS_QC_POOL_4_POS.mzML FT0001      579.9360              437.0340 FT0002      534.4577              711.0361 FT0003      461.0465              232.1075 FT0004    22198.4607            16796.4497 FT0005     4161.0132             3142.2268 FT0006     6817.8785             6911.5439 res[1:14, 3:8] class: SummarizedExperiment dim: 14 6 metadata(6): '' '' ... '' '' assays(2): raw raw_filled rownames(14): FT0001 FT0002 ... FT0013 FT0014 rowData names(11): mzmed mzmin ... QC ms_level colnames(6): MS_B_POS.mzML MS_QC_POOL_2_POS.mzML ...   MS_QC_POOL_3_POS.mzML MS_E_POS.mzML colData names(11): sample_name derived_spectra_data_file ... phenotype   injection_index #' Save the preprocessing results #' d <- file.path(tempdir(), \"objects/lcms1\") # saveMsObject(lcms1, AlabasterParam(path = d)) #' for now let's do R object because the previous method is not implemented yet. save(lcms1, file = \"preprocessed_lcms1.RData\")"},{"path":"https://rformassspectrometry.github.io/metabonaut/articles/a-end-to-end-untargeted-metabolomics.html","id":"data-normalization","dir":"Articles","previous_headings":"","what":"Data normalization","title":"Complete end-to-end LC-MS/MS Metabolomic Data analysis","text":"preprocessing, data normalization scaling might need applied remove technical variances data. simple approaches like median scaling can implemented lines R code, advanced normalization algorithms available packages Bioconductor’s preprocessCore. comprehensive workflow “Notame” also propose interesting normalization approach adaptable scalable user dataset [@klavus_notame_2020]. Generally, LC-MS data, bias can categorized three main groups[@broadhurst_guidelines_2018]: Variances introduced sample collection initial processing, can include differences sample amounts. type bias expected sample-specific affect signals sample way. Methods like median scaling, LOESS quantiles normalization can adjust bias. Signal drifts along measurement samples experiment. Reasons drifts can related aging instrumentation used (columns, detector), also changes metabolite abundances characteristics due reactions modifications, oxidation. changes expected affect samples measured later run rather ones measured beginning. reason, bias can play major role large experiments bias can play major role large experiments measured long time range usually considered affect individual metabolites (metabolite groups) differently. adjustment, moving average linear regression-based approaches can used. latter can example performed using adjust_lm() function MetaboCoreUtils package. Batch-related biases. comprise noise specific larger set samples, can set samples measured one LC-MS measurement run (.e. one analysis plate) samples measured using specific batch reagents. noise assumed affect samples one batch way linear modeling-based approaches can used adjust . Unwanted variation can arise various sources highly dependent experiment. Therefore, data normalization chosen carefully based experimental design, statistical aims, balance accuracy precision achieved use auxiliary information. Sample preparation biases can evaluated using internal standards, depending however also added sample mixes sample processing. Repeated measurements QC samples hand allows estimate correct LC-MS specific biases. Also, proper planning experiment, measurement study samples random order, can largely avoid biases introduced mentioned sources variance. workflow present tools assess data quality evaluate need normalization well options normalization. space reasons able provide solutions adjust possible sources variation. principal component analysis (PCA) helpful tool initial, unsupervised, visualization data also provides insights potential quality issues data. order apply PCA measured feature abundances, need however impute (still present) missing values. assume missing values (gap-filling step) represent signal detection limit. cases, missing values can replaced random values sampled uniform distribution, ranging half smallest measured value smallest measured value specific feature. uniform distribution defined two parameters (minimum maximum) values equal probability selected. impute missing values approach add resulting data matrix new assay result object. PCA powerful tool detecting biases data. dimensionality reduction technique, enables visualization data lower-dimensional space. context LC-MS data, PCA can used identify overall biases batch, sample, injection index, etc. However, important note PCA linear method may able detect biases data. plotting PCA, apply log2 transform, center scale data. log2 transformation applied stabilize variance centering remove dependency absolute abundances.  Figure 28. PCA data. PCA shows clear separation study samples (plasma) QC samples (serum) first principal component (PC1). separation based phenotype visible third principal component (PC3). cases, can better option remove imputed values evaluate PCA . especially true imputed values replacing large proportion data. Global differences feature abundances samples (e.g. due sample-specific biases) can evaluated plotting distribution log2 transformed feature abundances using boxplots violin plots. show number detected chromatographic peaks per sample distribution log2 transformed feature abundances.  Figure 29. Number detected peaks feature abundances. upper part plot show gap filling steps allowed rescue substantial number NAs allowed us consistent number feature values per sample. consistency aligns asspumption every sample similar amount features detected. Additionally observe , average, signal distribution individual samples similar. alternative way evaluate differences abundances samples relative log abundance (RLA) plots [@de_livera_normalizing_2012]. RLA value abundance feature sample relative median abundance feature across multiple samples. can discriminate within group across group RLAs, depending whether abundance compared samples within sample group across samples. Within group RLA plots assess tightness replicates within groups median close zero low variation around . used across groups, allow compare behavior groups. Generally, -sample differences can easily spotted using RLA plots. calculate visualize within group RLA values using rowRla() function MsCoreUtils package defining parameter f sample groups.  Figure 30. RLA plot raw data filled data. RLA plot , can observe medians samples indeed centered around 0. Exception two CVD samples. Thus, distribution signals across samples comparable, differences seem present require sample normalization. Depending added sample mixes, allow evaluation variances introduced subsequent processing analysis steps. present experiment, added original plasma samples sample extraction included also protein lipid removal steps. can therefore used evaluate variances introduced sample extraction subsequent steps, can however used infer conclusions performance differences original sample collection (blood drawing, storage, plasma creation). use matchValues() function identify features representing signal . filter matches keep match single feature using filterMatches() function combination SingleMatchParam. internal standards play crucial role guiding normalization process. Given assumption samples artificially spiked, possess known ground truth—abundance intensity internal standard consistent. difference expected due technical differences/variance. Consequently, normalization aims minimize variation samples internal standard, reinforcing reliability analyses. previous RLA plot showed data biases need corrected. Therefore, implement -sample normalization using filled-features. process effectively mitigates variations influenced technical issues, differences sample preparation, processing injection methods. instance, employ commonly used technique known median scaling [@de_livera_normalizing_2012]. method involves computing median sample, followed determining median individual sample medians. ensures consistent median values sample throughout entire data set. Maintaining uniformity average total metabolite abundance across samples crucial effective implementation. process aims establish shared baseline central tendency metabolite abundance, mitigating impact sample-specific technical variations. approach fosters robust comparable analysis top features across data set. assumption normalizing based median, known lower sensitivity extreme values, enhances comparability top features ensures consistent average abundance across samples. median scaling calculated imputed non-imputed data, set stored separately within SummarizedExperiment object. approach facilitates testing various normalization strategies maintaining record processing steps undertaken, enabling easy regression previous stages necessary. crucial evaluate effectiveness normalization process. can achieved comparing distribution log2 transformed feature abundances normalization. Additionally, RLA plots can used assess tightness replicates within groups compare behavior groups.  Figure 31. PC1 PC2 data normalization. Normalization large impact PC1 PC2, separation study groups PC3 seems better difference QC samples lower normalization (see ).  Figure 32. PC3 PC4 data normalization. PCA plots show normalization process changed overall structure data. separation study QC samples remains . expected results normalization correct biological variance technical. compare RLA plots -sample normalization evaluate impact data.  Figure 33. RLA plot normalization. normalization process effectively centered data around median medians samples now closer zero. next evaluate coefficient variation (CV, also referred relative standard deviation RSD) features across samples either QC study samples. QC samples, CV represent technical noise, study samples include also expected biological differences. Thus, normalization reduce CV QC samples, slightly reducing CV study samples. CV calculated using rowRsd() function MetaboCoreUtils package. setting mad = TRUE use robust calculation using median absolute deviation instead standard deviation. Table 6. Distribution CV values across samples raw normalized data. table shows distribution CV raw normalized data. first column highlights % data given CV value, e.g. 25% data CV equal lower 0.04557 QC_raw data. anticipated, CV values QCs, reflect technical variance, lower compared study samples, include technical biological variance. Overall, minimal disparity exists raw normalized data, positive indication normalization process introduced bias dataset, also reflects little differences average abundances sample raw data. overall conclusion normalization process little variance present beginning, normalization however able center data around median (shown RLA plot). Given simplicity limited size example dataset, conclude normalization process stage. intricate datasets diverse biases, tailored approach devised. include also approaches adjust signal drifts batch effects. One possible option use linear-model based approach can example applied adjust_lm() function MetaboCoreUtils package.","code":"#' Load preprocessing results ## load(\"SumExp.RData\") ## loadResults(RDataParam(\"data.RData\"))  #' Impute missing values using an uniform distribution na_unidis <- function(z) {     na <- is.na(z)     if (any(na)) {         min = min(z, na.rm = TRUE)         z[na] <- runif(sum(na), min = min/2, max = min)     }     z }  #' Row-wise impute missing values and add the data as a new assay tmp <- apply(assay(res, \"raw_filled\"), MARGIN = 1, na_unidis) assays(res)$raw_filled_imputed <- t(tmp) #' Log2 transform and scale data vals <- assay(res, \"raw_filled_imputed\") |>     log2() |>     t() |>     scale(center = TRUE, scale = TRUE)  #' Perform the PCA pca_res <- prcomp(vals, scale = FALSE, center = FALSE)  #' Plot the results vals_st <- cbind(vals, phenotype = res$phenotype) pca_12 <- autoplot(pca_res, data = vals_st , colour = 'phenotype', scale = 0) +     scale_color_manual(values = col_phenotype) pca_34 <- autoplot(pca_res, data = vals_st, colour = 'phenotype',                    x = 3, y = 4, scale = 0) +     scale_color_manual(values = col_phenotype) grid.arrange(pca_12, pca_34, ncol = 2) layout(mat = matrix(1:3, ncol = 1), height = c(0.2, 0.2, 0.8))  par(mar = c(0.2, 4.5, 0.2, 3)) barplot(apply(assay(res, \"raw\"), MARGIN = 2, function(x) sum(!is.na(x))),         col = paste0(col_sample, 80), border = col_sample,         ylab = \"# detected peaks\", xaxt = \"n\", space = 0.012) grid(nx = NA, ny = NULL) barplot(apply(assay(res, \"raw_filled\"), MARGIN = 2, function(x) sum(!is.na(x))),         col = paste0(col_sample, 80), border = col_sample,         ylab = \"# detected + filled peaks\", xaxt = \"n\",         space = 0.012) grid(nx = NA, ny = NULL) vioplot(log2(assay(res, \"raw_filled\")), xaxt = \"n\",         ylab = expression(log[2]~feature~abundance),         col = paste0(col_sample, 80), border = col_sample) points(colMedians(log2(assay(res, \"raw_filled\")), na.rm = TRUE), type = \"b\",        pch = 1) grid(nx = NA, ny = NULL) legend(\"topright\", col = col_phenotype,        legend = names(col_phenotype), lty=1, lwd = 2, xpd = TRUE, ncol = 3,        cex = 0.8,  bty = \"n\") par(mfrow = c(1, 1), mar = c(3.5, 4.5, 2.5, 1)) boxplot(MsCoreUtils::rowRla(assay(res, \"raw_filled\"),                             f = res$phenotype, transform = \"log2\"),         cex = 0.5, pch = 16,         col = paste0(col_sample, 80), ylab = \"RLA\",         border = col_sample, boxwex = 1,         outline = FALSE, xaxt = \"n\", main = \"Relative log abundance\",         cex.main = 1) axis(side = 1, at = seq_len(ncol(res)), labels = colData(res)$sample_name) grid(nx = NA, ny = NULL) abline(h = 0, lty=3, lwd = 1, col = \"black\") legend(\"topright\", col = col_phenotype,        legend = names(col_phenotype), lty=1, lwd = 2, xpd = TRUE, ncol = 3,        cex = 0.8,  bty = \"n\") # Do we keep IS in normalisation ? Does not give much info... Would simplify a bit #' Creating a column within our IS table intern_standard$feature_id <- NA_character_  #' Identify features matching m/z and RT of internal standards. fdef <- featureDefinitions(lcms1) fdef$feature_id <- rownames(fdef) match_intern_standard <- matchValues(     query = intern_standard,     target = fdef,     mzColname = c(\"mz\", \"mzmed\"),     rtColname = c(\"RT\", \"rtmed\"),     param = MzRtParam(ppm = 50, toleranceRt = 10))  #' Keep only matches with a 1:1 mapping standard to feature. param <- SingleMatchParam(duplicates = \"remove\", column = \"score_rt\",                           decreasing = TRUE) match_intern_standard <- filterMatches(match_intern_standard, param)  intern_standard$feature_id <- match_intern_standard$target_feature_id intern_standard <- intern_standard[!is.na(intern_standard$feature_id), ] #' Compute median and generate normalization factor mdns <- apply(assay(res, \"raw_filled\"), MARGIN = 2,               median, na.rm = TRUE ) nf_mdn <- mdns / median(mdns)  #' divide dataset by median of median and create a new assay. assays(res)$norm <- sweep(assay(res, \"raw_filled\"), MARGIN = 2, nf_mdn, '/') assays(res)$norm_imputed <- sweep(assay(res, \"raw_filled_imputed\"), MARGIN = 2,                                   nf_mdn, '/') #' Data before normalization vals_st <- cbind(vals, phenotype = res$phenotype) pca_raw <- autoplot(pca_res, data = vals_st,                     colour = 'phenotype', scale = 0) +     scale_color_manual(values = col_phenotype)  #' Data after normalization vals_norm <- apply(assay(res, \"norm\"), MARGIN = 1, na_unidis) |>     log2() |>     scale(center = TRUE, scale = TRUE)  pca_res_norm <- prcomp(vals_norm, scale = FALSE, center = FALSE) vals_st_norm <- cbind(vals_norm, phenotype = res$phenotype) pca_adj <- autoplot(pca_res_norm, data = vals_st_norm,                     colour = 'phenotype', scale = 0) +     scale_color_manual(values = col_phenotype)  grid.arrange(pca_raw, pca_adj, ncol = 2) pca_raw <- autoplot(pca_res, data = vals_st ,                     colour = 'phenotype', x = 3, y = 4, scale = 0) +     scale_color_manual(values = col_phenotype) pca_adj <- autoplot(pca_res_norm, data = vals_st_norm,                     colour = 'phenotype', x = 3, y = 4, scale = 0) +     scale_color_manual(values = col_phenotype)  grid.arrange(pca_raw, pca_adj, ncol = 2) par(mfrow = c(2, 1), mar = c(3.5, 4.5, 2.5, 1))  boxplot(rowRla(assay(res, \"raw_filled\"), group = res$phenotype),         cex = 0.5, pch = 16, ylab = \"RLA\", border = col_sample,         col = paste0(col_sample, 80), cex.main = 1, outline = FALSE,         xaxt = \"n\", main = \"Raw data\", boxwex = 1) grid(nx = NA, ny = NULL) legend(\"topright\", inset = c(0, -0.2), col = col_phenotype,        legend = names(col_phenotype), lty=1, lwd = 2, xpd = TRUE,        ncol = 3, cex = 0.7, bty = \"n\") abline(h = 0, lty=3, lwd = 1, col = \"black\")  boxplot(rowRla(assay(res, \"norm\"), group = res$phenotype),         cex = 0.5, pch = 16, ylab = \"RLA\", border = col_sample,         col = paste0(col_sample, 80), boxwex = 1, outline = FALSE,         xaxt = \"n\", main = \"Normallized data\", cex.main = 1) axis(side = 1, at = seq_len(ncol(res)), labels = res$sample_name) grid(nx = NA, ny = NULL) abline(h = 0, lty = 3, lwd = 1, col = \"black\") #' Calculate the CV values index_study <- res$phenotype %in% c(\"CTR\", \"CVD\") index_QC <- res$phenotype == \"QC\"  sample_res <- cbind(     QC_raw = rowRsd(assay(res, \"raw_filled\")[, index_QC],                     na.rm = TRUE, mad = TRUE),     QC_norm = rowRsd(assay(res, \"norm\")[, index_QC],                      na.rm = TRUE, mad = TRUE),     Study_raw = rowRsd(assay(res, \"raw_filled\")[, index_study],                        na.rm = TRUE, mad = TRUE),     Study_norm = rowRsd(assay(res, \"norm\")[, index_study],                         na.rm = TRUE, mad = TRUE) )  #' Summarize the values across features res_df <- data.frame(     QC_raw = quantile(sample_res[, \"QC_raw\"], na.rm = TRUE),     QC_norm = quantile(sample_res[, \"QC_norm\"], na.rm = TRUE),     Study_raw = quantile(sample_res[, \"Study_raw\"], na.rm = TRUE),     Study_norm = quantile(sample_res[, \"Study_norm\"], na.rm = TRUE) )  kable(res_df, format = \"pipe\")"},{"path":"https://rformassspectrometry.github.io/metabonaut/articles/a-end-to-end-untargeted-metabolomics.html","id":"initial-quality-assessment","dir":"Articles","previous_headings":"","what":"Initial quality assessment","title":"Complete end-to-end LC-MS/MS Metabolomic Data analysis","text":"principal component analysis (PCA) helpful tool initial, unsupervised, visualization data also provides insights potential quality issues data. order apply PCA measured feature abundances, need however impute (still present) missing values. assume missing values (gap-filling step) represent signal detection limit. cases, missing values can replaced random values sampled uniform distribution, ranging half smallest measured value smallest measured value specific feature. uniform distribution defined two parameters (minimum maximum) values equal probability selected. impute missing values approach add resulting data matrix new assay result object. PCA powerful tool detecting biases data. dimensionality reduction technique, enables visualization data lower-dimensional space. context LC-MS data, PCA can used identify overall biases batch, sample, injection index, etc. However, important note PCA linear method may able detect biases data. plotting PCA, apply log2 transform, center scale data. log2 transformation applied stabilize variance centering remove dependency absolute abundances.  Figure 28. PCA data. PCA shows clear separation study samples (plasma) QC samples (serum) first principal component (PC1). separation based phenotype visible third principal component (PC3). cases, can better option remove imputed values evaluate PCA . especially true imputed values replacing large proportion data. Global differences feature abundances samples (e.g. due sample-specific biases) can evaluated plotting distribution log2 transformed feature abundances using boxplots violin plots. show number detected chromatographic peaks per sample distribution log2 transformed feature abundances.  Figure 29. Number detected peaks feature abundances. upper part plot show gap filling steps allowed rescue substantial number NAs allowed us consistent number feature values per sample. consistency aligns asspumption every sample similar amount features detected. Additionally observe , average, signal distribution individual samples similar. alternative way evaluate differences abundances samples relative log abundance (RLA) plots [@de_livera_normalizing_2012]. RLA value abundance feature sample relative median abundance feature across multiple samples. can discriminate within group across group RLAs, depending whether abundance compared samples within sample group across samples. Within group RLA plots assess tightness replicates within groups median close zero low variation around . used across groups, allow compare behavior groups. Generally, -sample differences can easily spotted using RLA plots. calculate visualize within group RLA values using rowRla() function MsCoreUtils package defining parameter f sample groups.  Figure 30. RLA plot raw data filled data. RLA plot , can observe medians samples indeed centered around 0. Exception two CVD samples. Thus, distribution signals across samples comparable, differences seem present require sample normalization. Depending added sample mixes, allow evaluation variances introduced subsequent processing analysis steps. present experiment, added original plasma samples sample extraction included also protein lipid removal steps. can therefore used evaluate variances introduced sample extraction subsequent steps, can however used infer conclusions performance differences original sample collection (blood drawing, storage, plasma creation). use matchValues() function identify features representing signal . filter matches keep match single feature using filterMatches() function combination SingleMatchParam. internal standards play crucial role guiding normalization process. Given assumption samples artificially spiked, possess known ground truth—abundance intensity internal standard consistent. difference expected due technical differences/variance. Consequently, normalization aims minimize variation samples internal standard, reinforcing reliability analyses.","code":"#' Load preprocessing results ## load(\"SumExp.RData\") ## loadResults(RDataParam(\"data.RData\"))  #' Impute missing values using an uniform distribution na_unidis <- function(z) {     na <- is.na(z)     if (any(na)) {         min = min(z, na.rm = TRUE)         z[na] <- runif(sum(na), min = min/2, max = min)     }     z }  #' Row-wise impute missing values and add the data as a new assay tmp <- apply(assay(res, \"raw_filled\"), MARGIN = 1, na_unidis) assays(res)$raw_filled_imputed <- t(tmp) #' Log2 transform and scale data vals <- assay(res, \"raw_filled_imputed\") |>     log2() |>     t() |>     scale(center = TRUE, scale = TRUE)  #' Perform the PCA pca_res <- prcomp(vals, scale = FALSE, center = FALSE)  #' Plot the results vals_st <- cbind(vals, phenotype = res$phenotype) pca_12 <- autoplot(pca_res, data = vals_st , colour = 'phenotype', scale = 0) +     scale_color_manual(values = col_phenotype) pca_34 <- autoplot(pca_res, data = vals_st, colour = 'phenotype',                    x = 3, y = 4, scale = 0) +     scale_color_manual(values = col_phenotype) grid.arrange(pca_12, pca_34, ncol = 2) layout(mat = matrix(1:3, ncol = 1), height = c(0.2, 0.2, 0.8))  par(mar = c(0.2, 4.5, 0.2, 3)) barplot(apply(assay(res, \"raw\"), MARGIN = 2, function(x) sum(!is.na(x))),         col = paste0(col_sample, 80), border = col_sample,         ylab = \"# detected peaks\", xaxt = \"n\", space = 0.012) grid(nx = NA, ny = NULL) barplot(apply(assay(res, \"raw_filled\"), MARGIN = 2, function(x) sum(!is.na(x))),         col = paste0(col_sample, 80), border = col_sample,         ylab = \"# detected + filled peaks\", xaxt = \"n\",         space = 0.012) grid(nx = NA, ny = NULL) vioplot(log2(assay(res, \"raw_filled\")), xaxt = \"n\",         ylab = expression(log[2]~feature~abundance),         col = paste0(col_sample, 80), border = col_sample) points(colMedians(log2(assay(res, \"raw_filled\")), na.rm = TRUE), type = \"b\",        pch = 1) grid(nx = NA, ny = NULL) legend(\"topright\", col = col_phenotype,        legend = names(col_phenotype), lty=1, lwd = 2, xpd = TRUE, ncol = 3,        cex = 0.8,  bty = \"n\") par(mfrow = c(1, 1), mar = c(3.5, 4.5, 2.5, 1)) boxplot(MsCoreUtils::rowRla(assay(res, \"raw_filled\"),                             f = res$phenotype, transform = \"log2\"),         cex = 0.5, pch = 16,         col = paste0(col_sample, 80), ylab = \"RLA\",         border = col_sample, boxwex = 1,         outline = FALSE, xaxt = \"n\", main = \"Relative log abundance\",         cex.main = 1) axis(side = 1, at = seq_len(ncol(res)), labels = colData(res)$sample_name) grid(nx = NA, ny = NULL) abline(h = 0, lty=3, lwd = 1, col = \"black\") legend(\"topright\", col = col_phenotype,        legend = names(col_phenotype), lty=1, lwd = 2, xpd = TRUE, ncol = 3,        cex = 0.8,  bty = \"n\") # Do we keep IS in normalisation ? Does not give much info... Would simplify a bit #' Creating a column within our IS table intern_standard$feature_id <- NA_character_  #' Identify features matching m/z and RT of internal standards. fdef <- featureDefinitions(lcms1) fdef$feature_id <- rownames(fdef) match_intern_standard <- matchValues(     query = intern_standard,     target = fdef,     mzColname = c(\"mz\", \"mzmed\"),     rtColname = c(\"RT\", \"rtmed\"),     param = MzRtParam(ppm = 50, toleranceRt = 10))  #' Keep only matches with a 1:1 mapping standard to feature. param <- SingleMatchParam(duplicates = \"remove\", column = \"score_rt\",                           decreasing = TRUE) match_intern_standard <- filterMatches(match_intern_standard, param)  intern_standard$feature_id <- match_intern_standard$target_feature_id intern_standard <- intern_standard[!is.na(intern_standard$feature_id), ]"},{"path":"https://rformassspectrometry.github.io/metabonaut/articles/a-end-to-end-untargeted-metabolomics.html","id":"principal-component-analysis","dir":"Articles","previous_headings":"Data normalization","what":"Principal Component Analysis","title":"Complete end-to-end LC-MS/MS Metabolomic Data analysis","text":"PCA powerful tool detecting biases data. dimensionality reduction technique, enables visualization data lower-dimensional space. context LC-MS data, PCA can used identify overall biases batch, sample, injection index, etc. However, important note PCA linear method may able detect biases data. plotting PCA, apply log2 transform, center scale data. log2 transformation applied stabilize variance centering remove dependency absolute abundances.  Figure 28. PCA data. PCA shows clear separation study samples (plasma) QC samples (serum) first principal component (PC1). separation based phenotype visible third principal component (PC3). cases, can better option remove imputed values evaluate PCA . especially true imputed values replacing large proportion data.","code":"#' Log2 transform and scale data vals <- assay(res, \"raw_filled_imputed\") |>     log2() |>     t() |>     scale(center = TRUE, scale = TRUE)  #' Perform the PCA pca_res <- prcomp(vals, scale = FALSE, center = FALSE)  #' Plot the results vals_st <- cbind(vals, phenotype = res$phenotype) pca_12 <- autoplot(pca_res, data = vals_st , colour = 'phenotype', scale = 0) +     scale_color_manual(values = col_phenotype) pca_34 <- autoplot(pca_res, data = vals_st, colour = 'phenotype',                    x = 3, y = 4, scale = 0) +     scale_color_manual(values = col_phenotype) grid.arrange(pca_12, pca_34, ncol = 2)"},{"path":"https://rformassspectrometry.github.io/metabonaut/articles/a-end-to-end-untargeted-metabolomics.html","id":"intensity-evaluation","dir":"Articles","previous_headings":"Data normalization","what":"Intensity evaluation","title":"Complete end-to-end LC-MS/MS Metabolomic Data analysis","text":"Global differences feature abundances samples (e.g. due sample-specific biases) can evaluated plotting distribution log2 transformed feature abundances using boxplots violin plots. show number detected chromatographic peaks per sample distribution log2 transformed feature abundances.  Figure 29. Number detected peaks feature abundances. upper part plot show gap filling steps allowed rescue substantial number NAs allowed us consistent number feature values per sample. consistency aligns asspumption every sample similar amount features detected. Additionally observe , average, signal distribution individual samples similar. alternative way evaluate differences abundances samples relative log abundance (RLA) plots [@de_livera_normalizing_2012]. RLA value abundance feature sample relative median abundance feature across multiple samples. can discriminate within group across group RLAs, depending whether abundance compared samples within sample group across samples. Within group RLA plots assess tightness replicates within groups median close zero low variation around . used across groups, allow compare behavior groups. Generally, -sample differences can easily spotted using RLA plots. calculate visualize within group RLA values using rowRla() function MsCoreUtils package defining parameter f sample groups.  Figure 30. RLA plot raw data filled data. RLA plot , can observe medians samples indeed centered around 0. Exception two CVD samples. Thus, distribution signals across samples comparable, differences seem present require sample normalization.","code":"layout(mat = matrix(1:3, ncol = 1), height = c(0.2, 0.2, 0.8))  par(mar = c(0.2, 4.5, 0.2, 3)) barplot(apply(assay(res, \"raw\"), MARGIN = 2, function(x) sum(!is.na(x))),         col = paste0(col_sample, 80), border = col_sample,         ylab = \"# detected peaks\", xaxt = \"n\", space = 0.012) grid(nx = NA, ny = NULL) barplot(apply(assay(res, \"raw_filled\"), MARGIN = 2, function(x) sum(!is.na(x))),         col = paste0(col_sample, 80), border = col_sample,         ylab = \"# detected + filled peaks\", xaxt = \"n\",         space = 0.012) grid(nx = NA, ny = NULL) vioplot(log2(assay(res, \"raw_filled\")), xaxt = \"n\",         ylab = expression(log[2]~feature~abundance),         col = paste0(col_sample, 80), border = col_sample) points(colMedians(log2(assay(res, \"raw_filled\")), na.rm = TRUE), type = \"b\",        pch = 1) grid(nx = NA, ny = NULL) legend(\"topright\", col = col_phenotype,        legend = names(col_phenotype), lty=1, lwd = 2, xpd = TRUE, ncol = 3,        cex = 0.8,  bty = \"n\") par(mfrow = c(1, 1), mar = c(3.5, 4.5, 2.5, 1)) boxplot(MsCoreUtils::rowRla(assay(res, \"raw_filled\"),                             f = res$phenotype, transform = \"log2\"),         cex = 0.5, pch = 16,         col = paste0(col_sample, 80), ylab = \"RLA\",         border = col_sample, boxwex = 1,         outline = FALSE, xaxt = \"n\", main = \"Relative log abundance\",         cex.main = 1) axis(side = 1, at = seq_len(ncol(res)), labels = colData(res)$sample_name) grid(nx = NA, ny = NULL) abline(h = 0, lty=3, lwd = 1, col = \"black\") legend(\"topright\", col = col_phenotype,        legend = names(col_phenotype), lty=1, lwd = 2, xpd = TRUE, ncol = 3,        cex = 0.8,  bty = \"n\")"},{"path":"https://rformassspectrometry.github.io/metabonaut/articles/a-end-to-end-untargeted-metabolomics.html","id":"internal-standards","dir":"Articles","previous_headings":"Data normalization","what":"Internal standards","title":"Complete end-to-end LC-MS/MS Metabolomic Data analysis","text":"Depending added sample mixes, allow evaluation variances introduced subsequent processing analysis steps. present experiment, added original plasma samples sample extraction included also protein lipid removal steps. can therefore used evaluate variances introduced sample extraction subsequent steps, can however used infer conclusions performance differences original sample collection (blood drawing, storage, plasma creation). use matchValues() function identify features representing signal . filter matches keep match single feature using filterMatches() function combination SingleMatchParam. internal standards play crucial role guiding normalization process. Given assumption samples artificially spiked, possess known ground truth—abundance intensity internal standard consistent. difference expected due technical differences/variance. Consequently, normalization aims minimize variation samples internal standard, reinforcing reliability analyses.","code":"# Do we keep IS in normalisation ? Does not give much info... Would simplify a bit #' Creating a column within our IS table intern_standard$feature_id <- NA_character_  #' Identify features matching m/z and RT of internal standards. fdef <- featureDefinitions(lcms1) fdef$feature_id <- rownames(fdef) match_intern_standard <- matchValues(     query = intern_standard,     target = fdef,     mzColname = c(\"mz\", \"mzmed\"),     rtColname = c(\"RT\", \"rtmed\"),     param = MzRtParam(ppm = 50, toleranceRt = 10))  #' Keep only matches with a 1:1 mapping standard to feature. param <- SingleMatchParam(duplicates = \"remove\", column = \"score_rt\",                           decreasing = TRUE) match_intern_standard <- filterMatches(match_intern_standard, param)  intern_standard$feature_id <- match_intern_standard$target_feature_id intern_standard <- intern_standard[!is.na(intern_standard$feature_id), ]"},{"path":"https://rformassspectrometry.github.io/metabonaut/articles/a-end-to-end-untargeted-metabolomics.html","id":"between-sample-normalisation","dir":"Articles","previous_headings":"","what":"Between sample normalisation","title":"Complete end-to-end LC-MS/MS Metabolomic Data analysis","text":"previous RLA plot showed data biases need corrected. Therefore, implement -sample normalization using filled-features. process effectively mitigates variations influenced technical issues, differences sample preparation, processing injection methods. instance, employ commonly used technique known median scaling [@de_livera_normalizing_2012]. method involves computing median sample, followed determining median individual sample medians. ensures consistent median values sample throughout entire data set. Maintaining uniformity average total metabolite abundance across samples crucial effective implementation. process aims establish shared baseline central tendency metabolite abundance, mitigating impact sample-specific technical variations. approach fosters robust comparable analysis top features across data set. assumption normalizing based median, known lower sensitivity extreme values, enhances comparability top features ensures consistent average abundance across samples. median scaling calculated imputed non-imputed data, set stored separately within SummarizedExperiment object. approach facilitates testing various normalization strategies maintaining record processing steps undertaken, enabling easy regression previous stages necessary.","code":"#' Compute median and generate normalization factor mdns <- apply(assay(res, \"raw_filled\"), MARGIN = 2,               median, na.rm = TRUE ) nf_mdn <- mdns / median(mdns)  #' divide dataset by median of median and create a new assay. assays(res)$norm <- sweep(assay(res, \"raw_filled\"), MARGIN = 2, nf_mdn, '/') assays(res)$norm_imputed <- sweep(assay(res, \"raw_filled_imputed\"), MARGIN = 2,                                   nf_mdn, '/')"},{"path":"https://rformassspectrometry.github.io/metabonaut/articles/a-end-to-end-untargeted-metabolomics.html","id":"median-scaling","dir":"Articles","previous_headings":"Data normalization","what":"Median scaling","title":"Complete end-to-end LC-MS/MS Metabolomic Data analysis","text":"method involves computing median sample, followed determining median individual sample medians. ensures consistent median values sample throughout entire data set. Maintaining uniformity average total metabolite abundance across samples crucial effective implementation. process aims establish shared baseline central tendency metabolite abundance, mitigating impact sample-specific technical variations. approach fosters robust comparable analysis top features across data set. assumption normalizing based median, known lower sensitivity extreme values, enhances comparability top features ensures consistent average abundance across samples. median scaling calculated imputed non-imputed data, set stored separately within SummarizedExperiment object. approach facilitates testing various normalization strategies maintaining record processing steps undertaken, enabling easy regression previous stages necessary.","code":"#' Compute median and generate normalization factor mdns <- apply(assay(res, \"raw_filled\"), MARGIN = 2,               median, na.rm = TRUE ) nf_mdn <- mdns / median(mdns)  #' divide dataset by median of median and create a new assay. assays(res)$norm <- sweep(assay(res, \"raw_filled\"), MARGIN = 2, nf_mdn, '/') assays(res)$norm_imputed <- sweep(assay(res, \"raw_filled_imputed\"), MARGIN = 2,                                   nf_mdn, '/')"},{"path":"https://rformassspectrometry.github.io/metabonaut/articles/a-end-to-end-untargeted-metabolomics.html","id":"assessing-overall-effectiveness-of-the-normalization-approach","dir":"Articles","previous_headings":"","what":"Assessing overall effectiveness of the normalization approach","title":"Complete end-to-end LC-MS/MS Metabolomic Data analysis","text":"crucial evaluate effectiveness normalization process. can achieved comparing distribution log2 transformed feature abundances normalization. Additionally, RLA plots can used assess tightness replicates within groups compare behavior groups.  Figure 31. PC1 PC2 data normalization. Normalization large impact PC1 PC2, separation study groups PC3 seems better difference QC samples lower normalization (see ).  Figure 32. PC3 PC4 data normalization. PCA plots show normalization process changed overall structure data. separation study QC samples remains . expected results normalization correct biological variance technical. compare RLA plots -sample normalization evaluate impact data.  Figure 33. RLA plot normalization. normalization process effectively centered data around median medians samples now closer zero. next evaluate coefficient variation (CV, also referred relative standard deviation RSD) features across samples either QC study samples. QC samples, CV represent technical noise, study samples include also expected biological differences. Thus, normalization reduce CV QC samples, slightly reducing CV study samples. CV calculated using rowRsd() function MetaboCoreUtils package. setting mad = TRUE use robust calculation using median absolute deviation instead standard deviation. Table 6. Distribution CV values across samples raw normalized data. table shows distribution CV raw normalized data. first column highlights % data given CV value, e.g. 25% data CV equal lower 0.04557 QC_raw data. anticipated, CV values QCs, reflect technical variance, lower compared study samples, include technical biological variance. Overall, minimal disparity exists raw normalized data, positive indication normalization process introduced bias dataset, also reflects little differences average abundances sample raw data. overall conclusion normalization process little variance present beginning, normalization however able center data around median (shown RLA plot). Given simplicity limited size example dataset, conclude normalization process stage. intricate datasets diverse biases, tailored approach devised. include also approaches adjust signal drifts batch effects. One possible option use linear-model based approach can example applied adjust_lm() function MetaboCoreUtils package.","code":"#' Data before normalization vals_st <- cbind(vals, phenotype = res$phenotype) pca_raw <- autoplot(pca_res, data = vals_st,                     colour = 'phenotype', scale = 0) +     scale_color_manual(values = col_phenotype)  #' Data after normalization vals_norm <- apply(assay(res, \"norm\"), MARGIN = 1, na_unidis) |>     log2() |>     scale(center = TRUE, scale = TRUE)  pca_res_norm <- prcomp(vals_norm, scale = FALSE, center = FALSE) vals_st_norm <- cbind(vals_norm, phenotype = res$phenotype) pca_adj <- autoplot(pca_res_norm, data = vals_st_norm,                     colour = 'phenotype', scale = 0) +     scale_color_manual(values = col_phenotype)  grid.arrange(pca_raw, pca_adj, ncol = 2) pca_raw <- autoplot(pca_res, data = vals_st ,                     colour = 'phenotype', x = 3, y = 4, scale = 0) +     scale_color_manual(values = col_phenotype) pca_adj <- autoplot(pca_res_norm, data = vals_st_norm,                     colour = 'phenotype', x = 3, y = 4, scale = 0) +     scale_color_manual(values = col_phenotype)  grid.arrange(pca_raw, pca_adj, ncol = 2) par(mfrow = c(2, 1), mar = c(3.5, 4.5, 2.5, 1))  boxplot(rowRla(assay(res, \"raw_filled\"), group = res$phenotype),         cex = 0.5, pch = 16, ylab = \"RLA\", border = col_sample,         col = paste0(col_sample, 80), cex.main = 1, outline = FALSE,         xaxt = \"n\", main = \"Raw data\", boxwex = 1) grid(nx = NA, ny = NULL) legend(\"topright\", inset = c(0, -0.2), col = col_phenotype,        legend = names(col_phenotype), lty=1, lwd = 2, xpd = TRUE,        ncol = 3, cex = 0.7, bty = \"n\") abline(h = 0, lty=3, lwd = 1, col = \"black\")  boxplot(rowRla(assay(res, \"norm\"), group = res$phenotype),         cex = 0.5, pch = 16, ylab = \"RLA\", border = col_sample,         col = paste0(col_sample, 80), boxwex = 1, outline = FALSE,         xaxt = \"n\", main = \"Normallized data\", cex.main = 1) axis(side = 1, at = seq_len(ncol(res)), labels = res$sample_name) grid(nx = NA, ny = NULL) abline(h = 0, lty = 3, lwd = 1, col = \"black\") #' Calculate the CV values index_study <- res$phenotype %in% c(\"CTR\", \"CVD\") index_QC <- res$phenotype == \"QC\"  sample_res <- cbind(     QC_raw = rowRsd(assay(res, \"raw_filled\")[, index_QC],                     na.rm = TRUE, mad = TRUE),     QC_norm = rowRsd(assay(res, \"norm\")[, index_QC],                      na.rm = TRUE, mad = TRUE),     Study_raw = rowRsd(assay(res, \"raw_filled\")[, index_study],                        na.rm = TRUE, mad = TRUE),     Study_norm = rowRsd(assay(res, \"norm\")[, index_study],                         na.rm = TRUE, mad = TRUE) )  #' Summarize the values across features res_df <- data.frame(     QC_raw = quantile(sample_res[, \"QC_raw\"], na.rm = TRUE),     QC_norm = quantile(sample_res[, \"QC_norm\"], na.rm = TRUE),     Study_raw = quantile(sample_res[, \"Study_raw\"], na.rm = TRUE),     Study_norm = quantile(sample_res[, \"Study_norm\"], na.rm = TRUE) )  kable(res_df, format = \"pipe\")"},{"path":"https://rformassspectrometry.github.io/metabonaut/articles/a-end-to-end-untargeted-metabolomics.html","id":"principal-component-analysis-1","dir":"Articles","previous_headings":"Data normalization","what":"Principal Component Analysis","title":"Complete end-to-end LC-MS/MS Metabolomic Data analysis","text":"Figure 31. PC1 PC2 data normalization. Normalization large impact PC1 PC2, separation study groups PC3 seems better difference QC samples lower normalization (see ).  Figure 32. PC3 PC4 data normalization. PCA plots show normalization process changed overall structure data. separation study QC samples remains . expected results normalization correct biological variance technical.","code":"#' Data before normalization vals_st <- cbind(vals, phenotype = res$phenotype) pca_raw <- autoplot(pca_res, data = vals_st,                     colour = 'phenotype', scale = 0) +     scale_color_manual(values = col_phenotype)  #' Data after normalization vals_norm <- apply(assay(res, \"norm\"), MARGIN = 1, na_unidis) |>     log2() |>     scale(center = TRUE, scale = TRUE)  pca_res_norm <- prcomp(vals_norm, scale = FALSE, center = FALSE) vals_st_norm <- cbind(vals_norm, phenotype = res$phenotype) pca_adj <- autoplot(pca_res_norm, data = vals_st_norm,                     colour = 'phenotype', scale = 0) +     scale_color_manual(values = col_phenotype)  grid.arrange(pca_raw, pca_adj, ncol = 2) pca_raw <- autoplot(pca_res, data = vals_st ,                     colour = 'phenotype', x = 3, y = 4, scale = 0) +     scale_color_manual(values = col_phenotype) pca_adj <- autoplot(pca_res_norm, data = vals_st_norm,                     colour = 'phenotype', x = 3, y = 4, scale = 0) +     scale_color_manual(values = col_phenotype)  grid.arrange(pca_raw, pca_adj, ncol = 2)"},{"path":"https://rformassspectrometry.github.io/metabonaut/articles/a-end-to-end-untargeted-metabolomics.html","id":"intensity-evaluation-1","dir":"Articles","previous_headings":"Data normalization","what":"Intensity evaluation","title":"Complete end-to-end LC-MS/MS Metabolomic Data analysis","text":"compare RLA plots -sample normalization evaluate impact data.  Figure 33. RLA plot normalization. normalization process effectively centered data around median medians samples now closer zero.","code":"par(mfrow = c(2, 1), mar = c(3.5, 4.5, 2.5, 1))  boxplot(rowRla(assay(res, \"raw_filled\"), group = res$phenotype),         cex = 0.5, pch = 16, ylab = \"RLA\", border = col_sample,         col = paste0(col_sample, 80), cex.main = 1, outline = FALSE,         xaxt = \"n\", main = \"Raw data\", boxwex = 1) grid(nx = NA, ny = NULL) legend(\"topright\", inset = c(0, -0.2), col = col_phenotype,        legend = names(col_phenotype), lty=1, lwd = 2, xpd = TRUE,        ncol = 3, cex = 0.7, bty = \"n\") abline(h = 0, lty=3, lwd = 1, col = \"black\")  boxplot(rowRla(assay(res, \"norm\"), group = res$phenotype),         cex = 0.5, pch = 16, ylab = \"RLA\", border = col_sample,         col = paste0(col_sample, 80), boxwex = 1, outline = FALSE,         xaxt = \"n\", main = \"Normallized data\", cex.main = 1) axis(side = 1, at = seq_len(ncol(res)), labels = res$sample_name) grid(nx = NA, ny = NULL) abline(h = 0, lty = 3, lwd = 1, col = \"black\")"},{"path":"https://rformassspectrometry.github.io/metabonaut/articles/a-end-to-end-untargeted-metabolomics.html","id":"coefficient-of-variation","dir":"Articles","previous_headings":"Data normalization","what":"Coefficient of variation","title":"Complete end-to-end LC-MS/MS Metabolomic Data analysis","text":"next evaluate coefficient variation (CV, also referred relative standard deviation RSD) features across samples either QC study samples. QC samples, CV represent technical noise, study samples include also expected biological differences. Thus, normalization reduce CV QC samples, slightly reducing CV study samples. CV calculated using rowRsd() function MetaboCoreUtils package. setting mad = TRUE use robust calculation using median absolute deviation instead standard deviation. Table 6. Distribution CV values across samples raw normalized data. table shows distribution CV raw normalized data. first column highlights % data given CV value, e.g. 25% data CV equal lower 0.04557 QC_raw data. anticipated, CV values QCs, reflect technical variance, lower compared study samples, include technical biological variance. Overall, minimal disparity exists raw normalized data, positive indication normalization process introduced bias dataset, also reflects little differences average abundances sample raw data.","code":"#' Calculate the CV values index_study <- res$phenotype %in% c(\"CTR\", \"CVD\") index_QC <- res$phenotype == \"QC\"  sample_res <- cbind(     QC_raw = rowRsd(assay(res, \"raw_filled\")[, index_QC],                     na.rm = TRUE, mad = TRUE),     QC_norm = rowRsd(assay(res, \"norm\")[, index_QC],                      na.rm = TRUE, mad = TRUE),     Study_raw = rowRsd(assay(res, \"raw_filled\")[, index_study],                        na.rm = TRUE, mad = TRUE),     Study_norm = rowRsd(assay(res, \"norm\")[, index_study],                         na.rm = TRUE, mad = TRUE) )  #' Summarize the values across features res_df <- data.frame(     QC_raw = quantile(sample_res[, \"QC_raw\"], na.rm = TRUE),     QC_norm = quantile(sample_res[, \"QC_norm\"], na.rm = TRUE),     Study_raw = quantile(sample_res[, \"Study_raw\"], na.rm = TRUE),     Study_norm = quantile(sample_res[, \"Study_norm\"], na.rm = TRUE) )  kable(res_df, format = \"pipe\")"},{"path":"https://rformassspectrometry.github.io/metabonaut/articles/a-end-to-end-untargeted-metabolomics.html","id":"conclusion-on-normalization","dir":"Articles","previous_headings":"Data normalization","what":"Conclusion on normalization","title":"Complete end-to-end LC-MS/MS Metabolomic Data analysis","text":"overall conclusion normalization process little variance present beginning, normalization however able center data around median (shown RLA plot). Given simplicity limited size example dataset, conclude normalization process stage. intricate datasets diverse biases, tailored approach devised. include also approaches adjust signal drifts batch effects. One possible option use linear-model based approach can example applied adjust_lm() function MetaboCoreUtils package.","code":""},{"path":"https://rformassspectrometry.github.io/metabonaut/articles/a-end-to-end-untargeted-metabolomics.html","id":"quality-control-feature-prefiltering","dir":"Articles","previous_headings":"","what":"Quality control: Feature prefiltering","title":"Complete end-to-end LC-MS/MS Metabolomic Data analysis","text":"normalizing data can now pre-filter clean data performing statistical analysis. general, pre-filtering samples features performed remove outliers. copy original result object also keep unfiltered data later comparisons. eliminate features exhibit high variability dataset. Repeatedly measured QC samples typically serve robust basis cleansing datasets allowing identify features excessively high noise. data set external QC samples used, .e. pooled samples different collection using slightly different sample matrix, utility filtering somewhat limited. comprehensive description guidelines data filtering untargeted metabolomic studies, please refer [@broadhurst_guidelines_2018]. first restrict data set features chromatographic peak detected least 2/3 samples least one study samples groups. ensures statistical tests carried later study samples performed reliable signal. Also, filter remove features mostly detected QC samples, study samples. filter can performed filterFeatures() function xcms package PercentMissingFilter setting. parameters filer: threshold: defines maximal acceptable percentage samples missing value(s) least one sample groups defined parameter f. f: factor defining sample groups. replacing \"QC\" sample group NA parameter f exclude QC samples evaluation consider study samples. threshold = 40 keep features peak detected 2 3 samples one sample groups. consider detected chromatographic peaks per sample, apply filter \"raw\" assay result object, contains abundance values detected chromatographic peaks (prior gap-filling). Following guidelines stated decided still use QC samples pre-filtering, basis represent similar bio-fluids study samples, thus, anticipate observing relatively similar metabolites affected similar measurement biases. therefore evaluate dispersion ratio (Dratio) [@broadhurst_guidelines_2018] features data set. accomplish task using function time DratioFilter parameter. filters exist function invite user explore decide best dataset. Dratio filter powerful tool identify features exhibit high variability data, relating variance observed QC samples study samples. setting threshold 0.4, remove features high degree variability QC study samples. example, feature deviation QC higher 40% (threshold = 0.4)deviation study samples removed. filtering step ensures features retained considerably lower technical biological variance. Note rowDratio() rowRsd() functions MetaboCoreUtils package used calculate actual numeric values estimates used filtering, e.g. evaluate distribution whole data set identify data set-dependent threshold values. Finally, evaluate number features left filtering steps calculate percentage features removed. dataset reduced 9068 4277 features. remove considerable amount features expected want focus reliable features analysis. rest analysis need separate QC samples study samples. store QC samples separate object later use. addition calculate CV QC samples add additional column rowData() result object. used later prioritize identified significant features e.g. low technical noise. Now data set preprocessed, normalized filtered, can start evaluate distribution data estimate variation due biology.","code":"#' Number of features before filtering nrow(res) [1] 9068 #' keep unfiltered object res_unfilt <- res #' Limit features to those with at least two detected peaks in one study group. #' Setting the value for QC samples to NA excludes QC samples from the #' calculation. f <- res$phenotype f[f == \"QC\"] <- NA f <- as.factor(f) res <- filterFeatures(res, PercentMissingFilter(f = f, threshold = 40),                       assay = \"raw\") 1808 features were removed #' Compute and filter based on the Dratio filter_dratio <- DratioFilter(threshold = 0.4,                               qcIndex = res$phenotype == \"QC\",                               studyIndex = res$phenotype != \"QC\",                               mad = TRUE) res <- filterFeatures(res, filter = filter_dratio, assay = \"norm_imputed\") 2983 features were removed #' Number of features after analysis nrow(res) [1] 4277 #' Percentage left: end/beginning nrow(res)/nrow(res_unfilt) * 100 [1] 47.16586 res_qc <- res[, res$phenotype == \"QC\"] res <- res[, res$phenotype != \"QC\"] #' Calculate the QC's CV and add as feature variable to the data set rowData(res)$qc_cv <- assay(res_qc, \"norm\") |>                rowRsd()"},{"path":"https://rformassspectrometry.github.io/metabonaut/articles/a-end-to-end-untargeted-metabolomics.html","id":"differential-abundance-analysis","dir":"Articles","previous_headings":"","what":"Differential abundance analysis","title":"Complete end-to-end LC-MS/MS Metabolomic Data analysis","text":"normalization quality control, next step identify features differentially abundant study groups. crucial step allows us identify potential biomarkers metabolites associated study groups. various approaches methods available identification features interest. workflow use multiple linear regression analysis identify features significantly difference abundances CVD CTR study group. performing tests evaluate similarities study samples using PCA (excluding QC samples avoid influencing results).  Figure 34. PCA data normalization quality control. samples clearly separate study group PCA indicating differences metabolite profiles two groups. However, drives separation PC1 clear. evaluate whether explained available variable study, .e., age:  Figure 35. PCA colored age data normalization quality control. According PCA , PC1 seem related age. Even variance data set can’t explain stage, proceed (supervised) statistical tests identify features interest. compute linear models metabolite explaining observed feature abundance available study variables. also use base R function lm(), utilize R Biocpkg(\"limma\") package conduct differential abundance analysis: moderated test statistics [@smyth_linear_2004] provided package specifically well suited experiments limited number replicates. tests use linear model ~ phenotype + age, hence explaining abundances one metabolite accounting study group assignment age individual. analysis might benefit inclusion study covariate associated PC2 explaining variance seen principal component, present analysis participant’s age disease association provided. define design study model.matrix() function fit feature-wise linear models log2-transformed abundances using lmFit() function. P-values significance association calculated using eBayes() function, also performs empirical Bayes-based robust estimation standard errors. See also excellent vignette/user guide limma package examples details linear model procedure. linear models fitted, can now proceed extract results. create data frame containing coefficients, raw adjusted p-values (applying Benjamini-Hochberg correction, .e., method = \"BH\" improved control false discovery rate), average intensity signals CVD CTR samples, indication whether feature deemed significant . consider metabolites adjusted p-value smaller 0.05 significant, also include (absolute) difference abundances cut-criteria. last, add differential abundance results result object’s rowData(). can now proceed visualize distribution raw adjusted p-values.  Figure 36. Distribution raw (left) adjusted p-values (right). histograms show distribution raw adjusted p-values. Except enrichment small p-values, raw p-values (less) uniformly distributed, indicates absence strong systematic biases data. adjusted p-values conservative account multiple testing; important fit linear model feature therefore perform large number tests leads high chance false positive findings. see features low p-values, indicating likely significantly different two study groups. plot adjusted p-values log2 fold change (average) abundances. volcano plot allow us visualize features significantly different two study groups. highlighted blue color plot .  Figure 37. Volcano plot showing analysis results. interesting features top corners volcano plot (.e., features large difference abundance groups small p-value). significant features negative coefficient (log2 fold change value) indicating abundance lower CVD samples compared CTR samples. features listed, along average difference (log2) abundance compared groups, adjusted p-values, average (log2) abundance sample group RSD (CV) QC samples table . Table 7. Features significant differences abundances. visualize EICs significant features evaluate (raw) signal. restrict MS data set study samples. Parameters keepFeatures = TRUE: ensures identified features retained `subset object. peakBg: defines (background) color individual chromatographic peak EIC object.  Figure 38. Extracted ion chromatograms significant features. EICs significant features show clear single peak. intensities (already observed ) much larger CTR CVD samples. exception second feature (second EIC top row), intensities significant features however generally low. might make challenging identify using LC-MS/MS setup.","code":"#' Define the colors for the plot col_sample <- col_phenotype[res$phenotype]  #' Log transform and scale the data for PCA analysis vals <- assay(res, \"norm_imputed\") |>     t() |>     log2() |>     scale(center = TRUE, scale = TRUE) pca_res <- prcomp(vals, scale = FALSE, center = FALSE)  vals_st <- cbind(vals, phenotype = res$phenotype) autoplot(pca_res, data = vals_st , colour = 'phenotype', scale = 0) +     scale_color_manual(values = col_phenotype) #' Add age to the PCA plot vals_st <- cbind(vals, age = res$age) autoplot(pca_res, data = vals_st , colour = 'age', scale = 0) #' Define the linear model to be applied to the data p.cut <- 0.05     # cut-off for significance. m.cut <- 0.5      # cut-off for log2 fold change  age <- res$age phenotype <- factor(res$phenotype) design <- model.matrix(~ phenotype + age)  #' Fit the linear model to the data, explaining metabolite #' concentrations by phenotype and age. fit <- lmFit(log2(assay(res, \"norm_imputed\")), design = design) fit <- eBayes(fit) #' Compile a result data frame tmp <- data.frame(     coef.CVD = fit$coefficients[, \"phenotypeCVD\"],     pvalue.CVD = fit$p.value[, \"phenotypeCVD\"],     adjp.CVD = p.adjust(fit$p.value[, \"phenotypeCVD\"], method = \"BH\"),     avg.CVD = rowMeans(         log2(assay(res, \"norm_imputed\")[, res$phenotype == \"CVD\"])),     avg.CTR = rowMeans(         log2(assay(res, \"norm_imputed\")[, res$phenotype == \"CTR\"])) ) tmp$significant.CVD <- tmp$adjp.CVD < 0.05 #' Add the results to the object's rowData rowData(res) <- cbind(rowData(res), tmp) #' Plot the distribution of p-values par(mfrow = c(1, 2)) hist(rowData(res)$pvalue.CVD, breaks = 64, xlab = \"p value\",      main = \"Distribution of raw p-values\",      cex.main = 1, cex.lab = 1, cex.axis = 1) hist(rowData(res)$adjp.CVD, breaks = 64, xlab = expression(p[BH]~value),      main = \"Distribution of adjusted p-values\",      cex.main = 1, cex.lab = 1, cex.axis = 1) #' Plot volcano plot of the statistical results par(mfrow = c(1, 1), mar = c(5, 5, 5, 1)) plot(rowData(res)$coef.CVD, -log10(rowData(res)$adjp.CVD),      xlab = expression(log[2]~difference),      ylab = expression(-log[10]~p[BH]), pch = 16, col = \"#00000060\",      cex.main = 1.5, cex.lab = 1.5, cex.axis = 1.3) grid() abline(h = -log10(0.05), col = \"#0000ffcc\") if (any(rowData(res)$significant.CVD)) {     points(rowData(res)$coef.CVD[rowData(res)$significant.CVD],            -log10(rowData(res)$adjp.CVD[rowData(res)$significant.CVD]),            col = \"#0000ffcc\") } # Table of significant features tab <- rowData(res)[rowData(res)$significant.CVD,                     c(\"mzmed\", \"rtmed\", \"coef.CVD\", \"adjp.CVD\",                       \"avg.CTR\", \"avg.CVD\", \"qc_cv\")] |>     as.data.frame() tab <- tab[order(abs(tab$coef.CVD), decreasing = TRUE), ] kable(tab, format = \"pipe\") #' Restrict the raw data to study samples. lcms1_study <- lcms1[sampleData(lcms1)$phenotype != \"QC\", keepFeatures = TRUE] #' Extract EICs for the significant features eic_sign <- featureChromatograms(     lcms1_study, features = rownames(tab), expandRt = 5, filled = TRUE)  #' Plot the EICs. plot(eic_sign, col = col_sample,      peakBg = paste0(col_sample[chromPeaks(eic_sign)[, \"sample\"]], 40)) legend(\"topright\", col = col_phenotype, legend = names(col_phenotype), lty = 1)"},{"path":"https://rformassspectrometry.github.io/metabonaut/articles/a-end-to-end-untargeted-metabolomics.html","id":"annotation","dir":"Articles","previous_headings":"","what":"Annotation","title":"Complete end-to-end LC-MS/MS Metabolomic Data analysis","text":"now identified features significant differences abundances two study groups. provide information metabolic pathways differentiate affected healthy individuals might hence also serve biomarkers. However, stage analysis know compounds/metabolites actually represent. thus need now annotate signals. Annotation can performed different level confidence [@sumner_proposed_2007,@schymanski_identifying_2014]. lowest level annotation, highest rate false positive hits, bases features m/z ratios. Higher levels annotations employ fragment spectra (MS2 spectra) ions interest requiring however acquisition additional data. section, demonstrate multiple ways annotate significant features using functionality provided Bioconductor packages. Alternative approaches external software tools, may better suited, also discussed later section. data set acquired using LC-MS setup features thus characterized m/z retention times. retention time LC-setup-specific , without prior data/knowledge provide little information features’ identity. Modern MS instruments high accuracy m/z values therefore reliable estimates compound ion’s mass--charge ratio. first approach, use features’ m/z values match reference values, .e., exact masses chemical compounds provided reference database, case MassBank database. full MassBank data re-distributed Bioconductor’s AnnotationHub resource, simplifies integration reproducible R-based analysis workflows. load resource, list available MassBank data sets/releases load one . MassBank data provided self-contained SQLite database data can queried accessed CompoundDb Bioconductor package. use compounds() function extract small compound annotations database. MassBank (small compound annotation databases) provides (exact) molecular mass compound. Since almost small compounds neutral natural state, need first converted m/z values allow matching feature’s m/z. calculate m/z neutral mass, need assume ion (adduct) might generated measured metabolites employed electro-spray ionization. positive polarity, human serum samples, common ions protonated ([M+H]+), bear addition sodium ([M+Na]+) ammonium ([M+H-NH3]+) ions. match observed m/z values reference values potential ions use matchValues() function Mass2MzParam approach, allows specify types expected ions adducts parameter maximal allowed difference compared values using tolerance ppm parameters. first prepare data.frame significant features, set parameters matching perform comparison query features reference database. resulting Matched object shows 4 6 significant features matched ions compounds MassBank database. extract full result Matched object. Thus, total 237 ions compounds MassBank matched significant features based specified tolerance settings. Many compounds, different structure thus function/chemical property, identical chemical formula thus mass. Matching exclusively m/z features hence result many potentially false positive hits thus considered provide low confidence annotation. additional complication annotation resources, like MassBank, community maintained, contain large amount redundant information. reduce redundancy result table iterate hits feature keep matches unique compounds (identified INCHIKEY). INCHI INCHIKEY combine information compound’s chemical formula structure, different compounds can share chemical formula, different structure thus INCHI. Table 9. MS1 annotation results. table shows results MS1-based annotation process. can see four significant features matched. matches seem pretty accurate low ppm errors. deduplication performed considerably reduced number hits feature, first still matches ions large number compounds (chemical formula). Considering features’ m/z retention times MS1-based annotation increase annotation confidence, requires additional data, recording retention time thepure standard compound LC setup. alternative approach might provide better inside annotations help choose different annotations feature evaluate certain chemical properties possible matches. instance, LogP value, available several databases HMDB, provides insight given compound’s polarity. property highly affects interaction analyte column, usually also directly affects separation. Therefore, comparison analyte’s retention time polarity can help rule possible misidentifications. low confidence, MS1-based annotation can provide first candidate annotations confirmed rejected additional analyses. MS1 annotation fast efficient method annotate features therefore give first insight compounds significantly different two study groups. However, always accurate. MS2 data can provide higher level confidence annotation process provides, observed fragmentation pattern, information structure compound. MS2 data can generated LC-MS/MS measurement MS2 spectra recorded ions either data dependent acquisition (DDA) data independent acquisition (DIA) mode. Generally, advised include LC-MS/MS runs QC samples randomly selected study samples already acquisition MS1 data used quantification signals. alternative, addition, post-hoc LC-MS/MS acquisition can performed generate MS2 data needed annotation. present experiment, separate LC-MS/MS measurement conducted QC samples selected study samples generate data using inclusion list pre-selected ions. represent features found significantly different CVD CTR samples initial analysis full experiment. use subset second LC-MS/MS data set show data can used MS2-based annotation. differential abundance analysis found features significantly higher abundances CTR samples. Consequently, utilize MS2 data obtained CTR samples annotate significant features. load LC-MS/MS data experiment restrict data acquired CTR sample. Table 10. Samples LC-MS/MS data set. total 3 LC-MS/MS data files control samples, different collision energy fragment ions. show number MS1 MS2 spectra files. Compared number MS2 spectra, far less MS1 spectra acquired. configuration MS instrument set ensure ions specified inclusion list selected fragmentation, even intensity might low. setting, however, recorded MS2 spectra represent noise. plot shows location precursor ions m/z - retention time plane three files.  can see MS2 spectra recorded m/z interest along full retention time range, even actual ions eluting within certain retention time windows. next extract Spectra object MS data data object assign new spectra variable employed collision energy, extract data object sampleData. next filter MS data first restricting MS2 spectra removing mass peaks spectrum intensity lower 5% highest intensity spectrum, assuming low intensity peaks represent background signal. next remove also mass peaks m/z value greater equal precursor m/z ion. puts, later matching reference spectra, weight fragmentation pattern ions avoids hits based precursor m/z peak (hence similar mass compared compounds). last, restrict data spectra least two fragment peaks scale intensities sum 1 spectrum. similarity calculations affected scaling, makes visual comparison fragment spectra easier read. Finally, also speed later comparison spectra reference database, load full MS data memory (changing backend MsBackendMemory) apply processing steps performed data far. Keeping MS data memory performance benefits, generally suggested large data sets. evaluate impact present data set print addition size data object changing backend. thus moderate increase memory demand loading MS data memory (also filtered cleaned MS2 data). proceed match experimental MS2 spectra reference fragment spectra, workflow aim annotate features found significant differential abundance analysis. goal thus identify MS2 spectra second (LC-MS/MS) run represent fragments ions features data first (LC-MS) run. approach match MS2 spectra significant features determined earlier based precursor m/z retention time (given acceptable tolerance) feature’s m/z retention time. can easily done using featureArea() function effectively considers actual m/z retention time ranges features’ chromatographic peaks therefore increase chance finding correct match. however also assumes retention times first second run don’t differ much. Alternatively, need align retention times second LC-MS/MS data set first. first extract feature area, .e., m/z retention time ranges, significant features. next identify fragment spectra precursor m/z retention times within ranges. use filterRanges() function allows filter Spectra object using multiple ranges simultaneously. apply function separately feature (row matrix) extract MS2 spectra representing fragmentation information presumed feature’s ions. result apply() call list Spectra, element representing result one feature. exception last feature, multiple MS2 spectra identified. next combine list Spectra single Spectra object using concatenateSpectra() function add additional spectra variable containing respective feature identifier. now Spectra object fragment spectra significant features differential expression analysis. next build reference data need process way query spectra. extract fragment spectra MassBank database, restrict positive polarity data (since experiment acquired positive polarity) perform processing fragment spectra MassBank database. Note switch MsBackendMemory backend hence loading full data reference database memory. positive impact performance subsequent spectra matching, however also increase memory demand present analysis. Now Spectra object second run database spectra prepared, can proceed matching process. use matchSpectra() function MetaboAnnotation package CompareSpectraParam define settings matching. following parameters: requirePrecursor = TRUE: Limits spectra similarity calculations fragment spectra similar precursor m/z. tolerance ppm: Defines acceptable difference compared m/z values. relaxed tolerance settings ensure find matches even reference spectra acquired instruments lower accuracy. THRESHFUN: Defines matches report. , keep matches resulting spectra similarity score (calculated normalized dot product [@stein_optimization_1994], default similarity function) larger 0.6. Thus, total 315 query MS2 spectra, 16 matched (least) one reference fragment spectrum. restrict results matching spectra extract metadata query target spectra well similarity score (complete list available metadata information can listed colnames() function). Now, query-target pairs spectra similarity higher 0.6. Similar MS1-based annotation also result table contains redundant information: multiple fragment spectra per feature also MassBank contains several fragment spectra compound, measured using differing collision energies MS instruments, different laboratories. thus iterate feature-compound pairs select one highest score. identifier compound, use fragment spectra’s INCHI-key, since compound names MassBank accepted consensus/controlled vocabularies. Table 9.MS2 annotation results. Thus, 5 significant features, one annotated compound based MS2-based approach. many reasons failure find matches features. Although MS2 spectra selected feature, appear represent noise, features, LC-MS/MS run, low MS1 signal recorded, indicating selected sample original compound might (longer) present. Also, reference databases contain predominantly fragment spectra protonated ([M+H]+) ions compounds, features might represent signal types ions result different fragmentation pattern. Finally, fragment spectra compounds interest might also simply present used reference database. Thus, combining information MS1- MS2 based annotation can annotate one feature considerable confidence. feature m/z 195.0879 retention time 32 seconds seems ion caffeine. result somewhat disappointing also clearly shows importance proper experimental planning need control potential confounding factors. present experiment, disease-specific biomarker identified, life-style property individuals suffering disease: coffee consumption probably contraindicated patients CVD group reduce risk heart arrhythmia. plot EIC feature highlighting retention time highest scoring MS2 spectra recorded create mirror plot comparing MS2 spectra reference fragment spectra caffeine.  plot clearly shows higher signal feature CTR compared CVD samples. QC samples exhibit lower highly consistent signal, suggesting absence strong technical noise biases raw data experiment. vertical line indicates retention time fragment spectrum best match reference spectrum. noted , since fragment spectra measured separate LC-MS/MS experiment, considered indication approximate retention time ions fragmented second experiment. fragment spectrum feature, shown upper panel right plot highly similar reference spectrum caffeine MassBank (shown lower panel). addition matching precursor m/z, two fragments (m/z intensity) present spectra. can also extract additional metadata matching reference spectrum, used collision energy, fragmentation mode, instrument type, instrument well ion (adduct) fragmented. present workflow highlights annotation performed within R using packages Bioconductor project, also excellent external softwares used alternative, SIRIUS [@duhrkop_sirius_2019], mummichog [@li_predicting_2013] GNPS [@nothias_feature-based_2020] among others. use , data need exported format supported . MS2 spectra, data easily exported required MGF file format using MsBackendMgf Bioconductor package. Integration xcms feature-based molecular networking GNPS described GNPS documentation. alternative, addition, evidence potential matching chemical formula feature derived evaluating isotope pattern full MS1 scan. provide information isotope composition. Also , various functions isotopologues() MetaboCoreUtils package functionality envipat R package [@loos_accelerated_2015] used.","code":"#' load reference data ah <- AnnotationHub() #' List available MassBank data sets query(ah, \"MassBank\") AnnotationHub with 6 records # snapshotDate(): 2024-10-14 # $dataprovider: MassBank # $species: NA # $rdataclass: CompDb # additional mcols(): taxonomyid, genome, description, #   coordinate_1_based, maintainer, rdatadateadded, preparerclass, tags, #   rdatapath, sourceurl, sourcetype # retrieve records with, e.g., 'object[[\"AH107048\"]]'               title   AH107048 | MassBank CompDb for release 2021.03   AH107049 | MassBank CompDb for release 2022.06   AH111334 | MassBank CompDb for release 2022.12.1   AH116164 | MassBank CompDb for release 2023.06   AH116165 | MassBank CompDb for release 2023.09   AH116166 | MassBank CompDb for release 2023.11 #' Load one MAssBank release mb <- ah[[\"AH116166\"]] downloading 1 resources retrieving 1 resource loading from cache #' Extract compound annotations cmps <- compounds(mb, columns = c(\"compound_id\", \"name\", \"formula\",                                   \"exactmass\", \"inchikey\")) head(cmps) compound_id       formula exactmass                    inchikey 1           1    C27H29NO11  543.1741 AOJJSUZBOXZQNB-UHFFFAOYSA-N 2           2      C40H54O4  598.4022 KFNGKYUGHHQDEE-AXWOCEAUSA-N 3           3    C10H24N2O2  204.1838 AEUTYOVWOVBAKS-UWVGGRQHSA-N 4           4     C16H27NO5  313.1889 LMFKRLGHEKVMNT-UJDVCPFMSA-N 5           5 C20H15Cl3N2OS  435.9971 JLGKQTAYUIMGRK-UHFFFAOYSA-N 6           6      C15H14O5  274.0841 BWNCKEBBYADFPQ-UHFFFAOYSA-N                   name 1           Epirubicin 2 Crassostreaxanthin A 3           Ethambutol 4           Heliotrine 5        Sertaconazole 6    (R)Semivioxanthin #' Prepare query data frame rowData(res)$feature_id <- rownames(rowData(res)) res_sig <- res[rowData(res)$significant.CVD, ]  #' Setup parameters for the matching param <- Mass2MzParam(adducts = c(\"[M+H]+\", \"[M+Na]+\", \"[M+H-NH3]+\"),                       tolerance = 0, ppm = 5)  #' Perform the matching. mtch <- matchValues(res_sig, cmps, param = param, mzColname = \"mzmed\") mtch Object of class Matched Total number of matches: 237 Number of query objects: 5 (4 matched) Number of target objects: 117732 (237 matched) #' Extracting the results mtch_res <- matchedData(mtch, c(\"feature_id\", \"mzmed\", \"rtmed\",                                 \"adduct\", \"ppm_error\",                                 \"target_formula\", \"target_name\",                                 \"target_inchikey\")) mtch_res DataFrame with 238 rows and 8 columns         feature_id     mzmed     rtmed      adduct ppm_error target_formula                 FT0371      FT0371   138.055   148.396      [M+H]+   2.08055        C7H7NO2 FT0371      FT0371   138.055   148.396      [M+H]+   1.93568        C7H7NO2 FT0371      FT0371   138.055   148.396      [M+H]+   1.93568        C7H7NO2 FT0371      FT0371   138.055   148.396      [M+H]+   1.93568        C7H7NO2 FT0371      FT0371   138.055   148.396      [M+H]+   2.08055        C7H7NO2 ...            ...       ...       ...         ...       ...            ... FT1171      FT1171    229.13   181.088     [M+Na]+   3.07708      C12H18N2O FT1171      FT1171    229.13   181.088     [M+Na]+   3.07708      C12H18N2O FT1171      FT1171    229.13   181.088     [M+Na]+   3.07708      C12H18N2O FT1171      FT1171    229.13   181.088     [M+Na]+   3.07708      C12H18N2O FT1171      FT1171    229.13   181.088     [M+Na]+   3.07708      C12H18N2O          target_name target_inchikey                FT0371 Benzohydro...   VDEUYMSGMP... FT0371 Trigonelli...   WWNNZCOKKK... FT0371 Trigonelli...   WWNNZCOKKK... FT0371 Trigonelli...   WWNNZCOKKK... FT0371 Salicylami...   SKZKKFZAGN... ...              ...             ... FT1171 Isoproturo...   PUIYMUZLKQ... FT1171 Isoproturo...   PUIYMUZLKQ... FT1171 Isoproturo...   PUIYMUZLKQ... FT1171 Isoproturo...   PUIYMUZLKQ... FT1171 Isoproturo...   PUIYMUZLKQ... rownames(mtch_res) <- NULL  #' Keep only info on features that machted - create a utility function for that mtch_res <- split(mtch_res, mtch_res$feature_id) |>     lapply(function(x) {         lapply(split(x, x$target_inchikey), function(z) {             z[which.min(z$ppm_error), ]         })     }) |>     unlist(recursive = FALSE) |>     do.call(what = rbind)  #' Display the results kable(mtch_res, format = \"pipe\") #' Load form the MetaboLights Database param <- MetaboLightsParam(mtblsId = \"MTBLS8735\",                            assayName = paste0(\"a_MTBLS8735_LC-MSMS_positive_\",                            \"hilic_metabolite_profiling.txt\"),                            filePattern = \".mzML\")  lcms2 <- readMsObject(MsExperiment(),                      param,                      keepOntology = FALSE,                      keepProtocol = FALSE,                      simplify = TRUE) #adjust sampleData colnames(sampleData(lcms2)) <- c(\"sample_name\", \"derived_spectra_data_file\",                                 \"metabolite_asssignment_file\",                                 \"source_name\",                                 \"organism\",                                 \"blood_sample_type\",                                 \"sample_type\", \"age\", \"unit\", \"phenotype\")  # filter samples to keep MSMS data from CTR samples: sampleData(lcms2) <- sampleData(lcms2)[sampleData(lcms2)$phenotype == \"CTR\", ]  sampleData(lcms2) <- sampleData(lcms2)[grepl(\"MSMS\", sampleData(lcms2)$derived_spectra_data_file), ]  # Add fragmentation data information (from filenames) sampleData(lcms2)$fragmentation_mode <- c(\"CE20\", \"CE30\", \"CES\")  #let's look at the updated sample data sampleData(lcms2)[, c(\"derived_spectra_data_file\",                      \"phenotype\", \"sample_name\", \"age\")] |>     kable(format = \"pipe\") #' Filter the data to the same RT range as the LC-MS run lcms2 <- filterRt(lcms2, c(10, 240)) Filter spectra #' check the number of spectra per ms level spectra(lcms2) |>     msLevel() |>     split(spectraSampleIndex(lcms2)) |>     lapply(table) |>     do.call(what = cbind) 1    2    3    4   5    6    7    8   9   10   11   12 1 825  186  186  186 825  186  186  186 825  185  186  185 2 825 3121 3118 3124 825 3123 3118 3120 825 3117 3117 3116 plotPrecursorIons(lcms2) ms2_ctr <- spectra(lcms2) ms2_ctr$collision_energy <-     sampleData(lcms2)$fragmentation_mode[spectraSampleIndex(lcms2)] #' Remove low intensity peaks low_int <- function(x, ...) {     x > max(x, na.rm = TRUE) * 0.05 }  ms2_ctr <- filterMsLevel(ms2_ctr, 2L) |>     filterIntensity(intensity = low_int) #' Remove precursor peaks and restrict to spectra with a minimum #' number of peaks ms2_ctr <- filterPrecursorPeaks(ms2_ctr, ppm = 50, mz = \">=\") ms2_ctr <- ms2_ctr[lengths(ms2_ctr) > 1] |>     scalePeaks() #' Size of the object before loading into memory print(object.size(ms2_ctr), units = \"MB\") 5.1 Mb #' Load the MS data subset into memory ms2_ctr <- setBackend(ms2_ctr, MsBackendMemory()) ms2_ctr <- applyProcessing(ms2_ctr)  #' Size of the object after loading into memory print(object.size(ms2_ctr), units = \"MB\") 18.2 Mb #' Define the m/z and retention time ranges for the significant features target <- featureArea(lcms1)[rownames(res_sig), ] target mzmin    mzmax     rtmin     rtmax FT0371 138.0544 138.0552 146.32270 152.86115 FT0565 161.0391 161.0407 159.00234 164.30799 FT0732 182.0726 182.0756  32.71242  42.28755 FT0845 195.0799 195.0887  30.73235  35.67337 FT1171 229.1282 229.1335 178.01450 183.35303 #' Identify for each feature MS2 spectra with their precursor m/z and #' retention time within the feature's m/z and retention time range ms2_ctr_fts <- apply(target[, c(\"rtmin\", \"rtmax\", \"mzmin\", \"mzmax\")],                      MARGIN = 1, FUN = filterRanges, object = ms2_ctr,                      spectraVariables = c(\"rtime\", \"precursorMz\")) lengths(ms2_ctr_fts) FT0371 FT0565 FT0732 FT0845 FT1171     38     36    135     68     38 l <- lengths(ms2_ctr_fts) #' Combine the individual Spectra objects ms2_ctr_fts <- concatenateSpectra(ms2_ctr_fts) #' Assign the feature identifier to each MS2 spectrum ms2_ctr_fts$feature_id <- rep(rownames(res_sig), l) ms2_ref <- Spectra(mb) |>     filterPolarity(1L) |>     filterIntensity(intensity = low_int) |>     filterPrecursorPeaks(ppm = 50, mz = \">=\") ms2_ref <- ms2_ref[lengths(ms2_ref) > 1] |>     scalePeaks() register(SerialParam()) #' Define the settings for the spectra matching. prm <- CompareSpectraParam(ppm = 40, tolerance = 0.05,                            requirePrecursor = TRUE,                            THRESHFUN = function(x) which(x >= 0.6))  ms2_mtch <- matchSpectra(ms2_ctr_fts, ms2_ref, param = prm) ms2_mtch Object of class MatchedSpectra Total number of matches: 214 Number of query objects: 315 (16 matched) Number of target objects: 69561 (21 matched) #' Keep only query spectra with matching reference spectra ms2_mtch <- ms2_mtch[whichQuery(ms2_mtch)]  #' Extract the results ms2_mtch_res <- matchedData(ms2_mtch) nrow(ms2_mtch_res) [1] 214 #' - split the result per feature #' - select for each feature the best matching result for each compound #' - combine the result again into a data frame ms2_mtch_res <-     ms2_mtch_res |>     split(f = paste(ms2_mtch_res$feature_id, ms2_mtch_res$target_inchikey)) |>     lapply(function(z) {         z[which.max(z$score), ]     }) |>     do.call(what = rbind) |>     as.data.frame()  #' List the best matching feature-compound pair pandoc.table(ms2_mtch_res[, c(\"feature_id\", \"target_name\", \"score\",                               \"target_inchikey\")],              style = \"rmarkdown\",              caption = \"Table 9.MS2 annotation results.\",              split.table = Inf) par(mfrow = c(1, 2))  col_sample <- col_phenotype[sampleData(lcms1)$phenotype] #' Extract and plot EIC for the annotated feature eic <- featureChromatograms(lcms1, features = ms2_mtch_res$feature_id[1]) plot(eic, col = col_sample, peakCol = col_sample[chromPeaks(eic)[, \"sample\"]],      peakBg = paste0(col_sample[chromPeaks(eic)[, \"sample\"]], 20)) legend(\"topright\", col = col_phenotype, legend = names(col_phenotype), lty = 1)  #' Identify the best matching query-target spectra pair idx <- which.max(ms2_mtch_res$score)  #' Indicate the retention time of the MS2 spectrum in the EIC plot abline(v = ms2_mtch_res$rtime[idx])  #' Get the index of the MS2 spectrum in the query object query_idx <- which(query(ms2_mtch)$.original_query_index ==                                   ms2_mtch_res$.original_query_index[idx]) query_ms2 <- query(ms2_mtch)[query_idx] #' Get the index of the MS2 spectrum in the target object target_idx <- which(target(ms2_mtch)$spectrum_id ==                                     ms2_mtch_res$target_spectrum_id[idx]) target_ms2 <- target(ms2_mtch)[target_idx]  #' Create a mirror plot comparing the two best matching spectra plotSpectraMirror(query_ms2, target_ms2) legend(\"topleft\",        legend = paste0(\"precursor m/z: \", format(precursorMz(query_ms2), 3))) spectraData(target_ms2, c(\"collisionEnergy_text\", \"fragmentation_mode\",                           \"instrument_type\", \"instrument\", \"adduct\")) |>     as.data.frame() collisionEnergy_text fragmentation_mode instrument_type 1         55 (nominal)                HCD     LC-ESI-ITFT                          instrument adduct 1 LTQ Orbitrap XL Thermo Scientific [M+H]+"},{"path":"https://rformassspectrometry.github.io/metabonaut/articles/a-end-to-end-untargeted-metabolomics.html","id":"ms1-based-annotation","dir":"Articles","previous_headings":"","what":"MS1-based annotation","title":"Complete end-to-end LC-MS/MS Metabolomic Data analysis","text":"data set acquired using LC-MS setup features thus characterized m/z retention times. retention time LC-setup-specific , without prior data/knowledge provide little information features’ identity. Modern MS instruments high accuracy m/z values therefore reliable estimates compound ion’s mass--charge ratio. first approach, use features’ m/z values match reference values, .e., exact masses chemical compounds provided reference database, case MassBank database. full MassBank data re-distributed Bioconductor’s AnnotationHub resource, simplifies integration reproducible R-based analysis workflows. load resource, list available MassBank data sets/releases load one . MassBank data provided self-contained SQLite database data can queried accessed CompoundDb Bioconductor package. use compounds() function extract small compound annotations database. MassBank (small compound annotation databases) provides (exact) molecular mass compound. Since almost small compounds neutral natural state, need first converted m/z values allow matching feature’s m/z. calculate m/z neutral mass, need assume ion (adduct) might generated measured metabolites employed electro-spray ionization. positive polarity, human serum samples, common ions protonated ([M+H]+), bear addition sodium ([M+Na]+) ammonium ([M+H-NH3]+) ions. match observed m/z values reference values potential ions use matchValues() function Mass2MzParam approach, allows specify types expected ions adducts parameter maximal allowed difference compared values using tolerance ppm parameters. first prepare data.frame significant features, set parameters matching perform comparison query features reference database. resulting Matched object shows 4 6 significant features matched ions compounds MassBank database. extract full result Matched object. Thus, total 237 ions compounds MassBank matched significant features based specified tolerance settings. Many compounds, different structure thus function/chemical property, identical chemical formula thus mass. Matching exclusively m/z features hence result many potentially false positive hits thus considered provide low confidence annotation. additional complication annotation resources, like MassBank, community maintained, contain large amount redundant information. reduce redundancy result table iterate hits feature keep matches unique compounds (identified INCHIKEY). INCHI INCHIKEY combine information compound’s chemical formula structure, different compounds can share chemical formula, different structure thus INCHI. Table 9. MS1 annotation results. table shows results MS1-based annotation process. can see four significant features matched. matches seem pretty accurate low ppm errors. deduplication performed considerably reduced number hits feature, first still matches ions large number compounds (chemical formula). Considering features’ m/z retention times MS1-based annotation increase annotation confidence, requires additional data, recording retention time thepure standard compound LC setup. alternative approach might provide better inside annotations help choose different annotations feature evaluate certain chemical properties possible matches. instance, LogP value, available several databases HMDB, provides insight given compound’s polarity. property highly affects interaction analyte column, usually also directly affects separation. Therefore, comparison analyte’s retention time polarity can help rule possible misidentifications. low confidence, MS1-based annotation can provide first candidate annotations confirmed rejected additional analyses.","code":"#' load reference data ah <- AnnotationHub() #' List available MassBank data sets query(ah, \"MassBank\") AnnotationHub with 6 records # snapshotDate(): 2024-10-14 # $dataprovider: MassBank # $species: NA # $rdataclass: CompDb # additional mcols(): taxonomyid, genome, description, #   coordinate_1_based, maintainer, rdatadateadded, preparerclass, tags, #   rdatapath, sourceurl, sourcetype # retrieve records with, e.g., 'object[[\"AH107048\"]]'               title   AH107048 | MassBank CompDb for release 2021.03   AH107049 | MassBank CompDb for release 2022.06   AH111334 | MassBank CompDb for release 2022.12.1   AH116164 | MassBank CompDb for release 2023.06   AH116165 | MassBank CompDb for release 2023.09   AH116166 | MassBank CompDb for release 2023.11 #' Load one MAssBank release mb <- ah[[\"AH116166\"]] downloading 1 resources retrieving 1 resource loading from cache #' Extract compound annotations cmps <- compounds(mb, columns = c(\"compound_id\", \"name\", \"formula\",                                   \"exactmass\", \"inchikey\")) head(cmps) compound_id       formula exactmass                    inchikey 1           1    C27H29NO11  543.1741 AOJJSUZBOXZQNB-UHFFFAOYSA-N 2           2      C40H54O4  598.4022 KFNGKYUGHHQDEE-AXWOCEAUSA-N 3           3    C10H24N2O2  204.1838 AEUTYOVWOVBAKS-UWVGGRQHSA-N 4           4     C16H27NO5  313.1889 LMFKRLGHEKVMNT-UJDVCPFMSA-N 5           5 C20H15Cl3N2OS  435.9971 JLGKQTAYUIMGRK-UHFFFAOYSA-N 6           6      C15H14O5  274.0841 BWNCKEBBYADFPQ-UHFFFAOYSA-N                   name 1           Epirubicin 2 Crassostreaxanthin A 3           Ethambutol 4           Heliotrine 5        Sertaconazole 6    (R)Semivioxanthin #' Prepare query data frame rowData(res)$feature_id <- rownames(rowData(res)) res_sig <- res[rowData(res)$significant.CVD, ]  #' Setup parameters for the matching param <- Mass2MzParam(adducts = c(\"[M+H]+\", \"[M+Na]+\", \"[M+H-NH3]+\"),                       tolerance = 0, ppm = 5)  #' Perform the matching. mtch <- matchValues(res_sig, cmps, param = param, mzColname = \"mzmed\") mtch Object of class Matched Total number of matches: 237 Number of query objects: 5 (4 matched) Number of target objects: 117732 (237 matched) #' Extracting the results mtch_res <- matchedData(mtch, c(\"feature_id\", \"mzmed\", \"rtmed\",                                 \"adduct\", \"ppm_error\",                                 \"target_formula\", \"target_name\",                                 \"target_inchikey\")) mtch_res DataFrame with 238 rows and 8 columns         feature_id     mzmed     rtmed      adduct ppm_error target_formula                 FT0371      FT0371   138.055   148.396      [M+H]+   2.08055        C7H7NO2 FT0371      FT0371   138.055   148.396      [M+H]+   1.93568        C7H7NO2 FT0371      FT0371   138.055   148.396      [M+H]+   1.93568        C7H7NO2 FT0371      FT0371   138.055   148.396      [M+H]+   1.93568        C7H7NO2 FT0371      FT0371   138.055   148.396      [M+H]+   2.08055        C7H7NO2 ...            ...       ...       ...         ...       ...            ... FT1171      FT1171    229.13   181.088     [M+Na]+   3.07708      C12H18N2O FT1171      FT1171    229.13   181.088     [M+Na]+   3.07708      C12H18N2O FT1171      FT1171    229.13   181.088     [M+Na]+   3.07708      C12H18N2O FT1171      FT1171    229.13   181.088     [M+Na]+   3.07708      C12H18N2O FT1171      FT1171    229.13   181.088     [M+Na]+   3.07708      C12H18N2O          target_name target_inchikey                FT0371 Benzohydro...   VDEUYMSGMP... FT0371 Trigonelli...   WWNNZCOKKK... FT0371 Trigonelli...   WWNNZCOKKK... FT0371 Trigonelli...   WWNNZCOKKK... FT0371 Salicylami...   SKZKKFZAGN... ...              ...             ... FT1171 Isoproturo...   PUIYMUZLKQ... FT1171 Isoproturo...   PUIYMUZLKQ... FT1171 Isoproturo...   PUIYMUZLKQ... FT1171 Isoproturo...   PUIYMUZLKQ... FT1171 Isoproturo...   PUIYMUZLKQ... rownames(mtch_res) <- NULL  #' Keep only info on features that machted - create a utility function for that mtch_res <- split(mtch_res, mtch_res$feature_id) |>     lapply(function(x) {         lapply(split(x, x$target_inchikey), function(z) {             z[which.min(z$ppm_error), ]         })     }) |>     unlist(recursive = FALSE) |>     do.call(what = rbind)  #' Display the results kable(mtch_res, format = \"pipe\")"},{"path":"https://rformassspectrometry.github.io/metabonaut/articles/a-end-to-end-untargeted-metabolomics.html","id":"ms2-based-annotation","dir":"Articles","previous_headings":"","what":"MS2-based annotation","title":"Complete end-to-end LC-MS/MS Metabolomic Data analysis","text":"MS1 annotation fast efficient method annotate features therefore give first insight compounds significantly different two study groups. However, always accurate. MS2 data can provide higher level confidence annotation process provides, observed fragmentation pattern, information structure compound. MS2 data can generated LC-MS/MS measurement MS2 spectra recorded ions either data dependent acquisition (DDA) data independent acquisition (DIA) mode. Generally, advised include LC-MS/MS runs QC samples randomly selected study samples already acquisition MS1 data used quantification signals. alternative, addition, post-hoc LC-MS/MS acquisition can performed generate MS2 data needed annotation. present experiment, separate LC-MS/MS measurement conducted QC samples selected study samples generate data using inclusion list pre-selected ions. represent features found significantly different CVD CTR samples initial analysis full experiment. use subset second LC-MS/MS data set show data can used MS2-based annotation. differential abundance analysis found features significantly higher abundances CTR samples. Consequently, utilize MS2 data obtained CTR samples annotate significant features. load LC-MS/MS data experiment restrict data acquired CTR sample. Table 10. Samples LC-MS/MS data set. total 3 LC-MS/MS data files control samples, different collision energy fragment ions. show number MS1 MS2 spectra files. Compared number MS2 spectra, far less MS1 spectra acquired. configuration MS instrument set ensure ions specified inclusion list selected fragmentation, even intensity might low. setting, however, recorded MS2 spectra represent noise. plot shows location precursor ions m/z - retention time plane three files.  can see MS2 spectra recorded m/z interest along full retention time range, even actual ions eluting within certain retention time windows. next extract Spectra object MS data data object assign new spectra variable employed collision energy, extract data object sampleData. next filter MS data first restricting MS2 spectra removing mass peaks spectrum intensity lower 5% highest intensity spectrum, assuming low intensity peaks represent background signal. next remove also mass peaks m/z value greater equal precursor m/z ion. puts, later matching reference spectra, weight fragmentation pattern ions avoids hits based precursor m/z peak (hence similar mass compared compounds). last, restrict data spectra least two fragment peaks scale intensities sum 1 spectrum. similarity calculations affected scaling, makes visual comparison fragment spectra easier read. Finally, also speed later comparison spectra reference database, load full MS data memory (changing backend MsBackendMemory) apply processing steps performed data far. Keeping MS data memory performance benefits, generally suggested large data sets. evaluate impact present data set print addition size data object changing backend. thus moderate increase memory demand loading MS data memory (also filtered cleaned MS2 data). proceed match experimental MS2 spectra reference fragment spectra, workflow aim annotate features found significant differential abundance analysis. goal thus identify MS2 spectra second (LC-MS/MS) run represent fragments ions features data first (LC-MS) run. approach match MS2 spectra significant features determined earlier based precursor m/z retention time (given acceptable tolerance) feature’s m/z retention time. can easily done using featureArea() function effectively considers actual m/z retention time ranges features’ chromatographic peaks therefore increase chance finding correct match. however also assumes retention times first second run don’t differ much. Alternatively, need align retention times second LC-MS/MS data set first. first extract feature area, .e., m/z retention time ranges, significant features. next identify fragment spectra precursor m/z retention times within ranges. use filterRanges() function allows filter Spectra object using multiple ranges simultaneously. apply function separately feature (row matrix) extract MS2 spectra representing fragmentation information presumed feature’s ions. result apply() call list Spectra, element representing result one feature. exception last feature, multiple MS2 spectra identified. next combine list Spectra single Spectra object using concatenateSpectra() function add additional spectra variable containing respective feature identifier. now Spectra object fragment spectra significant features differential expression analysis. next build reference data need process way query spectra. extract fragment spectra MassBank database, restrict positive polarity data (since experiment acquired positive polarity) perform processing fragment spectra MassBank database. Note switch MsBackendMemory backend hence loading full data reference database memory. positive impact performance subsequent spectra matching, however also increase memory demand present analysis. Now Spectra object second run database spectra prepared, can proceed matching process. use matchSpectra() function MetaboAnnotation package CompareSpectraParam define settings matching. following parameters: requirePrecursor = TRUE: Limits spectra similarity calculations fragment spectra similar precursor m/z. tolerance ppm: Defines acceptable difference compared m/z values. relaxed tolerance settings ensure find matches even reference spectra acquired instruments lower accuracy. THRESHFUN: Defines matches report. , keep matches resulting spectra similarity score (calculated normalized dot product [@stein_optimization_1994], default similarity function) larger 0.6. Thus, total 315 query MS2 spectra, 16 matched (least) one reference fragment spectrum. restrict results matching spectra extract metadata query target spectra well similarity score (complete list available metadata information can listed colnames() function). Now, query-target pairs spectra similarity higher 0.6. Similar MS1-based annotation also result table contains redundant information: multiple fragment spectra per feature also MassBank contains several fragment spectra compound, measured using differing collision energies MS instruments, different laboratories. thus iterate feature-compound pairs select one highest score. identifier compound, use fragment spectra’s INCHI-key, since compound names MassBank accepted consensus/controlled vocabularies. Table 9.MS2 annotation results. Thus, 5 significant features, one annotated compound based MS2-based approach. many reasons failure find matches features. Although MS2 spectra selected feature, appear represent noise, features, LC-MS/MS run, low MS1 signal recorded, indicating selected sample original compound might (longer) present. Also, reference databases contain predominantly fragment spectra protonated ([M+H]+) ions compounds, features might represent signal types ions result different fragmentation pattern. Finally, fragment spectra compounds interest might also simply present used reference database. Thus, combining information MS1- MS2 based annotation can annotate one feature considerable confidence. feature m/z 195.0879 retention time 32 seconds seems ion caffeine. result somewhat disappointing also clearly shows importance proper experimental planning need control potential confounding factors. present experiment, disease-specific biomarker identified, life-style property individuals suffering disease: coffee consumption probably contraindicated patients CVD group reduce risk heart arrhythmia. plot EIC feature highlighting retention time highest scoring MS2 spectra recorded create mirror plot comparing MS2 spectra reference fragment spectra caffeine.  plot clearly shows higher signal feature CTR compared CVD samples. QC samples exhibit lower highly consistent signal, suggesting absence strong technical noise biases raw data experiment. vertical line indicates retention time fragment spectrum best match reference spectrum. noted , since fragment spectra measured separate LC-MS/MS experiment, considered indication approximate retention time ions fragmented second experiment. fragment spectrum feature, shown upper panel right plot highly similar reference spectrum caffeine MassBank (shown lower panel). addition matching precursor m/z, two fragments (m/z intensity) present spectra. can also extract additional metadata matching reference spectrum, used collision energy, fragmentation mode, instrument type, instrument well ion (adduct) fragmented.","code":"#' Load form the MetaboLights Database param <- MetaboLightsParam(mtblsId = \"MTBLS8735\",                            assayName = paste0(\"a_MTBLS8735_LC-MSMS_positive_\",                            \"hilic_metabolite_profiling.txt\"),                            filePattern = \".mzML\")  lcms2 <- readMsObject(MsExperiment(),                      param,                      keepOntology = FALSE,                      keepProtocol = FALSE,                      simplify = TRUE) #adjust sampleData colnames(sampleData(lcms2)) <- c(\"sample_name\", \"derived_spectra_data_file\",                                 \"metabolite_asssignment_file\",                                 \"source_name\",                                 \"organism\",                                 \"blood_sample_type\",                                 \"sample_type\", \"age\", \"unit\", \"phenotype\")  # filter samples to keep MSMS data from CTR samples: sampleData(lcms2) <- sampleData(lcms2)[sampleData(lcms2)$phenotype == \"CTR\", ]  sampleData(lcms2) <- sampleData(lcms2)[grepl(\"MSMS\", sampleData(lcms2)$derived_spectra_data_file), ]  # Add fragmentation data information (from filenames) sampleData(lcms2)$fragmentation_mode <- c(\"CE20\", \"CE30\", \"CES\")  #let's look at the updated sample data sampleData(lcms2)[, c(\"derived_spectra_data_file\",                      \"phenotype\", \"sample_name\", \"age\")] |>     kable(format = \"pipe\") #' Filter the data to the same RT range as the LC-MS run lcms2 <- filterRt(lcms2, c(10, 240)) Filter spectra #' check the number of spectra per ms level spectra(lcms2) |>     msLevel() |>     split(spectraSampleIndex(lcms2)) |>     lapply(table) |>     do.call(what = cbind) 1    2    3    4   5    6    7    8   9   10   11   12 1 825  186  186  186 825  186  186  186 825  185  186  185 2 825 3121 3118 3124 825 3123 3118 3120 825 3117 3117 3116 plotPrecursorIons(lcms2) ms2_ctr <- spectra(lcms2) ms2_ctr$collision_energy <-     sampleData(lcms2)$fragmentation_mode[spectraSampleIndex(lcms2)] #' Remove low intensity peaks low_int <- function(x, ...) {     x > max(x, na.rm = TRUE) * 0.05 }  ms2_ctr <- filterMsLevel(ms2_ctr, 2L) |>     filterIntensity(intensity = low_int) #' Remove precursor peaks and restrict to spectra with a minimum #' number of peaks ms2_ctr <- filterPrecursorPeaks(ms2_ctr, ppm = 50, mz = \">=\") ms2_ctr <- ms2_ctr[lengths(ms2_ctr) > 1] |>     scalePeaks() #' Size of the object before loading into memory print(object.size(ms2_ctr), units = \"MB\") 5.1 Mb #' Load the MS data subset into memory ms2_ctr <- setBackend(ms2_ctr, MsBackendMemory()) ms2_ctr <- applyProcessing(ms2_ctr)  #' Size of the object after loading into memory print(object.size(ms2_ctr), units = \"MB\") 18.2 Mb #' Define the m/z and retention time ranges for the significant features target <- featureArea(lcms1)[rownames(res_sig), ] target mzmin    mzmax     rtmin     rtmax FT0371 138.0544 138.0552 146.32270 152.86115 FT0565 161.0391 161.0407 159.00234 164.30799 FT0732 182.0726 182.0756  32.71242  42.28755 FT0845 195.0799 195.0887  30.73235  35.67337 FT1171 229.1282 229.1335 178.01450 183.35303 #' Identify for each feature MS2 spectra with their precursor m/z and #' retention time within the feature's m/z and retention time range ms2_ctr_fts <- apply(target[, c(\"rtmin\", \"rtmax\", \"mzmin\", \"mzmax\")],                      MARGIN = 1, FUN = filterRanges, object = ms2_ctr,                      spectraVariables = c(\"rtime\", \"precursorMz\")) lengths(ms2_ctr_fts) FT0371 FT0565 FT0732 FT0845 FT1171     38     36    135     68     38 l <- lengths(ms2_ctr_fts) #' Combine the individual Spectra objects ms2_ctr_fts <- concatenateSpectra(ms2_ctr_fts) #' Assign the feature identifier to each MS2 spectrum ms2_ctr_fts$feature_id <- rep(rownames(res_sig), l) ms2_ref <- Spectra(mb) |>     filterPolarity(1L) |>     filterIntensity(intensity = low_int) |>     filterPrecursorPeaks(ppm = 50, mz = \">=\") ms2_ref <- ms2_ref[lengths(ms2_ref) > 1] |>     scalePeaks() register(SerialParam()) #' Define the settings for the spectra matching. prm <- CompareSpectraParam(ppm = 40, tolerance = 0.05,                            requirePrecursor = TRUE,                            THRESHFUN = function(x) which(x >= 0.6))  ms2_mtch <- matchSpectra(ms2_ctr_fts, ms2_ref, param = prm) ms2_mtch Object of class MatchedSpectra Total number of matches: 214 Number of query objects: 315 (16 matched) Number of target objects: 69561 (21 matched) #' Keep only query spectra with matching reference spectra ms2_mtch <- ms2_mtch[whichQuery(ms2_mtch)]  #' Extract the results ms2_mtch_res <- matchedData(ms2_mtch) nrow(ms2_mtch_res) [1] 214 #' - split the result per feature #' - select for each feature the best matching result for each compound #' - combine the result again into a data frame ms2_mtch_res <-     ms2_mtch_res |>     split(f = paste(ms2_mtch_res$feature_id, ms2_mtch_res$target_inchikey)) |>     lapply(function(z) {         z[which.max(z$score), ]     }) |>     do.call(what = rbind) |>     as.data.frame()  #' List the best matching feature-compound pair pandoc.table(ms2_mtch_res[, c(\"feature_id\", \"target_name\", \"score\",                               \"target_inchikey\")],              style = \"rmarkdown\",              caption = \"Table 9.MS2 annotation results.\",              split.table = Inf) par(mfrow = c(1, 2))  col_sample <- col_phenotype[sampleData(lcms1)$phenotype] #' Extract and plot EIC for the annotated feature eic <- featureChromatograms(lcms1, features = ms2_mtch_res$feature_id[1]) plot(eic, col = col_sample, peakCol = col_sample[chromPeaks(eic)[, \"sample\"]],      peakBg = paste0(col_sample[chromPeaks(eic)[, \"sample\"]], 20)) legend(\"topright\", col = col_phenotype, legend = names(col_phenotype), lty = 1)  #' Identify the best matching query-target spectra pair idx <- which.max(ms2_mtch_res$score)  #' Indicate the retention time of the MS2 spectrum in the EIC plot abline(v = ms2_mtch_res$rtime[idx])  #' Get the index of the MS2 spectrum in the query object query_idx <- which(query(ms2_mtch)$.original_query_index ==                                   ms2_mtch_res$.original_query_index[idx]) query_ms2 <- query(ms2_mtch)[query_idx] #' Get the index of the MS2 spectrum in the target object target_idx <- which(target(ms2_mtch)$spectrum_id ==                                     ms2_mtch_res$target_spectrum_id[idx]) target_ms2 <- target(ms2_mtch)[target_idx]  #' Create a mirror plot comparing the two best matching spectra plotSpectraMirror(query_ms2, target_ms2) legend(\"topleft\",        legend = paste0(\"precursor m/z: \", format(precursorMz(query_ms2), 3))) spectraData(target_ms2, c(\"collisionEnergy_text\", \"fragmentation_mode\",                           \"instrument_type\", \"instrument\", \"adduct\")) |>     as.data.frame() collisionEnergy_text fragmentation_mode instrument_type 1         55 (nominal)                HCD     LC-ESI-ITFT                          instrument adduct 1 LTQ Orbitrap XL Thermo Scientific [M+H]+"},{"path":"https://rformassspectrometry.github.io/metabonaut/articles/a-end-to-end-untargeted-metabolomics.html","id":"external-tools-or-alternative-annotation-approaches","dir":"Articles","previous_headings":"","what":"External tools or alternative annotation approaches","title":"Complete end-to-end LC-MS/MS Metabolomic Data analysis","text":"present workflow highlights annotation performed within R using packages Bioconductor project, also excellent external softwares used alternative, SIRIUS [@duhrkop_sirius_2019], mummichog [@li_predicting_2013] GNPS [@nothias_feature-based_2020] among others. use , data need exported format supported . MS2 spectra, data easily exported required MGF file format using MsBackendMgf Bioconductor package. Integration xcms feature-based molecular networking GNPS described GNPS documentation. alternative, addition, evidence potential matching chemical formula feature derived evaluating isotope pattern full MS1 scan. provide information isotope composition. Also , various functions isotopologues() MetaboCoreUtils package functionality envipat R package [@loos_accelerated_2015] used.","code":""},{"path":"https://rformassspectrometry.github.io/metabonaut/articles/a-end-to-end-untargeted-metabolomics.html","id":"summary","dir":"Articles","previous_headings":"","what":"Summary","title":"Complete end-to-end LC-MS/MS Metabolomic Data analysis","text":"tutorial, describe end--end workflow LC-MS-based untargeted metabolomics experiments, conducted entirely within R using packages Bioconductor project base R functionality. excellent software exists perform similar analyses, power R-based workflow lies adaptability individual data sets research questions ability build reproducible workflows documentation. Due space restrictions don’t provide comprehensive listing methodologies individual analysis steps. advanced options approaches available, e.g., normalization data, however also heavily dependent size properties analyzed data set, well annotation features. result, found present analysis set features significant abundance differences compared groups. however reliably annotate single feature, related lifestyle individuals rather pathological properties investigated disease. low proportion annotated signals however uncommon untargeted metabolomics experiments reflects need comprehensive reliable reference annotation libraries.","code":""},{"path":"https://rformassspectrometry.github.io/metabonaut/articles/a-end-to-end-untargeted-metabolomics.html","id":"session-information","dir":"Articles","previous_headings":"","what":"Session information","title":"Complete end-to-end LC-MS/MS Metabolomic Data analysis","text":"","code":"sessionInfo() R version 4.4.1 (2024-06-14) Platform: x86_64-pc-linux-gnu Running under: Ubuntu 22.04.5 LTS  Matrix products: default BLAS:   /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 LAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so;  LAPACK version 3.10.0  locale:  [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C  [3] LC_TIME=en_US.UTF-8        LC_COLLATE=en_US.UTF-8  [5] LC_MONETARY=en_US.UTF-8    LC_MESSAGES=en_US.UTF-8  [7] LC_PAPER=en_US.UTF-8       LC_NAME=C  [9] LC_ADDRESS=C               LC_TELEPHONE=C [11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C  time zone: Etc/UTC tzcode source: system (glibc)  attached base packages: [1] stats4    stats     graphics  grDevices utils     datasets  methods [8] base  other attached packages:  [1] MetaboAnnotation_1.9.2       CompoundDb_1.9.5  [3] AnnotationFilter_1.29.0      AnnotationHub_3.13.3  [5] BiocFileCache_2.13.2         dbplyr_2.5.0  [7] gridExtra_2.3                ggfortify_0.4.17  [9] ggplot2_3.5.1                vioplot_0.5.0 [11] zoo_1.8-12                   sm_2.2-6.0 [13] pheatmap_1.0.12              RColorBrewer_1.1-3 [15] pander_0.6.5                 limma_3.61.12 [17] MetaboCoreUtils_1.13.0       xcms_4.3.3 [19] SummarizedExperiment_1.35.4  Biobase_2.65.1 [21] GenomicRanges_1.57.2         GenomeInfoDb_1.41.2 [23] IRanges_2.39.2               MatrixGenerics_1.17.0 [25] matrixStats_1.4.1            MsBackendMetaboLights_0.99.1 [27] Spectra_1.15.12              BiocParallel_1.39.0 [29] S4Vectors_0.43.2             BiocGenerics_0.51.3 [31] MsIO_0.0.6                   MsExperiment_1.7.0 [33] ProtGenerics_1.37.1          readxl_1.4.3 [35] BiocStyle_2.33.1             quarto_1.4.4 [37] knitr_1.48  loaded via a namespace (and not attached):   [1] later_1.3.2                 bitops_1.0-9   [3] filelock_1.0.3              tibble_3.2.1   [5] cellranger_1.1.0            preprocessCore_1.67.1   [7] XML_3.99-0.17               lifecycle_1.0.4   [9] doParallel_1.0.17           processx_3.8.4  [11] lattice_0.22-6              MASS_7.3-61  [13] alabaster.base_1.5.10       MultiAssayExperiment_1.31.5  [15] magrittr_2.0.3              rmarkdown_2.28  [17] yaml_2.3.10                 MsCoreUtils_1.17.2  [19] DBI_1.2.3                   abind_1.4-8  [21] zlibbioc_1.51.2             purrr_1.0.2  [23] RCurl_1.98-1.16             rappdirs_0.3.3  [25] GenomeInfoDbData_1.2.13     MSnbase_2.31.1  [27] ncdf4_1.23                  codetools_0.2-20  [29] DelayedArray_0.31.14        DT_0.33  [31] xml2_1.3.6                  tidyselect_1.2.1  [33] UCSC.utils_1.1.0            farver_2.1.2  [35] base64enc_0.1-3             jsonlite_1.8.9  [37] iterators_1.0.14            foreach_1.5.2  [39] tools_4.4.1                 progress_1.2.3  [41] Rcpp_1.0.13                 glue_1.8.0  [43] SparseArray_1.5.45          xfun_0.48  [45] dplyr_1.1.4                 withr_3.0.1  [47] BiocManager_1.30.25         fastmap_1.2.0  [49] rhdf5filters_1.17.0         fansi_1.0.6  [51] digest_0.6.37               R6_2.5.1  [53] mime_0.12                   colorspace_2.1-1  [55] rsvg_2.6.1                  RSQLite_2.3.7  [57] utf8_1.2.4                  tidyr_1.3.1  [59] generics_0.1.3              prettyunits_1.2.0  [61] PSMatch_1.9.0               httr_1.4.7  [63] htmlwidgets_1.6.4           S4Arrays_1.5.11  [65] pkgconfig_2.0.3             gtable_0.3.5  [67] blob_1.2.4                  impute_1.79.0  [69] MassSpecWavelet_1.71.0      XVector_0.45.0  [71] htmltools_0.5.8.1           MALDIquant_1.22.3  [73] clue_0.3-65                 scales_1.3.0  [75] png_0.1-8                   rstudioapi_0.17.0  [77] reshape2_1.4.4              rjson_0.2.23  [79] curl_5.2.3                  cachem_1.1.0  [81] rhdf5_2.49.0                stringr_1.5.1  [83] BiocVersion_3.20.0          parallel_4.4.1  [85] AnnotationDbi_1.67.0        mzID_1.43.0  [87] vsn_3.73.0                  pillar_1.9.0  [89] grid_4.4.1                  alabaster.schemas_1.5.0  [91] vctrs_0.6.5                 MsFeatures_1.13.0  [93] pcaMethods_1.97.0           cluster_2.1.6  [95] evaluate_1.0.1              cli_3.6.3  [97] compiler_4.4.1              rlang_1.1.4  [99] crayon_1.5.3                labeling_0.4.3 [101] QFeatures_1.15.3            ChemmineR_3.57.1 [103] ps_1.8.0                    affy_1.83.1 [105] plyr_1.8.9                  fs_1.6.4 [107] stringi_1.8.4               munsell_0.5.1 [109] Biostrings_2.73.2           lazyeval_0.2.2 [111] Matrix_1.7-1                hms_1.1.3 [113] bit64_4.5.2                 Rhdf5lib_1.27.0 [115] KEGGREST_1.45.1             statmod_1.5.0 [117] mzR_2.39.2                  igraph_2.1.1 [119] memoise_2.0.1               affyio_1.75.1 [121] bit_4.5.0"},{"path":[]},{"path":"https://rformassspectrometry.github.io/metabonaut/articles/a-end-to-end-untargeted-metabolomics.html","id":"appendix","dir":"Articles","previous_headings":"","what":"Appendix","title":"Complete end-to-end LC-MS/MS Metabolomic Data analysis","text":"Thanks Steffen Neumann continuous work develop maintain xcms software. … align data set using internal standards. suggested eventually enrich anchor peaks signal ions retention time regions covered internal standards.","code":""},{"path":"https://rformassspectrometry.github.io/metabonaut/articles/a-end-to-end-untargeted-metabolomics.html","id":"aknowledgment","dir":"Articles","previous_headings":"","what":"Aknowledgment","title":"Complete end-to-end LC-MS/MS Metabolomic Data analysis","text":"Thanks Steffen Neumann continuous work develop maintain xcms software. …","code":""},{"path":"https://rformassspectrometry.github.io/metabonaut/articles/a-end-to-end-untargeted-metabolomics.html","id":"alignment-using-manually-selected-anchor-peaks","dir":"Articles","previous_headings":"","what":"Alignment using manually selected anchor peaks","title":"Complete end-to-end LC-MS/MS Metabolomic Data analysis","text":"align data set using internal standards. suggested eventually enrich anchor peaks signal ions retention time regions covered internal standards.","code":""},{"path":"https://rformassspectrometry.github.io/metabonaut/articles/a-end-to-end-untargeted-metabolomics.html","id":"additional-informations","dir":"Articles","previous_headings":"","what":"Additional informations","title":"Complete end-to-end LC-MS/MS Metabolomic Data analysis","text":"","code":"#possible extra info: # -"},{"path":"https://rformassspectrometry.github.io/metabonaut/articles/alignment-to-external-dataset.html","id":"introduction","dir":"Articles","previous_headings":"","what":"Introduction","title":"Seamless Alignment: Merging New Data with and Existing Preprocessed Dataset","text":"certain experiments, aligning datasets recorded different times necessary. can involve comparing runs samples different laboratories matching MS2 data initial MS1 run. Variation retention time across laboratories LC systems often requires alignment step using adjustRtime() LamaParama parameter. described data description vignette, samples run twice: LC-MS mode LC-MS/MS mode. tutorial show align LC-MS/MS run preprocessed LC-MS dataset. following packages needed: Setting parallel processing improve efficiency process: First, let’s load pre-processed LC-MS object, steps get object shown End--end worflow vignette. Next, load unprocessed LC-MS/MS data MetaboLights database: adjust sampleData() LC-MS/MS object make easier access: Table 10. Samples LC-MS/MS data set. keep MS runs (MS/MS) remove pooled samples, focusing samples E common runs. alignment, ensure retention time (RT) ranges match datasets: need adjust RT range LC-MS/MS object match LC-MS data: evaluate retention time shifts, ’ll plot base peak chromatogram (BPC): Compare run1 sample run2 sample  Similarly, compare BPC sample E:  Perform peak detection refining alignment, detailed end--end vignette. setting applied. Now, attempt align two samples previous dataset. first step extract landmark features (referred lamas). achieve , identify features present every phenotype group lcms1 dataset. , categorize (using factor()) data phenotype retain QC samples. variable utilized filter features using PercentMissingFilter parameter within filterFeatures() function. , setting threshold = 0 select features present QC samples. lamas input look like alignment. terms method works, alignment algorithm matches chromatographic peaks experimental data lamas, fitting model based match adjust retention times minimize differences two datasets. Now can define param object LamaParama prepare alignment. Parameters tolerance, toleranceRt, ppm relate matching chromatographic peaks lamas. parameters related type fitting generated data points. details parameter overall method can found searching ?adjustRtime. example using default parameters. matchLamaChromPeaks() function facilitates assessment well lamas correspond chromatographic peaks file. extract matched results using matchedRtimes() function. used later evaluate alignment. Now can adjust retention time LC-MS/MS dataset using adjustRtime() function. extract base peak chromatogram (BPC) aligned object: evaluate performance alignment process, generate plots comparing alignment reference dataset (black) LC-MS data (red) (blue) adjustment.   Although overall matching imperfect due initial sample issues, certain regions show significant improvement. alignment signal’s start particularly well done. Specifically, regions right 150 seconds show substantial improvement. visualization distribution chromatographic peaks matched anchor peaks (Lamas) Sample . red vertical lines represent positions matched peaks.  quantitatively assess quality alignment, compute distance chromatographic peaks LC-MS data anchor peaks (Lamas) alignment. library(vioplot)  Furthermore, detailed examination matching model used fitting file possible. Numerical information can obtained using summarizeLamaMatch() function. , percentage chromatographic peaks utilized alignment can computed relative total number peaks file. Additionally, feasible directly plot() param object file interest, showcasing distribution chromatographic peaks along fitted model line.  tutorial demonstrated align LC-MS LC-MS/MS datasets correct retention time shifts, crucial handling data different runs platforms. preprocessed data, detected chromatographic peaks, used landmark features (lamas) QC samples adjust retention times via adjustRtime() function. Visual comparisons base peak chromatograms alignment, along distance calculations, showed clear improvements RT synchronization. Ultimately, aligning chromatographic data ensures subsequent analyses, feature extraction statistical comparisons, based consistent time points, improving data quality reliability. tutorial outlined end--end workflow can adapted various LC-MS-based metabolomics studies, helping researchers manage retention time variation effectively.","code":"library(MsIO) library(MsBackendMetaboLights) library(xcms) library(MsExperiment) library(Spectra) library(vioplot) #' Set up parallel processing using 2 cores if (.Platform$OS.type == \"unix\") {     register(MulticoreParam(2)) } else {     register(SnowParam(2)) } load(\"/shared/data/preprocessed_lcms1.RData\") #' Load form the MetaboLights Database param <- MetaboLightsParam(mtblsId = \"MTBLS8735\",                            assayName = paste0(\"a_MTBLS8735_LC-MSMS_positive_\",                            \"hilic_metabolite_profiling.txt\"),                            filePattern = \".mzML\")  lcms2 <- readMsObject(MsExperiment(),                      param,                      keepOntology = FALSE,                      keepProtocol = FALSE,                      simplify = TRUE) #adjust sampleData colnames(sampleData(lcms2)) <- c(\"sample_name\", \"derived_spectra_data_file\",                                 \"metabolite_asssignment_file\",                                 \"source_name\",                                 \"organism\",                                 \"blood_sample_type\",                                 \"sample_type\", \"age\", \"unit\", \"phenotype\")  #let's look at the updated sample data sampleData(lcms2)[, c(\"derived_spectra_data_file\",                      \"phenotype\", \"sample_name\", \"age\")] |>     kable(format = \"pipe\") # Only keep MS run lcms2 <- lcms2[!grepl(\"MSMS\", sampleData(lcms2)$derived_spectra_data_file),] range(rtime(lcms1)) [1]   9.674428 240.115311 range(rtime(lcms2)) [1]   0.275 480.176 #' Filter the data to the same RT range as the LC-MS run lcms2 <- filterRt(lcms2, range(rtime(lcms1))) idx_A <- which(sampleData(lcms1)$sample_name == \"A\") idx_E <- which(sampleData(lcms1)$sample_name == \"E\") bpc1 <-chromatogram(lcms1[c(idx_A,idx_E)], aggregationFun = \"max\",                     msLevel = 1) Processing chromatographic peaks bpc2 <- chromatogram(lcms2, aggregationFun = \"max\", msLevel = 1) plot(bpc1[1,1], col = \"#00000080\",      main = \"BPC sample A LC-MS vs A LC-MS/MS\", lwd = 1.5, peakType = \"none\") grid() points(rtime(bpc2[1, 1]), intensity(bpc2[1, 1]), col = \"#0000ff80\", type = \"l\") legend(\"topleft\", col = c(\"#00000080\", \"#0000ff80\"),        legend = c(\"LC-MS\", \"LC-MS/MS\"), lty = 1, lwd = 2, horiz = TRUE, bty = \"n\") plot(bpc1[1, 2], col = \"#00000080\",      main = \"BPC sample E LC-MS vs E LC-MS/MS\", lwd = 1.5, peakType = \"none\") grid() points(rtime(bpc2[1, 2]), intensity(bpc2[1, 2]), col = \"#0000ff80\", type = \"l\") legend(\"topleft\", col = c(\"#00000080\", \"#0000ff80\"),        legend = c(\"LC-MS\", \"LC-MS/MS\"), lty = 1, lwd = 2, horiz = TRUE, bty = \"n\") param <- CentWaveParam(peakwidth = c(1, 8), ppm = 15, integrate = 2) lcms2 <- findChromPeaks(lcms2, param = param, chunkSize = 2) param <- MergeNeighboringPeaksParam(expandRt = 2.5, expandMz = 0.0015,                                     minProp = 0.75) lcms2 <- refineChromPeaks(lcms2, param = param, chunkSize = 2) f <- sampleData(lcms1)$phenotype f[f != \"QC\"] <- NA lcms1 <- filterFeatures(lcms1, PercentMissingFilter(threshold = 0, f = f),                         filled = FALSE) 3694 features were removed lcms1_mz_rt <- featureDefinitions(lcms1)[, c(\"mzmed\",\"rtmed\")] head(lcms1_mz_rt) mzmed    rtmed FT0001 50.98979 203.6001 FT0002 51.05904 191.1675 FT0003 51.98657 203.1467 FT0004 53.02036 203.2343 FT0005 53.52080 203.1936 FT0007 54.01010 235.9032 nrow(lcms1_mz_rt) [1] 5374 param <- LamaParama(lamas = lcms1_mz_rt, method = \"loess\", span = 0.5,                     outlierTolerance = 3, zeroWeight = 10, ppm =20,                     tolerance = 0, toleranceRt = 20, bs = \"tp\") param <- matchLamasChromPeaks(lcms2, param = param) ref_vs_obs <- matchedRtimes(param) #' input into `adjustRtime()` lcms2 <- adjustRtime(lcms2, param = param) lcms2 <- applyAdjustedRtime(lcms2) #' evaluate the results with BPC bpc2_adj <- chromatogram(lcms2, aggregationFun = \"max\",                               msLevel = 1) #' BPC of sample A par(mfrow = c(2, 1),  mar = c(2.5, 2.5, 2.5, 0.5), mgp = c(1.5, 0.5, 0)) plot(bpc1[1, 1], col = \"#00000080\", main = \"Before Alignment\", lwd = 1.5,      peakType = \"none\", xlab = NA) grid() points(rtime(bpc2[1,1]), intensity(bpc2[1,1]),        type = \"l\",        col = \"#0000ff80\") legend(\"topleft\", col = c(\"#00000080\", \"#0000ff80\"),        legend = c(\"LC-MS\", \"LC-MS/MS\"), lty = 1, lwd = 2, horiz = TRUE, bty = \"n\")  plot(bpc1[1, 1], col = \"#00000080\", main = \"After Alignment\", lwd = 1.5,      peakType = \"none\", xlab = \"rtime (s)\") grid() points(rtime(bpc2_adj[1,1]), intensity(bpc2_adj[1,1]),        type = \"l\",        col = \"#0000ff80\") #' BPC of sample B par(mfrow = c(2, 1),  mar = c(2.5, 2.5, 2.5, 0.5), mgp = c(1.5, 0.5, 0)) plot(bpc1[1, 2], col = \"#00000080\", main = \"Before Alignment\", lwd = 1.5,      peakType = \"none\", xlab = NA) grid() points(rtime(bpc2[1, 2]), intensity(bpc2[1, 2]), type = \"l\",        col = \"#0000ff80\") legend(\"topleft\", col = c(\"#00000080\", \"#0000ff80\"),        legend = c(\"LC-MS\", \"LC-MS/MS\"), lty = 1, lwd = 2, horiz = TRUE, bty = \"n\")  plot(bpc1[1, 2], col = \"#00000080\", main = \"After Alignment\", lwd = 1.5,      peakType = \"none\", xlab = \"rtime (s)\") grid() points(rtime(bpc2_adj[1, 2]), intensity(bpc2_adj[1, 2]), type = \"l\",        col = \"#0000ff80\") #' BPC of the first sample with matches to lamas overlay par(mfrow = c(1, 1)) plot(bpc1[1, 1], col = \"#00000080\", main = \"Distribution CP matched to Lamas\",      lwd = 1.5,      peakType = \"none\") points(rtime(bpc2_adj[1, 1]), intensity(bpc2_adj[1, 1]), type = \"l\",        col = \"#0000ff80\") grid() abline(v = ref_vs_obs[[1]]$obs, col = \"#c4114510\") # Extract data for sample 3 directly ref_obs_sample_1 <- ref_vs_obs[[\"1\"]]  # Calculate distances before and after alignment dist_before <- abs(ref_obs_sample_1$obs - ref_obs_sample_1$ref) dist_after <- abs(chromPeaks(lcms2)[ref_obs_sample_1$chromPeaksId,                                              \"rt\"] - ref_obs_sample_1$ref)  # Create a data frame for plotting distances <- data.frame(   Distance = c(dist_before, dist_after),   Alignment = rep(c(\"Before\", \"After\"), each = length(dist_before)) )  # Set factor levels for Alignment to ensure correct order distances$Alignment <- factor(distances$Alignment, levels = c(\"Before\", \"After\"))  # Plot distances between anchor peaks between the two runs before and after alignment. vioplot(Distance ~ Alignment, data = distances, xlab = \"\",         rectCol = \"#c4114580\",         lineCol = \"white\",         col=\"#17138fe8\",         border = \"white\",         ylab = \"Distance (s)\",         main = \"Distance to Anchor Peaks: Before vs. After Alignment\") #' Access summary of matches and model information summary <- summarizeLamaMatch(param) summary Total_peaks Matched_peaks Total_lamas Model_summary 1        6832          1825        5374  1666, c(.... 2        6860          1785        5374  1617, c(.... 3        7588          2082        5374  1869, c(.... #' Coverage for each file summary$Matched_peaks / summary$Total_peaks * 100 [1] 26.71253 26.02041 27.43806 #' Access the information on the model of for the first file summary$Model_summary[[1]] Call: loess(formula = ref ~ obs, data = rt_map, weights = weights,     span = span)  Number of Observations: 1666 Equivalent Number of Parameters: 7.38 Residual Standard Error: 2.315 Trace of smoother matrix: 8.13  (exact)  Control settings:   span     :  0.5   degree   :  2   family   :  gaussian   surface  :  interpolate     cell = 0.2   normalize:  TRUE  parametric:  FALSE drop.square:  FALSE #' Plot obs vs. lcms1 with fitting line plot(param, index = 1L, main = \"ChromPeaks versus Lamas for sample A\",      colPoint = \"red\") abline(0, 1, lty = 3, col = \"grey\") grid()"},{"path":"https://rformassspectrometry.github.io/metabonaut/articles/alignment-to-external-dataset.html","id":"load-preprocessed-lc-ms-object","dir":"Articles","previous_headings":"","what":"Load preprocessed LC-MS object","title":"Seamless Alignment: Merging New Data with and Existing Preprocessed Dataset","text":"First, let’s load pre-processed LC-MS object, steps get object shown End--end worflow vignette.","code":"load(\"/shared/data/preprocessed_lcms1.RData\")"},{"path":"https://rformassspectrometry.github.io/metabonaut/articles/alignment-to-external-dataset.html","id":"load-unprocessed-lc-msms-data","dir":"Articles","previous_headings":"","what":"Load unprocessed LC-MS/MS data","title":"Seamless Alignment: Merging New Data with and Existing Preprocessed Dataset","text":"Next, load unprocessed LC-MS/MS data MetaboLights database: adjust sampleData() LC-MS/MS object make easier access: Table 10. Samples LC-MS/MS data set. keep MS runs (MS/MS) remove pooled samples, focusing samples E common runs. alignment, ensure retention time (RT) ranges match datasets: need adjust RT range LC-MS/MS object match LC-MS data:","code":"#' Load form the MetaboLights Database param <- MetaboLightsParam(mtblsId = \"MTBLS8735\",                            assayName = paste0(\"a_MTBLS8735_LC-MSMS_positive_\",                            \"hilic_metabolite_profiling.txt\"),                            filePattern = \".mzML\")  lcms2 <- readMsObject(MsExperiment(),                      param,                      keepOntology = FALSE,                      keepProtocol = FALSE,                      simplify = TRUE) #adjust sampleData colnames(sampleData(lcms2)) <- c(\"sample_name\", \"derived_spectra_data_file\",                                 \"metabolite_asssignment_file\",                                 \"source_name\",                                 \"organism\",                                 \"blood_sample_type\",                                 \"sample_type\", \"age\", \"unit\", \"phenotype\")  #let's look at the updated sample data sampleData(lcms2)[, c(\"derived_spectra_data_file\",                      \"phenotype\", \"sample_name\", \"age\")] |>     kable(format = \"pipe\") # Only keep MS run lcms2 <- lcms2[!grepl(\"MSMS\", sampleData(lcms2)$derived_spectra_data_file),] range(rtime(lcms1)) [1]   9.674428 240.115311 range(rtime(lcms2)) [1]   0.275 480.176 #' Filter the data to the same RT range as the LC-MS run lcms2 <- filterRt(lcms2, range(rtime(lcms1)))"},{"path":"https://rformassspectrometry.github.io/metabonaut/articles/alignment-to-external-dataset.html","id":"comparing-chromatograms","dir":"Articles","previous_headings":"","what":"Comparing chromatograms","title":"Seamless Alignment: Merging New Data with and Existing Preprocessed Dataset","text":"evaluate retention time shifts, ’ll plot base peak chromatogram (BPC): Compare run1 sample run2 sample  Similarly, compare BPC sample E:","code":"idx_A <- which(sampleData(lcms1)$sample_name == \"A\") idx_E <- which(sampleData(lcms1)$sample_name == \"E\") bpc1 <-chromatogram(lcms1[c(idx_A,idx_E)], aggregationFun = \"max\",                     msLevel = 1) Processing chromatographic peaks bpc2 <- chromatogram(lcms2, aggregationFun = \"max\", msLevel = 1) plot(bpc1[1,1], col = \"#00000080\",      main = \"BPC sample A LC-MS vs A LC-MS/MS\", lwd = 1.5, peakType = \"none\") grid() points(rtime(bpc2[1, 1]), intensity(bpc2[1, 1]), col = \"#0000ff80\", type = \"l\") legend(\"topleft\", col = c(\"#00000080\", \"#0000ff80\"),        legend = c(\"LC-MS\", \"LC-MS/MS\"), lty = 1, lwd = 2, horiz = TRUE, bty = \"n\") plot(bpc1[1, 2], col = \"#00000080\",      main = \"BPC sample E LC-MS vs E LC-MS/MS\", lwd = 1.5, peakType = \"none\") grid() points(rtime(bpc2[1, 2]), intensity(bpc2[1, 2]), col = \"#0000ff80\", type = \"l\") legend(\"topleft\", col = c(\"#00000080\", \"#0000ff80\"),        legend = c(\"LC-MS\", \"LC-MS/MS\"), lty = 1, lwd = 2, horiz = TRUE, bty = \"n\")"},{"path":"https://rformassspectrometry.github.io/metabonaut/articles/alignment-to-external-dataset.html","id":"peak-detection","dir":"Articles","previous_headings":"","what":"Peak detection","title":"Seamless Alignment: Merging New Data with and Existing Preprocessed Dataset","text":"Perform peak detection refining alignment, detailed end--end vignette. setting applied.","code":"param <- CentWaveParam(peakwidth = c(1, 8), ppm = 15, integrate = 2) lcms2 <- findChromPeaks(lcms2, param = param, chunkSize = 2) param <- MergeNeighboringPeaksParam(expandRt = 2.5, expandMz = 0.0015,                                     minProp = 0.75) lcms2 <- refineChromPeaks(lcms2, param = param, chunkSize = 2)"},{"path":"https://rformassspectrometry.github.io/metabonaut/articles/alignment-to-external-dataset.html","id":"alignment","dir":"Articles","previous_headings":"","what":"Alignment","title":"Seamless Alignment: Merging New Data with and Existing Preprocessed Dataset","text":"Now, attempt align two samples previous dataset. first step extract landmark features (referred lamas). achieve , identify features present every phenotype group lcms1 dataset. , categorize (using factor()) data phenotype retain QC samples. variable utilized filter features using PercentMissingFilter parameter within filterFeatures() function. , setting threshold = 0 select features present QC samples. lamas input look like alignment. terms method works, alignment algorithm matches chromatographic peaks experimental data lamas, fitting model based match adjust retention times minimize differences two datasets. Now can define param object LamaParama prepare alignment. Parameters tolerance, toleranceRt, ppm relate matching chromatographic peaks lamas. parameters related type fitting generated data points. details parameter overall method can found searching ?adjustRtime. example using default parameters. matchLamaChromPeaks() function facilitates assessment well lamas correspond chromatographic peaks file. extract matched results using matchedRtimes() function. used later evaluate alignment. Now can adjust retention time LC-MS/MS dataset using adjustRtime() function.","code":"f <- sampleData(lcms1)$phenotype f[f != \"QC\"] <- NA lcms1 <- filterFeatures(lcms1, PercentMissingFilter(threshold = 0, f = f),                         filled = FALSE) 3694 features were removed lcms1_mz_rt <- featureDefinitions(lcms1)[, c(\"mzmed\",\"rtmed\")] head(lcms1_mz_rt) mzmed    rtmed FT0001 50.98979 203.6001 FT0002 51.05904 191.1675 FT0003 51.98657 203.1467 FT0004 53.02036 203.2343 FT0005 53.52080 203.1936 FT0007 54.01010 235.9032 nrow(lcms1_mz_rt) [1] 5374 param <- LamaParama(lamas = lcms1_mz_rt, method = \"loess\", span = 0.5,                     outlierTolerance = 3, zeroWeight = 10, ppm =20,                     tolerance = 0, toleranceRt = 20, bs = \"tp\") param <- matchLamasChromPeaks(lcms2, param = param) ref_vs_obs <- matchedRtimes(param) #' input into `adjustRtime()` lcms2 <- adjustRtime(lcms2, param = param) lcms2 <- applyAdjustedRtime(lcms2)"},{"path":"https://rformassspectrometry.github.io/metabonaut/articles/alignment-to-external-dataset.html","id":"evaluation","dir":"Articles","previous_headings":"","what":"Evaluation","title":"Seamless Alignment: Merging New Data with and Existing Preprocessed Dataset","text":"extract base peak chromatogram (BPC) aligned object: evaluate performance alignment process, generate plots comparing alignment reference dataset (black) LC-MS data (red) (blue) adjustment.   Although overall matching imperfect due initial sample issues, certain regions show significant improvement. alignment signal’s start particularly well done. Specifically, regions right 150 seconds show substantial improvement. visualization distribution chromatographic peaks matched anchor peaks (Lamas) Sample . red vertical lines represent positions matched peaks.  quantitatively assess quality alignment, compute distance chromatographic peaks LC-MS data anchor peaks (Lamas) alignment. library(vioplot)  Furthermore, detailed examination matching model used fitting file possible. Numerical information can obtained using summarizeLamaMatch() function. , percentage chromatographic peaks utilized alignment can computed relative total number peaks file. Additionally, feasible directly plot() param object file interest, showcasing distribution chromatographic peaks along fitted model line.","code":"#' evaluate the results with BPC bpc2_adj <- chromatogram(lcms2, aggregationFun = \"max\",                               msLevel = 1) #' BPC of sample A par(mfrow = c(2, 1),  mar = c(2.5, 2.5, 2.5, 0.5), mgp = c(1.5, 0.5, 0)) plot(bpc1[1, 1], col = \"#00000080\", main = \"Before Alignment\", lwd = 1.5,      peakType = \"none\", xlab = NA) grid() points(rtime(bpc2[1,1]), intensity(bpc2[1,1]),        type = \"l\",        col = \"#0000ff80\") legend(\"topleft\", col = c(\"#00000080\", \"#0000ff80\"),        legend = c(\"LC-MS\", \"LC-MS/MS\"), lty = 1, lwd = 2, horiz = TRUE, bty = \"n\")  plot(bpc1[1, 1], col = \"#00000080\", main = \"After Alignment\", lwd = 1.5,      peakType = \"none\", xlab = \"rtime (s)\") grid() points(rtime(bpc2_adj[1,1]), intensity(bpc2_adj[1,1]),        type = \"l\",        col = \"#0000ff80\") #' BPC of sample B par(mfrow = c(2, 1),  mar = c(2.5, 2.5, 2.5, 0.5), mgp = c(1.5, 0.5, 0)) plot(bpc1[1, 2], col = \"#00000080\", main = \"Before Alignment\", lwd = 1.5,      peakType = \"none\", xlab = NA) grid() points(rtime(bpc2[1, 2]), intensity(bpc2[1, 2]), type = \"l\",        col = \"#0000ff80\") legend(\"topleft\", col = c(\"#00000080\", \"#0000ff80\"),        legend = c(\"LC-MS\", \"LC-MS/MS\"), lty = 1, lwd = 2, horiz = TRUE, bty = \"n\")  plot(bpc1[1, 2], col = \"#00000080\", main = \"After Alignment\", lwd = 1.5,      peakType = \"none\", xlab = \"rtime (s)\") grid() points(rtime(bpc2_adj[1, 2]), intensity(bpc2_adj[1, 2]), type = \"l\",        col = \"#0000ff80\") #' BPC of the first sample with matches to lamas overlay par(mfrow = c(1, 1)) plot(bpc1[1, 1], col = \"#00000080\", main = \"Distribution CP matched to Lamas\",      lwd = 1.5,      peakType = \"none\") points(rtime(bpc2_adj[1, 1]), intensity(bpc2_adj[1, 1]), type = \"l\",        col = \"#0000ff80\") grid() abline(v = ref_vs_obs[[1]]$obs, col = \"#c4114510\") # Extract data for sample 3 directly ref_obs_sample_1 <- ref_vs_obs[[\"1\"]]  # Calculate distances before and after alignment dist_before <- abs(ref_obs_sample_1$obs - ref_obs_sample_1$ref) dist_after <- abs(chromPeaks(lcms2)[ref_obs_sample_1$chromPeaksId,                                              \"rt\"] - ref_obs_sample_1$ref)  # Create a data frame for plotting distances <- data.frame(   Distance = c(dist_before, dist_after),   Alignment = rep(c(\"Before\", \"After\"), each = length(dist_before)) )  # Set factor levels for Alignment to ensure correct order distances$Alignment <- factor(distances$Alignment, levels = c(\"Before\", \"After\"))  # Plot distances between anchor peaks between the two runs before and after alignment. vioplot(Distance ~ Alignment, data = distances, xlab = \"\",         rectCol = \"#c4114580\",         lineCol = \"white\",         col=\"#17138fe8\",         border = \"white\",         ylab = \"Distance (s)\",         main = \"Distance to Anchor Peaks: Before vs. After Alignment\") #' Access summary of matches and model information summary <- summarizeLamaMatch(param) summary Total_peaks Matched_peaks Total_lamas Model_summary 1        6832          1825        5374  1666, c(.... 2        6860          1785        5374  1617, c(.... 3        7588          2082        5374  1869, c(.... #' Coverage for each file summary$Matched_peaks / summary$Total_peaks * 100 [1] 26.71253 26.02041 27.43806 #' Access the information on the model of for the first file summary$Model_summary[[1]] Call: loess(formula = ref ~ obs, data = rt_map, weights = weights,     span = span)  Number of Observations: 1666 Equivalent Number of Parameters: 7.38 Residual Standard Error: 2.315 Trace of smoother matrix: 8.13  (exact)  Control settings:   span     :  0.5   degree   :  2   family   :  gaussian   surface  :  interpolate     cell = 0.2   normalize:  TRUE  parametric:  FALSE drop.square:  FALSE #' Plot obs vs. lcms1 with fitting line plot(param, index = 1L, main = \"ChromPeaks versus Lamas for sample A\",      colPoint = \"red\") abline(0, 1, lty = 3, col = \"grey\") grid()"},{"path":"https://rformassspectrometry.github.io/metabonaut/articles/alignment-to-external-dataset.html","id":"visualizing-alignment-quality","dir":"Articles","previous_headings":"Introduction","what":"Visualizing Alignment Quality","title":"Seamless Alignment: Merging New Data with and Existing Preprocessed Dataset","text":"evaluate performance alignment process, generate plots comparing alignment reference dataset (black) LC-MS data (red) (blue) adjustment.   Although overall matching imperfect due initial sample issues, certain regions show significant improvement. alignment signal’s start particularly well done. Specifically, regions right 150 seconds show substantial improvement. visualization distribution chromatographic peaks matched anchor peaks (Lamas) Sample . red vertical lines represent positions matched peaks.","code":"#' BPC of sample A par(mfrow = c(2, 1),  mar = c(2.5, 2.5, 2.5, 0.5), mgp = c(1.5, 0.5, 0)) plot(bpc1[1, 1], col = \"#00000080\", main = \"Before Alignment\", lwd = 1.5,      peakType = \"none\", xlab = NA) grid() points(rtime(bpc2[1,1]), intensity(bpc2[1,1]),        type = \"l\",        col = \"#0000ff80\") legend(\"topleft\", col = c(\"#00000080\", \"#0000ff80\"),        legend = c(\"LC-MS\", \"LC-MS/MS\"), lty = 1, lwd = 2, horiz = TRUE, bty = \"n\")  plot(bpc1[1, 1], col = \"#00000080\", main = \"After Alignment\", lwd = 1.5,      peakType = \"none\", xlab = \"rtime (s)\") grid() points(rtime(bpc2_adj[1,1]), intensity(bpc2_adj[1,1]),        type = \"l\",        col = \"#0000ff80\") #' BPC of sample B par(mfrow = c(2, 1),  mar = c(2.5, 2.5, 2.5, 0.5), mgp = c(1.5, 0.5, 0)) plot(bpc1[1, 2], col = \"#00000080\", main = \"Before Alignment\", lwd = 1.5,      peakType = \"none\", xlab = NA) grid() points(rtime(bpc2[1, 2]), intensity(bpc2[1, 2]), type = \"l\",        col = \"#0000ff80\") legend(\"topleft\", col = c(\"#00000080\", \"#0000ff80\"),        legend = c(\"LC-MS\", \"LC-MS/MS\"), lty = 1, lwd = 2, horiz = TRUE, bty = \"n\")  plot(bpc1[1, 2], col = \"#00000080\", main = \"After Alignment\", lwd = 1.5,      peakType = \"none\", xlab = \"rtime (s)\") grid() points(rtime(bpc2_adj[1, 2]), intensity(bpc2_adj[1, 2]), type = \"l\",        col = \"#0000ff80\") #' BPC of the first sample with matches to lamas overlay par(mfrow = c(1, 1)) plot(bpc1[1, 1], col = \"#00000080\", main = \"Distribution CP matched to Lamas\",      lwd = 1.5,      peakType = \"none\") points(rtime(bpc2_adj[1, 1]), intensity(bpc2_adj[1, 1]), type = \"l\",        col = \"#0000ff80\") grid() abline(v = ref_vs_obs[[1]]$obs, col = \"#c4114510\")"},{"path":"https://rformassspectrometry.github.io/metabonaut/articles/alignment-to-external-dataset.html","id":"quantitative-evaluation-of-alignment","dir":"Articles","previous_headings":"Introduction","what":"Quantitative Evaluation of Alignment","title":"Seamless Alignment: Merging New Data with and Existing Preprocessed Dataset","text":"quantitatively assess quality alignment, compute distance chromatographic peaks LC-MS data anchor peaks (Lamas) alignment. library(vioplot)  Furthermore, detailed examination matching model used fitting file possible. Numerical information can obtained using summarizeLamaMatch() function. , percentage chromatographic peaks utilized alignment can computed relative total number peaks file. Additionally, feasible directly plot() param object file interest, showcasing distribution chromatographic peaks along fitted model line.","code":"# Extract data for sample 3 directly ref_obs_sample_1 <- ref_vs_obs[[\"1\"]]  # Calculate distances before and after alignment dist_before <- abs(ref_obs_sample_1$obs - ref_obs_sample_1$ref) dist_after <- abs(chromPeaks(lcms2)[ref_obs_sample_1$chromPeaksId,                                              \"rt\"] - ref_obs_sample_1$ref)  # Create a data frame for plotting distances <- data.frame(   Distance = c(dist_before, dist_after),   Alignment = rep(c(\"Before\", \"After\"), each = length(dist_before)) )  # Set factor levels for Alignment to ensure correct order distances$Alignment <- factor(distances$Alignment, levels = c(\"Before\", \"After\"))  # Plot distances between anchor peaks between the two runs before and after alignment. vioplot(Distance ~ Alignment, data = distances, xlab = \"\",         rectCol = \"#c4114580\",         lineCol = \"white\",         col=\"#17138fe8\",         border = \"white\",         ylab = \"Distance (s)\",         main = \"Distance to Anchor Peaks: Before vs. After Alignment\") #' Access summary of matches and model information summary <- summarizeLamaMatch(param) summary Total_peaks Matched_peaks Total_lamas Model_summary 1        6832          1825        5374  1666, c(.... 2        6860          1785        5374  1617, c(.... 3        7588          2082        5374  1869, c(.... #' Coverage for each file summary$Matched_peaks / summary$Total_peaks * 100 [1] 26.71253 26.02041 27.43806 #' Access the information on the model of for the first file summary$Model_summary[[1]] Call: loess(formula = ref ~ obs, data = rt_map, weights = weights,     span = span)  Number of Observations: 1666 Equivalent Number of Parameters: 7.38 Residual Standard Error: 2.315 Trace of smoother matrix: 8.13  (exact)  Control settings:   span     :  0.5   degree   :  2   family   :  gaussian   surface  :  interpolate     cell = 0.2   normalize:  TRUE  parametric:  FALSE drop.square:  FALSE #' Plot obs vs. lcms1 with fitting line plot(param, index = 1L, main = \"ChromPeaks versus Lamas for sample A\",      colPoint = \"red\") abline(0, 1, lty = 3, col = \"grey\") grid()"},{"path":"https://rformassspectrometry.github.io/metabonaut/articles/alignment-to-external-dataset.html","id":"conclusion","dir":"Articles","previous_headings":"","what":"Conclusion","title":"Seamless Alignment: Merging New Data with and Existing Preprocessed Dataset","text":"tutorial demonstrated align LC-MS LC-MS/MS datasets correct retention time shifts, crucial handling data different runs platforms. preprocessed data, detected chromatographic peaks, used landmark features (lamas) QC samples adjust retention times via adjustRtime() function. Visual comparisons base peak chromatograms alignment, along distance calculations, showed clear improvements RT synchronization. Ultimately, aligning chromatographic data ensures subsequent analyses, feature extraction statistical comparisons, based consistent time points, improving data quality reliability. tutorial outlined end--end workflow can adapted various LC-MS-based metabolomics studies, helping researchers manage retention time variation effectively.","code":""},{"path":[]},{"path":"https://rformassspectrometry.github.io/metabonaut/articles/dataset-investigation.html","id":"introduction","dir":"Articles","previous_headings":"","what":"Introduction","title":"Dataset investigation: What to do when you get your data","text":", (amazing lab mate) finally finished data acquisition, now dataset hand. ’s next? Unfortunately, work isn’t yet. diving analysis, ’s crucial understand dataset . first step data analysis workflow, ensuring data good quality well-prepared preprocessing downstream analysis plan perform. vignette, present dataset used throughout different vignettes website. ’s far perfect dataset, actually mirrors reality datasets ’ll encounter research. issues indeed specific described dataset. However, purpose vignette encourage think critically data guide steps can help avoid spending hours analysis, realize later samples features removed flagged earlier .","code":""},{"path":"https://rformassspectrometry.github.io/metabonaut/articles/dataset-investigation.html","id":"dataset-description","dir":"Articles","previous_headings":"","what":"Dataset Description","title":"Dataset investigation: What to do when you get your data","text":"workflow, two datasets used: LC-MS-based (MS1 level ) untargeted metabolomics dataset quantify small polar metabolites human plasma samples. additional LC-MS/MS dataset selected samples former study identification annotation significant features. samples randomly selected larger study aimed identifying metabolites varying abundances individuals suffering cardiovascular disease (CVD) healthy controls (CTR). subset analyzed includes data three CVD patients, three CTR individuals, four quality control (QC) samples. QC samples, representing pooled serum sample large cohort, measured repeatedly throughout experiment monitor signal stability. data metadata workflow available MetaboLights database ID: MTBLS8735. detailed materials methods used sample analysis also available MetaboLights entry. particularly important understanding analysis parameters used. noted samples analyzed using ultra-high-performance liquid chromatography (UHPLC) coupled Q-TOF mass spectrometer (TripleTOF 5600+), chromatographic separation achieved using hydrophilic interaction liquid chromatography (HILIC). Consider moving visualizations end--end vignette clearer understanding dataset. Provide -depth visualizations explore understand dataset quality. Compare pool lc-ms pool lc-ms/ms show better separation second run.","code":""},{"path":"https://rformassspectrometry.github.io/metabonaut/articles/install_v0.html","id":"running-workflows-locally","dir":"Articles","previous_headings":"","what":"Running workflows locally","title":"Install","text":"install computer packages necessary workflows run code follow:","code":"install.packages(\"BiocManager\")  BiocManager::install(c('RforMassSpectrometry/MsIO', 'RforMassSpectrometry/MsBackendMetaboLights'), ask = FALSE, dependencies = TRUE)  BiocManager::install(\"rformassspectrometry/metabonaut\",                      dependencies = TRUE, ask = FALSE, update = TRUE)"},{"path":"https://rformassspectrometry.github.io/metabonaut/articles/install_v0.html","id":"docker-image","dir":"Articles","previous_headings":"","what":"Docker image","title":"Install","text":"vignettes files along R runtime environment including required packages RStudio (Posit) editor bundled docker container. installation, docker container can run computer code examples vignettes can evaluated within environment (without need install additional packages files). don’t already , install docker. Find installation information . Get docker image tutorial e.g. command line : Start docker container, either Docker Desktop, command line Enter http://localhost:8787 web browser log username rstudio password bioc. RStudio server version: open Quarto files vignettes folder evaluate R code blocks document.","code":"docker pull rformassspectrometry/metabonaut:latest docker run -e PASSWORD=bioc -p 8787:8787 rformassspectrometry/metabonaut:latest"},{"path":"https://rformassspectrometry.github.io/metabonaut/authors.html","id":null,"dir":"","previous_headings":"","what":"Authors","title":"Authors and Citation","text":"Philippine Louail. Author, maintainer.           ORCID: 0009-0007-5429-6846 Anna Tagliaferri. Contributor.           ORCID: 0009-0001-4044-4285 Vinicius Verri Hernandes. Contributor.           ORCID: 0000-0002-3057-6460 Daniel Marques de Sá e Silva. Contributor.           ORCID: 0000-0002-9674-042X Johannes Rainer. Author.           ORCID: 0000-0002-6977-7147","code":""},{"path":"https://rformassspectrometry.github.io/metabonaut/authors.html","id":"citation","dir":"","previous_headings":"","what":"Citation","title":"Authors and Citation","text":"Philippine Louail, & Johannes Rainer. (2024). Streamlining LC-MS/MS Data Analysis R Open-Source xcms RforMassSpectrometry: End--End Workflow (Version v1).Zenodo. https://doi.org/10.5281/zenodo.11370612","code":"@Manual{,   title = {Streamlining LC-MS/MS Data Analysis in R with Open-Source xcms and RforMassSpectrometry: An End-to-End Workflow},   author = {Philippine Louail and Johannes Rainer},   publisher = {Zenodo},   year = {2024},   month = {may},   version = {v1.1.0},   doi = {10.5281/zenodo.11370612},   url = {https://doi.org/10.5281/zenodo.11370612}, }"},{"path":"https://rformassspectrometry.github.io/metabonaut/index.html","id":"lets-explore-and-learn-to-analyze-untargeted-metabolomics-data","dir":"","previous_headings":"","what":"Let’s explore and learn to analyze untargeted metabolomics data","title":"Exploring and Analyzing LC-MS Data","text":"Welcome Metabonaut! 🧑‍🚀 initiative presents series workflows based small LC-MS/MS dataset, utilizing R Bioconductor packages. Throughout workflows, demonstrate adapt various algorithms specific datasets seamlessly integrate R packages ensure efficient, reproducible processing. primary workflow “Complete End--End LC-MS/MS Metabolomic Data Analysis”. full R code examples, along detailed descriptions, available end--end-untargeted-metabolomics.qmd file. file can opened RStudio, allowing execute individual R command. vignettes website interlinked, can find detailed description dataset used throughout . strive reproducibility. workflows designed remain stable time, allowing run vignettes together one comprehensive “super-vignette”. major change document smaller updates check News","code":""},{"path":"https://rformassspectrometry.github.io/metabonaut/index.html","id":"for-r-beginners","dir":"","previous_headings":"","what":"For R beginners","title":"Exploring and Analyzing LC-MS Data","text":"tutorials provided assume users basic knowledge R RMarkdown. ’re unfamiliar either, recommend completing short tutorial help test code adapt data. vignettes written Quarto format, learn go , farily new format, functionallity shared RMarkdown format, therefore learning can usefull . basic R course documentation, recommand check website try interactive course fun introduction basic R programming. cheatsheet also help.","code":""},{"path":"https://rformassspectrometry.github.io/metabonaut/index.html","id":"known-issues","dir":"","previous_headings":"","what":"Known Issues","title":"Exploring and Analyzing LC-MS Data","text":"just beginning Metabonaut journey, website still refined. ’re actively addressing ongoing issues. ’re aware problem, ’ll list . Currently, known issues code. encounter , please ensure latest versions required packages (detailed ). issue persists, please report reproducible example GitHub . encounter issues, don’t hesitate let us know!","code":""},{"path":"https://rformassspectrometry.github.io/metabonaut/index.html","id":"contribution","dir":"","previous_headings":"","what":"Contribution","title":"Exploring and Analyzing LC-MS Data","text":"contributions, please see RforMassSpectrometry contributions guideline.","code":""},{"path":"https://rformassspectrometry.github.io/metabonaut/index.html","id":"code-of-conduct","dir":"","previous_headings":"","what":"Code of Conduct","title":"Exploring and Analyzing LC-MS Data","text":"Please review RforMassSpectrometry Code Conduct.","code":""},{"path":[]},{"path":"https://rformassspectrometry.github.io/metabonaut/news/index.html","id":"changes-in-0-0-2","dir":"Changelog","previous_headings":"","what":"Changes in 0.0.2","title":"metabonaut 0.0.2","text":"Switch Quarto instead Rmarkdown Addition Alignment reference dataset vignette Addition Data investigation vignette Addition Install vignette","code":""},{"path":"https://rformassspectrometry.github.io/metabonaut/news/index.html","id":"changes-in-0-0-2-1","dir":"Changelog","previous_headings":"","what":"Changes in 0.0.1","title":"metabonaut 0.0.2","text":"Addition basic files workflow package. Addition end--end vignette.","code":""}]

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 delta 67880 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