Syllabus

PSY 0110 (Undergraduate) · PSY 0210 (Graduate) · Fall 2026

Tuesdays, 4:30–7:00 PM · Psychology 109 · Sept 8 – Dec 8, 2026 (no class Nov 10)

Course Description

Coding for Psychology is a hands-on introduction to the two programming languages that power modern psychological science: Python, for building and running behavioral experiments, and R, for wrangling, visualizing, and analyzing the data those experiments produce. As we’ll put it on day one:

“Python builds the experiment, R analyzes what it collects.”

No prior programming experience is required or assumed — many students arrive never having written a line of code. What is assumed is one prior course in statistics; we’ll build directly on ideas like variability, comparison, and inference rather than reintroducing them from the ground up.

Across thirteen weekly meetings, you’ll move from installing your first tools to designing, building, and piloting an original two-condition experiment in PsychoPy, then wrangling, visualizing, testing, and writing up your own pilot data in R — and finally publishing the whole thing as a citable, public artifact via GitHub and Zenodo.

This course is cross-listed: PSY 0110 for undergraduates and PSY 0210 for graduate students. Both cohorts attend the same 150-minute sessions and work through the identical in-class agenda every week — differentiation lives entirely in the homeworks, where four of the semester’s seven assignments carry an additional, more advanced component for PSY 0210 students (see Assignments).

Learning Objectives

By the end of the semester, you will be able to:

  1. Build and run a two-condition psychology experiment in PsychoPy (Builder and Coder), from a working skeleton through custom scoring logic.
  2. Pilot your own experiment, then wrangle, visualize, and statistically test the resulting data using R and the tidyverse.
  3. Explain, in plain language, why this course teaches Python for data collection and R for data analysis rather than one language for both.
  4. Practice the mechanics of reproducible, open research: version-controlled code, a private GitHub repository (created from the course template), and a Quarto/apaquarto report with numbers computed inline rather than typed by hand.
  5. Publish an original piece of research — task, pilot data, and report — as a public, DOI-linked artifact via a GitHub Release archived to Zenodo.

Course Materials

Every text assigned this semester is free and openly licensed — you don’t need to purchase anything, in keeping with the open-science spirit of the course itself.

  • Think Python, 3rd edition (Allen B. Downey) — free, open-access; our primary text for Python fundamentals in Part I.
  • Official PsychoPy documentation — free; our reference for building and troubleshooting your PsychoPy experiment.
  • Data Skills for Reproducible Research (Emily Nordmann, PsyTeachR) — free, open-access; our primary text for R/tidyverse fundamentals in Part II.
  • R for Data Science, 2nd edition (Hadley Wickham, Mine Çetinkaya-Rundel, & Garrett Grolemund) — free, open-access; supplements Data Skills for visualization and wrangling.

Software & Accounts

  • A free GitHub account, and, in Class 1, creating your own repository from the course’s GitHub template (inside our course organization) — this creates the one private repository you’ll use for every homework and, eventually, your final project.
  • PsychoPy, standalone installer (free) — installed locally in Class 1; the one piece of software you’ll need admin rights for, since it bundles its own copy of Python.
  • R, RStudio Desktop, and Quarto (all free) — installed locally in Class 1; used from Class 6 onward.
  • A Google account, for Google Colab (free) — used for general Python practice in Classes 2–5. No local Python install is needed for that practice; PsychoPy’s bundled Coder view is reserved for your actual experiment file.
  • Optional but recommended: a Zenodo account, linked to your GitHub account — set up before Class 13, when we publish final projects.

Course Schedule

This schedule is tentative; topics, readings, or due dates may shift slightly as the semester unfolds. Any changes will be announced in class and posted to Canvas. Full detail: Schedule · Content.

Part boundaries: Part I — Lab, Python/PsychoPy (Classes 1–5). Part II — Desk, R/tidyverse (Classes 6–8). Part III — Page, synthesis (Classes 9–13).

Note the pairing: HW3 and Quiz 1 both land at the start of Class 6, and HW5 and Quiz 2 both land at the start of Class 10. Each pairing marks the end of a part of the course — it’s a deliberate checkpoint, not a scheduling accident.

Assignments & Grading

Full assignment descriptions: Assignments.

How Your Work Is Submitted & Published

Every homework is submitted through a private GitHub repository you’ll create from the course template in Class 1 (not GitHub Classroom, which was discontinued before this course began) — the same one repository for every homework this semester and, eventually, your final project. Homeworks 1–3 (HW1–HW2 built in Google Colab; HW3, the pilot-data checkpoint, submitted before RStudio is ever introduced) push via Colab’s built-in “Save a copy in GitHub” — no local git tool needed. From HW4 on, you’ll push via RStudio’s point-and-click Git pane. You will not need to learn the git command line anywhere in this course. Where a homework’s content can be mechanically checked, an automated GitHub Actions check runs automatically on every push; I review the rest — design choices, interpretation, writing quality — by hand.

Your final project’s public artifact is a GitHub Release, archived to Zenodo for a permanent, citable DOI. We’re deliberately not using OSF for this: the Center for Open Science is discontinuing OSF’s general project-hosting workflow on a timeline that would land before Class 12 — right when final-project repos get built — so GitHub plus Zenodo does everything OSF would have done here, on a timeline that actually works for this course’s calendar.

