<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://ebrogers.github.io/feed.xml" rel="self" type="application/atom+xml" /><link href="https://ebrogers.github.io/" rel="alternate" type="text/html" /><updated>2026-04-13T15:09:39+00:00</updated><id>https://ebrogers.github.io/feed.xml</id><title type="html">Ethan Rogers</title><subtitle>PhD Student at Northeastern University</subtitle><author><name>Ethan</name></author><entry><title type="html">Postmortem: Adding contrast testing to Cardinal</title><link href="https://ebrogers.github.io/posts/contrasts" rel="alternate" type="text/html" title="Postmortem: Adding contrast testing to Cardinal" /><published>2025-10-25T00:00:00+00:00</published><updated>2025-10-25T00:00:00+00:00</updated><id>https://ebrogers.github.io/posts/blog-post-contrast-in-cardinal</id><content type="html" xml:base="https://ebrogers.github.io/posts/contrasts"><![CDATA[<aside class="sidebar__right">
<nav class="toc">
    <header><h4 class="nav__title"><i class="fa fa-file-text"></i> On This Page</h4></header>
<ul class="toc__menu" id="markdown-toc">
  <li><a href="#what-did-cardinal-for-msi-have-before" id="markdown-toc-what-did-cardinal-for-msi-have-before">What did Cardinal for MSI have before?</a></li>
  <li><a href="#cardinal-for-msi-does-contrasts-now" id="markdown-toc-cardinal-for-msi-does-contrasts-now">Cardinal for MSI does contrasts now</a></li>
  <li><a href="#thoughts-and-caveats-on-the-implementation" id="markdown-toc-thoughts-and-caveats-on-the-implementation">Thoughts and caveats on the implementation</a></li>
  <li><a href="#conclusions" id="markdown-toc-conclusions">Conclusions</a></li>
</ul>

  </nav>
</aside>

<p><a href="https://bioconductor.org/developers/release-schedule/">Bioconductor 3.22</a> is being released on October 21, 2025. Among bug fixes, this release will include some useful additions to <a href="https://cardinalmsi.org">Cardinal for MSI</a>, specifically the addition of contrast testing for linear models. I <a href="https://github.com/kuwisdelu/Cardinal/pull/69">added</a> this and wanted to detail some of my thoughts and decisions below.</p>

<details>
  <summary><strong>What is this for? What is a contrast?</strong></summary>
  <p>Some real quick background: I do statistical analysis of mass spectrometry imaging (MSI) data. Basically the stuff after the data are collected, preprocessed, and ROIs selected - like <em>modeling</em> and <em>hypothesis testing</em>. In order to make <em>population-level statements</em> from a sample of MSI images (e.g., “on average, exposure to this drug increases the abundance of this analyte”) you have to specify the relationships using a statistical model and use them to estimate the signal and variance. MSI data have many sources of variance so we need multiple samples (biological replicates). Also to make statements about the population effect from our sample we need models that specify what we think is happening (linear models), a way to test the signal we observe (the effect) against the noise of the effect (the variance), and an empirical way to compare that signal-to-noise ratio (a t statistic) to what we would expect to see based on random chance alone (a p value). You have probably done this - it’s a t test<sup>1</sup>.</p>

  <p>A contrast specifies a specific comparison from a statistical model using the model parameters. Let’s go back to the t test as an example. Take a two sample t test comparing the average of treatment vs control.</p>

\[\frac{\bar{Y}_{Treatment}-\bar{Y}_{Control}}{\sqrt{\frac{2\sigma^2}{n}}} \sim t_{df}\]

  <p>This test actually assumes a linear model beneath it - or a one-way ANOVA (it’s all the same math).</p>

\[Y_i = \beta_0 + X_i\beta_1 + \epsilon_i \text{ where } \epsilon_i \overset{iid}{\sim} N(0,\sigma^2)\]

  <p>Rewritten in a more friendly way:</p>

