1<!DOCTYPE html> 2<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"><head> 3 4<meta charset="utf-8"> 5<meta name="generator" content="quarto-1.8.25"> 6 7<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes"> 8 9 10<title>Boyi Guo, PhD â Boyi Guo (éåé¸), PhD</title> 11<style> 12code{white-space: pre-wrap;} 13span.smallcaps{font-variant: small-caps;} 14div.columns{display: flex; gap: min(4vw, 1.5em);} 15div.column{flex: auto; overflow-x: auto;} 16div.hanging-indent{margin-left: 1.5em; text-indent: -1.5em;} 17ul.task-list{list-style: none;} 18ul.task-list li input[type="checkbox"] { 19 width: 0.8em; 20 margin: 0 0.8em 0.2em -1em; /* quarto-specific, see https://github.com/quarto-dev/quarto-cli/issues/4556 */ 21 vertical-align: middle; 22} 23</style> 24 25
26<script src="site_libs/quarto-nav/quarto-nav.js"></script>
vendor: 1 bytes, line 26
26
27<script src="site_libs/quarto-nav/headroom.min.js"></script>
vendor: 1 bytes, line 27
27
28<script src="site_libs/clipboard/clipboard.min.js"></script>
vendor: 1 bytes, line 28
28
29<script src="site_libs/quarto-search/autocomplete.umd.js"></script>
vendor: 1 bytes, line 29
29
30<script src="site_libs/quarto-search/fuse.min.js"></script>
vendor: 1 bytes, line 30
30
31<script src="site_libs/quarto-search/quarto-search.js"></script>
31 32<meta name="quarto:offset" content="./"> 33<link href="./img/Boyi_Guo_20190924.jpeg" rel="icon" type="image/jpeg">
34<script src="site_libs/quarto-html/quarto.js" type="module"></script>
vendor: 1 bytes, line 34
34
35<script src="site_libs/quarto-html/tabsets/tabsets.js" type="module"></script>
vendor: 1 bytes, line 35
35
36<script src="site_libs/quarto-html/axe/axe-check.js" type="module"></script>
vendor: 1 bytes, line 36
36
37<script src="site_libs/quarto-html/popper.min.js"></script>
vendor: 1 bytes, line 37
37
38<script src="site_libs/quarto-html/tippy.umd.min.js"></script>
38 39<link href="site_libs/quarto-html/tippy.css" rel="stylesheet"> 40<link href="site_libs/quarto-html/quarto-syntax-highlighting-7b89279ff1a6dce999919e0e67d4d9ec.css" rel="stylesheet" id="quarto-text-highlighting-styles">
41<script src="site_libs/bootstrap/bootstrap.min.js"></script>
41 42<link href="site_libs/bootstrap/bootstrap-icons.css" rel="stylesheet"> 43<link href="site_libs/bootstrap/bootstrap-5b4ad623e5705c0698d39aec6f10cf02.min.css" rel="stylesheet" append-hash="true" id="quarto-bootstrap" data-mode="light">
44<script id="quarto-search-options" type="application/json">{ 45 "location": "navbar", 46 "copy-button": false, 47 "collapse-after": 3, 48 "panel-placement": "end", 49 "type": "overlay", 50 "limit": 50, 51 "keyboard-shortcut": [ 52 "f", 53 "/", 54 "s" 55 ], 56 "show-item-context": false, 57 "language": { 58 "search-no-results-text": "No results", 59 "search-matching-documents-text": "matching documents", 60 "search-copy-link-title": "Copy link to search", 61 "search-hide-matches-text": "Hide additional matches", 62 "search-more-match-text": "more match in this document", 63 "search-more-matches-text": "more matches in this document", 64 "search-clear-button-title": "Clear", 65 "search-text-placeholder": "", 66 "search-detached-cancel-button-title": "Cancel", 67 "search-submit-button-title": "Submit", 68 "search-label": "Search" 69 } 70}</script>
70 71 72 73<link rel="stylesheet" href="styles.css"> 74</head> 75 76<body class="nav-fixed fullcontent quarto-light"> 77 78<div id="quarto-search-results"></div> 79 <header id="quarto-header" class="headroom fixed-top"> 80 <nav class="navbar navbar-expand-lg " data-bs-theme="dark"> 81 <div class="navbar-container container-fluid"> 82 <div class="navbar-brand-container mx-auto"> 83 <a href="./index.html" class="navbar-brand navbar-brand-logo"> 84 </a> 85 <a class="navbar-brand" href="./index.html"> 86 <span class="navbar-title">Boyi Guo (éåé¸), PhD</span> 87 </a> 88 </div> 89 <div id="quarto-search" class="" title="Search"></div> 90 <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarCollapse" aria-controls="navbarCollapse" role="menu" aria-expanded="false" aria-label="Toggle navigation" onclick="if (window.quartoToggleHeadroom) { window.quartoToggleHeadroom(); }"> 91 <span class="navbar-toggler-icon"></span> 92</button> 93 <div class="collapse navbar-collapse" id="navbarCollapse"> 94 <ul class="navbar-nav navbar-nav-scroll me-auto"> 95 <li class="nav-item compact"> 96 <a class="nav-link" href="https://boyi-guo.com"> <i class="bi bi-house-door-fill" role="img" aria-label="Home"> 97</i> 98<span class="menu-text"></span></a> 99 </li> 100 <li class="nav-item"> 101 <a class="nav-link" href="https://www.overleaf.com/read/gdttrkmmwncb#4463ee"> 102<span class="menu-text">CV</span></a> 103 </li> 104 <li class="nav-item"> 105 <a class="nav-link" href="./projects.html"> 106<span class="menu-text">Projects</span></a> 107 </li> 108 <li class="nav-item"> 109 <a class="nav-link" href="./software.html"> 110<span class="menu-text">Software</span></a> 111 </li> 112 <li class="nav-item"> 113 <a class="nav-link" href="./blog.html"> 114<span class="menu-text">Blog</span></a> 115 </li> 116 <li class="nav-item"> 117 <a class="nav-link" href="./members.html"> 118<span class="menu-text">Lab Members</span></a> 119 </li> 120</ul> 121 </div> <!-- /navcollapse --> 122 <div class="quarto-navbar-tools"> 123</div> 124 </div> <!-- /container-fluid --> 125 </nav> 126</header> 127<!-- content --> 128<div id="quarto-content" class="quarto-container page-columns page-rows-contents page-layout-article page-navbar"> 129<!-- sidebar --> 130<!-- margin-sidebar --> 131 132<!-- main --> 133<div class="quarto-about-jolla"> 134 <img src="img/Boyi_Guo_20240910.jpg" class="about-image 135 round " style="height: 20em; width: 20em;"> 136 <header id="title-block-header" class="quarto-title-block default"> 137<div class="quarto-title"> 138<h1 class="title">Boyi Guo, PhD</h1> 139</div> 140<div class="quarto-title-meta"> 141 </div> 142</header><main class="content" id="quarto-document-content"> 143<p><strong>From Molecules to Medicine: Turning Complexity into Clarity with Data Science</strong></p> 144<p>Hi, Iâm Boyi Guo, an Assistant Professor in Biostatistics at the University of Utah. I develop computational tools to integrate and analyze population-scale molecular and clinical datasets to uncover mechanisms behind complex diseases such as pyschiatric disorders and cancer. My <strong>mission</strong> is to transform data into actionable insights for precision medicine.</p> 145<p>Before joining Utah, I earned my PhD in Biostatistics at UAB and completed a postdoc at Johns Hopkins, focusing on atlas-scale spatial omics. My work has been featured in journals including <em>Nature Methods</em>, <em>Bioinformatics</em>, and <em>Science</em>.</p> 146<center><img src="http://ghchart.rshah.org/boyiguo1" alt="Boyi Guo's Github chart" ,="" width="100%" height="100%"></center> 147 148 149</main> 150 <hr class="about-sep"> 151 <div class="about-links"> 152 <a href="https://twitter.com/boyiguo" class="about-link" rel="" target=""> 153 <i class="bi bi-twitter"></i> 154 <span class="about-link-text">Twitter</span> 155 </a> 156 <a href="https://github.com/boyiguo1" class="about-link" rel="" target=""> 157 <i class="bi bi-github"></i> 158 <span class="about-link-text">Github</span> 159 </a> 160 <a href="https://scholar.google.com/citations?user=gzkXHEIAAAAJ&hl=en&authuser=1" class="about-link" rel="" target=""> 161 <i class="bi bi-google"></i> 162 <span class="about-link-text">Scholar</span> 163 </a> 164 <a href="mailto:[email protected]" class="about-link" rel="" target=""> 165 <i class="bi bi-envelope"></i> 166 <span class="about-link-text">Email</span> 167 </a> 168</div> 169</div> 170 <!-- /main -->
171<script id="quarto-html-after-body" type="application/javascript"> 172 window.document.addEventListener("DOMContentLoaded", function (event) { 173 const isCodeAnnotation = (el) => { 174 for (const clz of el.classList) { 175 if (clz.startsWith('code-annotation-')) { 176 return true; 177 } 178 } 179 return false; 180 } 181 const onCopySuccess = function(e) { 182 // button target 183 const button = e.trigger; 184 // don't keep focus 185 button.blur(); 186 // flash "checked" 187 button.classList.add('code-copy-button-checked'); 188 var currentTitle = button.getAttribute("title"); 189 button.setAttribute("title", "Copied!"); 190 let tooltip; 191 if (window.bootstrap) { 192 button.setAttribute("data-bs-toggle", "tooltip"); 193 button.setAttribute("data-bs-placement", "left"); 194 button.setAttribute("data-bs-title", "Copied!"); 195 tooltip = new bootstrap.Tooltip(button, 196 { trigger: "manual", 197 customClass: "code-copy-button-tooltip", 198 offset: [0, -8]}); 199 tooltip.show(); 200 } 201 setTimeout(function() { 202 if (tooltip) { 203 tooltip.hide(); 204 button.removeAttribute("data-bs-title"); 205 button.removeAttribute("data-bs-toggle"); 206 button.removeAttribute("data-bs-placement"); 207 } 208 button.setAttribute("title", currentTitle); 209 button.classList.remove('code-copy-button-checked'); 210 }, 1000); 211 // clear code selection 212 e.clearSelection(); 213 } 214 const getTextToCopy = function(trigger) { 215 const outerScaffold = trigger.parentElement.cloneNode(true); 216 const codeEl = outerScaffold.querySelector('code'); 217 for (const childEl of codeEl.children) { 218 if (isCodeAnnotation(childEl)) { 219 childEl.remove(); 220 } 221 } 222 return codeEl.innerText; 223 } 224 const clipboard = new window.ClipboardJS('.code-copy-button:not([data-in-quarto-modal])', { 225 text: getTextToCopy 226 }); 227 clipboard.on('success', onCopySuccess); 228 if (window.document.getElementById('quarto-embedded-source-code-modal')) { 229 const clipboardModal = new window.ClipboardJS('.code-copy-button[data-in-quarto-modal]', { 230 text: getTextToCopy, 231 container: window.document.getElementById('quarto-embedded-source-code-modal') 232 }); 233 clipboardModal.on('success', onCopySuccess); 234 } 235 var localhostRegex = new RegExp(/^(?:http|https):\/\/localhost\:?[0-9]*\//); 236 var mailtoRegex = new RegExp(/^mailto:/); 237 var filterRegex = new RegExp('/' + window.location.host + '/'); 238 var isInternal = (href) => { 239 return filterRegex.test(href) || localhostRegex.test(href) || mailtoRegex.test(href); 240 } 241 // Inspect non-navigation links and adorn them if external 242 var links = window.document.querySelectorAll('a[href]:not(.nav-link):not(.navbar-brand):not(.toc-action):not(.sidebar-link):not(.sidebar-item-toggle):not(.pagination-link):not(.no-external):not([aria-hidden]):not(.dropdown-item):not(.quarto-navigation-tool):not(.about-link)'); 243 for (var i=0; i<links.length; i++) { 244 const link = links[i]; 245 if (!isInternal(link.href)) { 246 // undo the damage that might have been done by quarto-nav.js in the case of 247 // links that we want to consider external 248 if (link.dataset.originalHref !== undefined) { 249 link.href = link.dataset.originalHref; 250 } 251 } 252 } 253 function tippyHover(el, contentFn, onTriggerFn, onUntriggerFn) { 254 const config = { 255 allowHTML: true, 256 maxWidth: 500, 257 delay: 100, 258 arrow: false, 259 appendTo: function(el) { 260 return el.parentElement; 261 }, 262 interactive: true, 263 interactiveBorder: 10, 264 theme: 'quarto', 265 placement: 'bottom-start', 266 }; 267 if (contentFn) { 268 config.content = contentFn; 269 } 270 if (onTriggerFn) { 271 config.onTrigger = onTriggerFn; 272 } 273 if (onUntriggerFn) { 274 config.onUntrigger = onUntriggerFn; 275 } 276 window.tippy(el, config); 277 } 278 const noterefs = window.document.querySelectorAll('a[role="doc-noteref"]'); 279 for (var i=0; i<noterefs.length; i++) { 280 const ref = noterefs[i]; 281 tippyHover(ref, function() { 282 // use id or data attribute instead here 283 let href = ref.getAttribute('data-footnote-href') || ref.getAttribute('href'); 284 try { href = new URL(href).hash; } catch {} 285 const id = href.replace(/^#\/?/, ""); 286 const note = window.document.getElementById(id); 287 if (note) { 288 return note.innerHTML; 289 } else { 290 return ""; 291 } 292 }); 293 } 294 const xrefs = window.document.querySelectorAll('a.quarto-xref'); 295 const processXRef = (id, note) => { 296 // Strip column container classes 297 const stripColumnClz = (el) => { 298 el.classList.remove("page-full", "page-columns"); 299 if (el.children) { 300 for (const child of el.children) {
301 stripColumnClz(child); 302 } 303 } 304 } 305 stripColumnClz(note) 306 if (id === null || id.startsWith('sec-')) { 307 // Special case sections, only their first couple elements 308 const container = document.createElement("div"); 309 if (note.children && note.children.length > 2) { 310 container.appendChild(note.children[0].cloneNode(true)); 311 for (let i = 1; i < note.children.length; i++) { 312 const child = note.children[i]; 313 if (child.tagName === "P" && child.innerText === "") { 314 continue; 315 } else { 316 container.appendChild(child.cloneNode(true)); 317 break; 318 } 319 } 320 if (window.Quarto?.typesetMath) { 321 window.Quarto.typesetMath(container); 322 } 323 return container.innerHTML 324 } else { 325 if (window.Quarto?.typesetMath) { 326 window.Quarto.typesetMath(note); 327 } 328 return note.innerHTML; 329 } 330 } else { 331 // Remove any anchor links if they are present 332 const anchorLink = note.querySelector('a.anchorjs-link'); 333 if (anchorLink) { 334 anchorLink.remove(); 335 } 336 if (window.Quarto?.typesetMath) { 337 window.Quarto.typesetMath(note); 338 } 339 if (note.classList.contains("callout")) { 340 return note.outerHTML; 341 } else { 342 return note.innerHTML; 343 } 344 } 345 } 346 for (var i=0; i<xrefs.length; i++) { 347 const xref = xrefs[i]; 348 tippyHover(xref, undefined, function(instance) { 349 instance.disable(); 350 let url = xref.getAttribute('href'); 351 let hash = undefined; 352 if (url.startsWith('#')) { 353 hash = url; 354 } else { 355 try { hash = new URL(url).hash; } catch {} 356 } 357 if (hash) { 358 const id = hash.replace(/^#\/?/, ""); 359 const note = window.document.getElementById(id); 360 if (note !== null) { 361 try { 362 const html = processXRef(id, note.cloneNode(true)); 363 instance.setContent(html); 364 } finally { 365 instance.enable(); 366 instance.show(); 367 } 368 } else { 369 // See if we can fetch this 370 fetch(url.split('#')[0]) 371 .then(res => res.text()) 372 .then(html => { 373 const parser = new DOMParser(); 374 const htmlDoc = parser.parseFromString(html, "text/html"); 375 const note = htmlDoc.getElementById(id); 376 if (note !== null) { 377 const html = processXRef(id, note); 378 instance.setContent(html); 379 } 380 }).finally(() => { 381 instance.enable(); 382 instance.show(); 383 }); 384 } 385 } else { 386 // See if we can fetch a full url (with no hash to target) 387 // This is a special case and we should probably do some content thinning / targeting 388 fetch(url) 389 .then(res => res.text()) 390 .then(html => { 391 const parser = new DOMParser(); 392 const htmlDoc = parser.parseFromString(html, "text/html"); 393 const note = htmlDoc.querySelector('main.content'); 394 if (note !== null) { 395 // This should only happen for chapter cross references 396 // (since there is no id in the URL) 397 // remove the first header 398 if (note.children.length > 0 && note.children[0].tagName === "HEADER") { 399 note.children[0].remove(); 400 } 401 const html = processXRef(null, note); 402 instance.setContent(html); 403 } 404 }).finally(() => { 405 instance.enable(); 406 instance.show(); 407 }); 408 } 409 }, function(instance) { 410 }); 411 } 412 let selectedAnnoteEl; 413 const selectorForAnnotation = ( cell, annotation) => { 414 let cellAttr = 'data-code-cell="' + cell + '"'; 415 let lineAttr = 'data-code-annotation="' + annotation + '"'; 416 const selector = 'span[' + cellAttr + '][' + lineAttr + ']'; 417 return selector; 418 } 419 const selectCodeLines = (annoteEl) => { 420 const doc = window.document; 421 const targetCell = annoteEl.getAttribute("data-target-cell"); 422 const targetAnnotation = annoteEl.getAttribute("data-target-annotation"); 423 const annoteSpan = window.document.querySelector(selectorForAnnotation(targetCell, targetAnnotation)); 424 const lines = annoteSpan.getAttribute("data-code-lines").split(","); 425 const lineIds = lines.map((line) => { 426 return targetCell + "-" + line; 427 }) 428 let top = null; 429 let height = null; 430 let parent = null; 431 if (lineIds.length > 0) { 432 //compute the position of the single el (top and bottom and make a div) 433 const el = window.document.getElementById(lineIds[0]); 434 top = el.offsetTop; 435 height = el.offsetHeight; 436 parent = el.parentElement.parentElement; 437 if (lineIds.length > 1) { 438 const lastEl = window.document.getElementById(lineIds[lineIds.length - 1]); 439 const bottom = lastEl.offsetTop + lastEl.offsetHeight; 440 height = bottom - top; 441 } 442 if (top !== null && height !== null && parent !== null) { 443 // cook up a div (if necessary) and position it 444 let div = window.document.getElementById("code-annotation-line-highlight"); 445 if (div === null) { 446 div = window.document.createElement("div"); 447 div.setAttribute("id", "code-annotation-line-highlight"); 448 div.style.position = 'absolute'; 449 parent.appendChild(div); 450 } 451 div.style.top = top - 2 + "px"; 452 div.style.height = height + 4 + "px"; 453 div.style.left = 0; 454 let gutterDiv = window.document.getElementById("code-annotation-line-highlight-gutter"); 455 if (gutterDiv === null) { 456 gutterDiv = window.document.createElement("div"); 457 gutterDiv.setAttribute("id", "code-annotation-line-highlight-gutter"); 458 gutterDiv.style.position = 'absolute'; 459 const codeCell = window.document.getElementById(targetCell); 460 const gutter = codeCell.querySelector('.code-annotation-gutter'); 461 gutter.appendChild(gutterDiv); 462 } 463 gutterDiv.style.top = top - 2 + "px"; 464 gutterDiv.style.height = height + 4 + "px"; 465 } 466 selectedAnnoteEl = annoteEl; 467 } 468 }; 469 const unselectCodeLines = () => { 470 const elementsIds = ["code-annotation-line-highlight", "code-annotation-line-highlight-gutter"]; 471 elementsIds.forEach((elId) => { 472 const div = window.document.getElementById(elId); 473 if (div) { 474 div.remove(); 475 } 476 }); 477 selectedAnnoteEl = undefined; 478 }; 479 // Handle positioning of the toggle 480 window.addEventListener( 481 "resize", 482 throttle(() => { 483 elRect = undefined; 484 if (selectedAnnoteEl) { 485 selectCodeLines(selectedAnnoteEl); 486 } 487 }, 10) 488 ); 489 function throttle(fn, ms) { 490 let throttle = false;
491 let timer; 492 return (...args) => { 493 if(!throttle) { // first call gets through 494 fn.apply(this, args); 495 throttle = true; 496 } else { // all the others get throttled 497 if(timer) clearTimeout(timer); // cancel #2 498 timer = setTimeout(() => { 499 fn.apply(this, args); 500 timer = throttle = false; 501 }, ms); 502 } 503 }; 504 } 505 // Attach click handler to the DT 506 const annoteDls = window.document.querySelectorAll('dt[data-target-cell]'); 507 for (const annoteDlNode of annoteDls) { 508 annoteDlNode.addEventListener('click', (event) => { 509 const clickedEl = event.target; 510 if (clickedEl !== selectedAnnoteEl) { 511 unselectCodeLines(); 512 const activeEl = window.document.querySelector('dt[data-target-cell].code-annotation-active'); 513 if (activeEl) { 514 activeEl.classList.remove('code-annotation-active'); 515 } 516 selectCodeLines(clickedEl); 517 clickedEl.classList.add('code-annotation-active'); 518 } else { 519 // Unselect the line 520 unselectCodeLines(); 521 clickedEl.classList.remove('code-annotation-active'); 522 } 523 }); 524 } 525 const findCites = (el) => { 526 const parentEl = el.parentElement; 527 if (parentEl) { 528 const cites = parentEl.dataset.cites; 529 if (cites) { 530 return { 531 el, 532 cites: cites.split(' ') 533 }; 534 } else { 535 return findCites(el.parentElement) 536 } 537 } else { 538 return undefined; 539 } 540 }; 541 var bibliorefs = window.document.querySelectorAll('a[role="doc-biblioref"]'); 542 for (var i=0; i<bibliorefs.length; i++) { 543 const ref = bibliorefs[i]; 544 const citeInfo = findCites(ref); 545 if (citeInfo) { 546 tippyHover(citeInfo.el, function() { 547 var popup = window.document.createElement('div'); 548 citeInfo.cites.forEach(function(cite) { 549 var citeDiv = window.document.createElement('div'); 550 citeDiv.classList.add('hanging-indent'); 551 citeDiv.classList.add('csl-entry'); 552 var biblioDiv = window.document.getElementById('ref-' + cite); 553 if (biblioDiv) { 554 citeDiv.innerHTML = biblioDiv.innerHTML; 555 } 556 popup.appendChild(citeDiv); 557 }); 558 return popup.innerHTML; 559 }); 560 } 561 } 562 }); 563 </script>
563 564</div> <!-- /content --> 565 566 567 568 569</body></html>
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.