Homeworks (7 total)

You’ll complete seven homeworks over the semester, each building directly on skills from the classes that precede it — nothing asks you to learn something wholly new without a class session to prepare you for it first. PSY 0210 (graduate) students carry an additional component on four of the seven; PSY 0110 (undergraduate) students are welcome to attempt these for practice, but they’re neither required nor graded for that cohort. The shared portion of every homework is graded identically for both cohorts.

Grace Period Policy

Life happens. If something unusual, uncontrollable, or extreme keeps you from turning a homework in on time, you can rely on an automatic 48-hour grace period (excluding weekends) — no need to ask first, and no late penalty. If you need longer than that, email me before the grace period runs out and I’m glad to work out a longer extension, typically up to a week, depending on the circumstances. Extensions can’t stretch on forever, though — work turned in past the last extension we’ve agreed on earns 0 points. This grace period does not apply to quizzes, which have their own make-up policy below.

Quizzes (2 total)

Two short (15–20 minute), closed-book quizzes check that you’re keeping up with both the readings and what we’re actually building in class. Quiz 1 (start of Class 6) covers Classes 1–5, drawing on Python vocabulary from the readings as well as PsychoPy Builder mechanics we practiced together. Quiz 2 (start of Class 10) covers Classes 6–9: RStudio and tidyverse basics, dplyr wrangling, ggplot2 visualization, and simulation. After-the-fact make-up quizzes are given only for documented illness or emergencies; if you know about a conflict in advance, contact me before the quiz date so we can make a plan.

The Final Project

Your final project is an original, two-condition PsychoPy experiment: one manipulated factor with exactly two levels, up to two dependent variables, and a minimum of five observations per level. It’s the same structural constraint the class-wide Congruent/Incongruent task followed all semester — only the content needs to be genuinely your own, not a re-skin of what we built together.

You’ll pitch, design, and start building this task in Class 12 (Project Workshop I); HW7 is the checkpoint between Class 12 and Class 13, asking you to finish debugging, pilot it on 1–2 people outside class, and get a rough-draft analysis and report going. Class 13 (Project Workshop II & Finale) is for polishing and publishing what you already have, not building it for the first time.

Publishing your project means your finished PsychoPy files, your (lightly de-identified) raw pilot data, and your finalized apaquarto report landing in your GitHub repo’s task/, data/, and analysis/ folders, followed by a GitHub Release archived to Zenodo for a DOI. That Release is the last action of the semester — it’s what turns thirteen weeks of work into a real, citable, public open-science artifact. We’ll do it together, in class, on the last day.

Grading Weights

Assignment % of Final Grade
Homework 1 5%
Homework 2 5%
Homework 3 5%
Homework 4 5%
Homework 5 5%
Homework 6 5%
Homework 7 5%
Quiz 1 7.5%
Quiz 2 7.5%
Final Project — Task, Pilot Data & Analysis Pipeline 20%
Final Project — apaquarto Report 15%
Final Project — GitHub Release & Zenodo Publication 5%
Participation & In-Class Engagement 10%
Total 100%

Participation is assessed the way I’d assess a lab activity: you’ll earn full credit for engaging meaningfully with each class’s build and workshop time, whether or not your code runs perfectly by the end of the period.

Letter Grade Scale

We’ll use the following scale, without rounding, to determine final course letter grades:

Grade Range Grade Range
A+ 97–100% C+ 77–<80%
A 93–<97% C 73–<77%
A- 90–<93% C- 70–<73%
B+ 87–<90% D+ 67–<70%
B 83–<87% D 63–<67%
B- 80–<83% D- 60–<63%
F <60%

My Suggestions for You / My Commitments to You

Success in a hands-on coding course is a two-way street. Here’s how I’d suggest you approach the semester — and what I’m committing to in return.

My Suggestions for You My Commitments to You
Install and verify your tools before Class 1 ends — a broken local environment costs you far more time in Class 2 than fixing it now. I will build a course you can complete with zero prior programming experience, one step at a time.
Commit and push your work to GitHub often, not just at the deadline — small, frequent commits are also just good coding practice. I will begin and end class on time, and protect build/workshop time from turning into lecture time.
When your code throws an error, read the error message before asking for help; more often than not it’s already telling you what’s wrong. I will circulate actively during lab and studio segments rather than staying at the front of the room.
Bring a laptop that can actually run PsychoPy and RStudio locally — this isn’t a course you can do entirely from a tablet or phone. I will give you working, real example files — not just slides — for every new tool or component we introduce.
Start each homework with enough runway to get stuck once, unstick yourself, and still submit before the deadline. I will give feedback on homeworks promptly enough that it’s still useful for the next one.
Ask questions. If one of you is confused about a for loop or a dplyr verb, several others in the room are too. I will keep this course entirely free of required paid materials — every text, tool, and platform we use is free.

Resources

See the full Resources page for academic support, disability accommodations, mental health, religious accommodations, communication norms, and the academic integrity & AI tools policy.

Back to top