\[\displaylines{
Y_i = \text{Mean Y for Control} + X_i(\text{Mean difference of Y between control and treatment}) + \text{Error}_i \\\
\text{where } X_i = 0 \text{ for control, or } 1 \text{ for treatment}
}\]

  <p>A contrast is a set of coefficients that usually sum to 0, and correspond to model parameters. In abstract, it’s how we go from the fitted model to a specific estimate. For the t test above, comparing the difference between treatment and control, the contrast would be \((0,1)\) and the estimate being \((0\times\beta_0 + 1\times\beta_1)\) where \(\beta_0\) is the average response of the control and \(\beta_1\) is the average difference between the control and treatment, both from the fitted model. Follow me?</p>

  <p>Now for a simple example, the two sample t test and the contrast with a linear model are the same. The real magic happens when you have multiple independent variables, levels of each variable, sources of variation (like random factors in a mixed-effects model), and interactions. The contrast also specifies how to compute the <em>variance</em> of the estimate. I’ve heard this referred to as “propagating error” for people familiar with GraphPad Prism, and, in essence, it lets you piggyback off of the explanatory power of the other variables, random effects, and interactions to get a more precise estimate of variance.</p>

  <p><sup>1</sup>In the purest form, a t test is a signal-to-noise ratio. A special case is a two sample t test or a paired t test where the signal is the difference of two means and the ratio is the pooled variance.</p>

</details>

<h2 id="what-did-cardinal-for-msi-have-before">What did Cardinal for MSI have before?</h2>

<p><code class="language-plaintext highlighter-rouge">Cardinal::meansTest()</code> did and does do differential analysis, depending on exactly what difference you are trying to analyze. <code class="language-plaintext highlighter-rouge">meansTest()</code> computes mean intensity for each feature and sample then fits linear models, with <code class="language-plaintext highlighter-rouge">stats::lm()</code> or <code class="language-plaintext highlighter-rouge">nlme::lme()</code> when a random effect is specified. <code class="language-plaintext highlighter-rouge">meansTest()</code> then performs a <em>likelihood ratio test</em> (LRT) against a reduced model, defaulting to <code class="language-plaintext highlighter-rouge">~ 1</code>. The interpretation of this test changes a lot depending on the context, but in general an LRT compares a full and reduced model to test if the full model explains significantly more variation than the reduced. In this use case, an LRT is equivalent to an F test - and if you are testing a model with only a single fixed effect with two levels, it’s equivalent to a two sample t test. But beyond that situation (testing a single fixed effect) LRTs quickly become less useful if your goal is to test differential abundance. For one thing, you don’t get estimates of the effect - just if it’s significant. Also you can’t test individual factor levels.</p>

<p>So instead let’s t test (signal to noise ratio remember?) contrasts of interest. Now how to do that… you could, of course, extract the fitted models from the <code class="language-plaintext highlighter-rouge">MeansTest</code> result object and run the tests yourself. This is fine for models without random effects that use <code class="language-plaintext highlighter-rouge">lm</code> but <code class="language-plaintext highlighter-rouge">nlme::lme</code> models don’t check for singularity (in this case, most often when subject/biological variation is too small to estimate) and offer a <a href="https://bbolker.github.io/mixedmodels-misc/glmmFAQ.html#why-doesnt-lme4-display-denominator-degrees-of-freedomp-values-what-other-options-do-i-have">primitive method of degrees of freedom computation</a>. Is that a big deal? Maybe - probably not if you’re doing something simple - but might as well compute means within Cardinal and use <code class="language-plaintext highlighter-rouge">lme4::lmer()</code> on the <code class="language-plaintext highlighter-rouge">FeatureData</code> frame pulled from every sample, seeing as how you already have to run the contrasts yourself anyway. <code class="language-plaintext highlighter-rouge">lme4::lmer()</code> lets you know when the models are singular so you can check for (then ignore :sunglasses:) zero subject-level variance and <code class="language-plaintext highlighter-rouge">lmerTest</code> offers a method for Satterthwaite approximation of the degrees of freedom. Contrast testing can be done with <code class="language-plaintext highlighter-rouge">emmeans</code>. It’s complex, but if nothing else, <code class="language-plaintext highlighter-rouge">emmeans</code>’s wide adoption yields many examples of its usage with different research questions and experimental designs.</p>

<p>But in my experience, most Cardinal users are experimentalists, not computer scientists or statisticians, and won’t or can’t do the extra steps above because they are too complicated. It makes sense - we all have our areas of expertise and no one can be specialized in everything. So since I have this expertise, and the need is clear (at least to me), I decided to add contrast testing to Cardinal.</p>

<h2 id="cardinal-for-msi-does-contrasts-now">Cardinal for MSI does contrasts now</h2>
<p>Running contrasts in Cardinal is relatively straightforward. All MSI samples need to be in the same <code class="language-plaintext highlighter-rouge">MSImagingExperiment</code> object, and pixels from each sample identified using a factor in the <code class="language-plaintext highlighter-rouge">PositionDataFrame</code>, usually the run. Independent variables must be specified in the same way. Then it’s pretty simple - first, run <code class="language-plaintext highlighter-rouge">meansTest</code> with your preferred specification setting <code class="language-plaintext highlighter-rouge">use_lmer = TRUE</code>. Then feed the results into <code class="language-plaintext highlighter-rouge">contrastTest</code>, specifying the contrasts using <code class="language-plaintext highlighter-rouge">specs</code> and <code class="language-plaintext highlighter-rouge">method</code> args. These pretty much map directly to <code class="language-plaintext highlighter-rouge">specs</code> arg of <code class="language-plaintext highlighter-rouge">emmeans::emmeans()</code> and the <code class="language-plaintext highlighter-rouge">method</code> arg of <code class="language-plaintext highlighter-rouge">emmeans::contrast</code>. Exactly how to specify these depends on your hypotheses of interest, but as I mentioned above emmeans has extensive <a href="https://rvlenth.github.io/emmeans/">documentation</a>, <a href="https://cran.r-project.org/web/packages/emmeans/index.html">vignettes</a>, and <a href="https://aosmith.rbind.io/2019/03/25/getting-started-with-emmeans/">examples</a>. Or just ask ChatGPT, with appropriate skepticism. <code class="language-plaintext highlighter-rouge">Cardinal::topFeatures</code> will do FDR correction, the very important final step. I’m finishing up a paper about this, available very soon, that will include code and workflows for you to use with your data.</p>

<h2 id="thoughts-and-caveats-on-the-implementation">Thoughts and caveats on the implementation</h2>

<p>Although I am a relatively competent scientific programmer (I write code to do science pretty well) that is not the same as being a good software engineer… We all hate on vibe coding (god I hate that word) and all its cringy etymological children (search LinkedIn for “vibe coding cleanup specialist” to see truly the most uninspired people), but in their narrow and well confined lane I found Windsurf, Cursor, and GitHub Copilot to be very useful. It helped me plan, answered questions about Cardinal and its existing repository, and frankly “thought” of stuff I would have missed. My expertise actually came with testing - I know how these models work and what the results should be. I have used Cardinal a lot and I know how I want it to behave. I can create realistic test data for each scenario and I had already implemented the non-Cardinal version of this process from above.</p>

<p>Now onto some interesting technical details in no particular order. Upon conference with Kylie (my colleague and the creator of Cardinal), we decided to keep <code class="language-plaintext highlighter-rouge">nlme::lme()</code> and simply add <code class="language-plaintext highlighter-rouge">lme4::lmer()</code>, specified with the <code class="language-plaintext highlighter-rouge">use_lmer</code> arg. Why? First we wanted the LRT to behave exactly the same as it always has. <code class="language-plaintext highlighter-rouge">lme4</code> and <code class="language-plaintext highlighter-rouge">nlme</code> are relatively interchangeable with mostly esoteric differences, but their estimators are not exactly the same so they don’t produce the <em>exact</em> same answers. Better to keep the old way around in case someone out there relies on LRTs. Second, <code class="language-plaintext highlighter-rouge">nlme</code> supports some interesting additions, such as <a href="https://search.r-project.org/CRAN/refmans/spaMM/html/MaternCorr.html">Matérn covariance structures</a> that could let us specify pixel-level models that overcome the biasing effect of <a href="https://doi.org/10.1021/acs.analchem.6b00672">pixel autocorrelation</a> inherent to MSI data. In the same vein, I decided not to implement LRT testing with <code class="language-plaintext highlighter-rouge">lme4::lmer()</code> models. <code class="language-plaintext highlighter-rouge">lme4</code> offers both maximum likelihood estimation (MLE) and restricted maximum likelihood estimation (REML - I know but it’s convention). MLE generally underestimates variance, especially at small sample sizes whereas REML is generally considered unbiased (<a href="https://doi.org/10.1080/00273171.2017.1344538">see this</a>). Unfortunately, LRTs with REML-estimated parameters must have the same fixed effects, rendering them useless for our purposes. As MSI experiments often have few (if any) replicates, in my opinion, it’s more important to use REML than it is to offer LRTs.</p>

<h2 id="conclusions">Conclusions</h2>
<p>Going forward, I think my contributions to Cardinal will focus on filling usability gaps. Contrast testing seemed to be the largest hole in the end to end workflow of differential analysis - but there are others, mostly small and avoidable, but a few (deisotoping) that still need to be remedied with external packages. Excited for the future.</p>]]></content><author><name>Ethan</name></author><category term="Cardinal" /><category term="MSI" /><summary type="html"><![CDATA[On This Page]]></summary></entry><entry><title type="html">Qualifying Exams</title><link href="https://ebrogers.github.io/posts/quals" rel="alternate" type="text/html" title="Qualifying Exams" /><published>2025-09-01T00:00:00+00:00</published><updated>2025-09-01T00:00:00+00:00</updated><id>https://ebrogers.github.io/posts/blog-post-quals</id><content type="html" xml:base="https://ebrogers.github.io/posts/quals"><![CDATA[<aside class="sidebar__right">
<nav class="toc">
    <header><h4 class="nav__title"><i class="fa fa-file-text"></i> On This Page</h4></header>
<ul class="toc__menu" id="markdown-toc">
  <li><a href="#a-quick-reminder" id="markdown-toc-a-quick-reminder">A quick reminder</a></li>
  <li><a href="#technical-component" id="markdown-toc-technical-component">Technical Component</a></li>
  <li><a href="#health-component" id="markdown-toc-health-component">Health Component</a></li>
  <li><a href="#research-core" id="markdown-toc-research-core">Research Core</a></li>
  <li><a href="#teaching-requirement" id="markdown-toc-teaching-requirement">Teaching Requirement</a></li>
</ul>

  </nav>
</aside>

<p><a href="https://phi.khoury.northeastern.edu">Northeastern PHI</a> does things a little differently from the traditional qualifying exam - hence this public post detailing each qualifying exam component.</p>

<h2 id="a-quick-reminder">A quick reminder</h2>
<p>The research described in the technical and health components differs greatly from the work in the research core and my current research. Three years into my studies my first advisor Dr. Dinesh John left Northeastern to pursue work in health policy and physical activity in government and I joined <a href="https://olga-vitek-lab.khoury.northeastern.edu">Olga Vitek’s lab</a>. One way to frame this is I went from applying statistical models to activity data to applying statistical models to mass spectrometry imaging data with through lines of statistics, programming, biology, and experimental design. I’m glad I have a diverse set of professional interests and scientific experiences. :microscope:</p>

<h1 id="technical-component">Technical Component</h1>
<p><strong>Examiner:</strong> Dr. Dakuo Wang</p>

<p><strong>Date of completion:</strong> May 23, 2024</p>

<p><em>Description of exam topic:</em>
In 2023, Diego Arguello, Dinesh John, and I concluded the <a href="https://pubmed.ncbi.nlm.nih.gov/36850822/">Companion Pilot Study</a> on the use of activity-informed real-time interventions to increase physical activity in adults, identifying that these interventions do work but required buy-in and relationship building between the participants and health coaches (see <a href="https://ismpb.org/wp-content/uploads/2022/07/ICAMPAM-Program-2022_post-updates-1-1.pdf#page=11">O.3.11</a>). High quality health coaching is labor and time intensive, thus a barrier to scaling these types of real-time interventions. At the time (2023), large language models (LLMs) were starting to mature into useful tools that had the potential to automate some amount of routine messaging and interaction. For my exam I designed an AI health coaching system, Companion2, for use by human health coaches to expand their reach and productivity as well as a comprehensive evaluation plan to test its efficacy and safety. This work was submitted as a predoctoral fellowship training grant (F31) in the December 8th, 2023 NIH grant cycle and resubmitted the following year with changes for the August 8th, 2024 cycle.</p>

<p><em>Examiner and reason for selection:</em>
<strong>Dr. Dakuo Wang</strong>, an Associate Professor with joint appointments in the Khoury College of Computer Sciences and the College of Arts, Media, and Design has a lot of experience working with AI systems for health. Before this project, I worked with one of his students on a project studying how <a href="https://dl.acm.org/doi/10.1145/3659625">smart-speaker voice assistants can help patients share information with their care teams.</a> His collaborative style and our shared interest in using LLMs for health applications led me to ask him to be a sponsor on the F31 and proctor this exam.</p>

<p><em>Structure and reason for selection:</em>
A grant submission requires extensive research, planning, and iteration. Technological systems must be thoroughly detailed as well as their evaluation; all justified by and based on previous research. Resubmissions (as was the case for our August 8, 2024 submission) must integrate feedback and address weaknesses from reviewers, as well as incorporate novel technologies from a rapidly advancing field. I used this process to demonstrate my technical design capabilities all while gaining valuable grant writing experience.</p>

<p><a href="/files/blog_posts/quals/Final_submission_1F31HL176319-01_redacted.pdf">Download the first submission</a></p>

<p><a href="/files/blog_posts/quals/Final_submission_1F31HL176319-01A1_redacted.pdf">Download the resubmission</a></p>

<p>Unfortunately, neither submission was funded, but the process was valuable.</p>

<h1 id="health-component">Health Component</h1>
<p><strong>Examiner:</strong> Dr. Dinesh John</p>

<p><strong>Date of completion:</strong> September 23, 2024</p>

<p><em>Description of exam topic:</em>
Motivational Interviewing (MI) is an evidence-based therapeutic technique used by practitioners to help clients make behavior changes, specifically around health. The process of MI is to establish a trusting relationship with a client, explore the benefits and barriers of the behavior change of focus, cultivate the client’s internal motivation, and support the client when they take action and implement behavior change. This process requires practitioners to respect and foster the client’s self-efficacy and self-determination, withhold judgment, avoid confrontation, and refrain from giving unsolicited advice. MI requires a soft touch; moving between asking open-ended questions, redirecting conversation from unproductive topics, summarizing and reflecting, and affirming the client’s experiences. MI was the core approach used in the health coaching conducted as part of the Companion trial to promote physical activity in older adults and in the F31 grant application based on the data collected from Companion trial, as detailed above in the technical component. At the time, it was highly relevant to my future research.</p>

<p><em>Examiner and reason for selection:</em>
My advisor at the time, <strong>Dr. Dinesh John</strong> was an associate professor in the department of Public Health and Health Sciences at Northeastern University’s Bouvé College of Health Sciences. His research focused on the measurement of physical behavior and developing technological interventions to promote behavior change and health. Dinesh also has background in behavior change and health interventions. We had planned to build an AI system based on the <em>Companion</em> work that would use MI to promote physical activity therefore I asked him to administer my exam. Dinesh believes that practical experience was the best way to learn, thus we collaboratively selected this course.</p>

<p><em>Structure and reason for selection:</em>
Using MI to promote behavior change not only requires the study of the philosophy and approach behind MI, but the opportunity to practice MI techniques. Doing a course in MI as the health component, specifically UMass Chan Medical School’s Certificate in Intensive Motivational Interviewing, offered me the opportunity to practice MI and receive coaching and evaluation from MI practitioners. The course took four months and had ten two-hour group meetings where students were taught the theory, principles, and practice of MI. Students had ten learning assignments with quizzes, two mock-patient interviews to practice their MI skills, and two coaching sessions with MI practitioners to evaluate their performance. Upon successful completion of the course, students received a certificate of completion.</p>

<p><a href="/files/blog_posts/quals/Ethan_Rogers_CITMI_Completion_Certificate.pdf">Download my certificate</a></p>

<h1 id="research-core">Research Core</h1>
<p><strong>Examiner:</strong> Dr. Olga Vitek</p>

<p><strong>Date of completion:</strong> very soon</p>

<p><strong>Current status:</strong> As of 4/8/26, on BioRxiv and submitted to <em>Analytical Chemestry</em></p>

<p><strong>Title:</strong> <em>Statistical Principles Define an Open-Source Differential Analysis Workflow for Mass Spectrometry Imaging Experiments with Complex Designs: A Case Study of Osteoarthritis</em></p>

<p><strong>Author list and affiliations:</strong> <ins>Ethan B T Rogers</ins><sup>1</sup>, Sai Srikanth Lakkimsetty<sup>1</sup>, Kylie Ariel Bemis<sup>1</sup>, Charles A Schurman<sup>2</sup>, Peggi M Angel<sup>3</sup>, Birgit Schilling<sup>2</sup>, Olga Vitek<sup>1</sup>
<sup>1</sup>Khoury College of Computer Sciences, Northeastern University, Boston MA <br />
<sup>2</sup>Buck Institute for Research on Aging, Novato CA <br />
<sup>3</sup>Department of Pharmacology and Immunology, Medical University of South Carolina, Charleston SC</p>

<p><strong>Abstract:</strong>
Mass spectrometry imaging (MSI) characterizes the spatial heterogeneity of molecular abundances in biological samples. Experiments with complex designs, involving multiple conditions and multiple samples, provide particularly useful insight into differential abundance of analytes. However, analyses of these experiments require attention to details such as signal processing, selection of regions of interest, and statistical methodology. This manuscript contributes a statistical analysis workflow for detecting differentially abundant analytes in MSI experiments with complex designs. Using a case study of histologic samples of human tibial plateaus from knees of osteoarthritis patients and cadaveric controls, as well as simulated datasets, we illustrate the impact of the analysis decisions. We illustrate the importance of signal processing and feature aggregation for preserving biological relevance and alleviating the stringency of multiple testing. We further demonstrate the importance of selecting regions of interest in ways that are compatible with differential analysis. Finally, we contrast several common statistical models for differential analysis, showcase the appropriate use of replication, and demonstrate model-based calculation of sample size for followup investigations. The discussion is accompanied by detailed recommendations and an open-source R-based implementation that can be followed by other investigations.</p>

<p><strong>Link:</strong></p>
<ul>
  <li>Preprint (<a href="https://doi.org/10.64898/2026.04.08.717212">bioRxiv</a>)</li>
</ul>

<p><strong>Journal:</strong> <a href="https://pubs.acs.org/journal/ancham">Analytical Chemistry</a>, part of the American Chemical Society. From their website:</p>
<blockquote>
  <p>Analytical Chemistry publishes compelling research articles advancing chemical measurement science from significant fundamentals to innovative applications.</p>
</blockquote>

<p>Some stats (from 2025):</p>
<ul>
  <li>2 Year Impact Factor 2025: 6.7</li>
  <li>Total Citations 2025: 158,985</li>
  <li>CiteScore 2025: 11.6</li>
</ul>

<p><strong>Vignettes of the workflow developed as part of this work</strong>:</p>
<ul>
  <li><a href="https://github.com/EBRogers/MSI-Arthritis-Vignettes">Code repository</a></li>
  <li><a href="https://ebrogers.github.io/MSI-Arthritis-Vignettes">GitHub pages for easy browsing</a></li>
</ul>

<p><strong>Statement from examiner, Dr. Olga Vitek, on the role of myself and each author:</strong> coming soon</p>

<p><strong>Date of presentation to PHI group:</strong> coming soon</p>

<p><strong>Other details:</strong> This work has been previously presented in posters at two conferences, ASMS (2025) and IMSIS3 (2025). Reprints available upon request.</p>

<h1 id="teaching-requirement">Teaching Requirement</h1>

<p><em>Courses:</em> <br />
CS7200: Statistical Methods for Computer Science, Fall 2023, Dr. Olga Vitek <br />
CS4950: Computer Science Research Seminar, Spring 2024, Dr. Olga Vitek <br />
CS3950: Introduction to Computer Science Research, Spring 2024, Dr. Olga Vitek</p>

<p><em>On meeting the teaching requirement:</em> As part of being an assistant for multiple courses, I have certainly accumulated more than three hours of teaching experience. My duties for CS7200 were mostly holding office hours - roughly two hours each week - where I supplemented Olga’s lectures, explaining statistical concepts in multiple ways, going over example problems for homework and tests, helping students formulate analysis plans for their projects, and answering questions students had about the course and grading. Office hours were well attended, and I spent the vast majority of time teaching statistics - most often reviewing the lecture material with the students and helping them with homework problems. Aside from holding office hours, I created and edited homework assignments; reviewed, proctored, and graded exams; and answered student questions on Piazza among other administrative duties. CS4950 and CS3950 were both 1-2 credit courses that I TA’d for simultaneously. TAing for these courses was more administrative due to the structure of the course - creating and grading homework, reviewing and offering feedback on project proposals, grading final project papers, and keeping track of participation and attendance. For several sessions, I was the sole instructor, taking attendance, moderating discussions, and lecturing.</p>

<p><em>On challenges, benefits, and take-aways:</em> I was a TA in college for several lab courses. My experience in grad school was roughly similar and didn’t generate any particularly noteworthy challenges. Administration is tedious, providing feedback takes a lot of time, things that seem clear or obvious (class policies, assignment instructions, rubrics, etc.) aren’t more often than I would expect, and objective grading (or as close to it as can be managed by a fallible human like myself) is a lot of work. TAing a stats course was really helpful for my own understanding of the material. I’ve always been “good” at math per se, but in CS being “good” at math is the baseline and statistics is like math but with opinions. But nothing requires you to thoroughly flesh out your own understanding more than trying to teach it to someone else. Also, any ego that in the past might have prevented me from saying “I’m not actually sure” has been brutally and mercilessly sanded off.</p>

<p>I end this with things I have learned from TAing, in no particular order. I enjoy teaching, though much like grant writing I don’t really want it to be part of my career. Slowing down, trying a new approach, or reframing the problem are helpful ways to unstick someone’s lack of understanding. Students who are good at troubleshooting (know the system, define the problem, isolate components) are also good at teaching themselves. I made a bunch of friends TAing. Your class isn’t always someone’s priority, so have a comprehensive syllabus and best not to take it personally. For so many reasons, I’m so glad I didn’t have access to ChatGPT when I was a student.</p>

<p><em>Example assignments:</em> <br />
<a href="/files/blog_posts/quals/example_homework_CS7200.pdf">An example homework (with solutions) for CS7200</a> created based on previous assignments covering similar topics. <a href="/files/blog_posts/quals/example_assigment_CS3950.pdf">An example of a weekly assignment for CS3950</a> also created by me based on previous years’ examples.</p>

<p>➜ ➜ ➜ ➜ ➜ Onwards to candidacy ➜ ➜ ➜ ➜ ➜</p>]]></content><author><name>Ethan</name></author><summary type="html"><![CDATA[On This Page]]></summary></entry></feed>