<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:googleplay="http://www.google.com/schemas/play-podcasts/1.0"><channel><title><![CDATA[Under the Null]]></title><description><![CDATA[Economics, Statistics, Machine Learning, Artificial Intelligence, and whatever newfangled word they come up with next to describe looking at data and learning what it means. ]]></description><link>https://underthenull.com</link><image><url>https://substackcdn.com/image/fetch/$s_!gs9M!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F68faa797-9bd6-4df0-abaf-8af5f75c1e39_989x989.png</url><title>Under the Null</title><link>https://underthenull.com</link></image><generator>Substack</generator><lastBuildDate>Mon, 11 May 2026 15:49:20 GMT</lastBuildDate><atom:link href="https://underthenull.com/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Zach Flynn]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[zachflynn@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[zachflynn@substack.com]]></itunes:email><itunes:name><![CDATA[Zach Flynn]]></itunes:name></itunes:owner><itunes:author><![CDATA[Zach Flynn]]></itunes:author><googleplay:owner><![CDATA[zachflynn@substack.com]]></googleplay:owner><googleplay:email><![CDATA[zachflynn@substack.com]]></googleplay:email><googleplay:author><![CDATA[Zach Flynn]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[Surveys, Data, and Vibes]]></title><description><![CDATA[It's okay to ask people what they want and believe them]]></description><link>https://underthenull.com/p/when-to-run-surveys</link><guid isPermaLink="false">https://underthenull.com/p/when-to-run-surveys</guid><dc:creator><![CDATA[Zach Flynn]]></dc:creator><pubDate>Mon, 11 May 2026 14:02:42 GMT</pubDate><enclosure url="https://images.unsplash.com/photo-1613963931023-5dc59437c8a6?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwzfHxzdXJ2ZXl8ZW58MHx8fHwxNzc4MzYwNzQwfDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://images.unsplash.com/photo-1613963931023-5dc59437c8a6?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwzfHxzdXJ2ZXl8ZW58MHx8fHwxNzc4MzYwNzQwfDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://images.unsplash.com/photo-1613963931023-5dc59437c8a6?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwzfHxzdXJ2ZXl8ZW58MHx8fHwxNzc4MzYwNzQwfDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 424w, https://images.unsplash.com/photo-1613963931023-5dc59437c8a6?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwzfHxzdXJ2ZXl8ZW58MHx8fHwxNzc4MzYwNzQwfDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 848w, https://images.unsplash.com/photo-1613963931023-5dc59437c8a6?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwzfHxzdXJ2ZXl8ZW58MHx8fHwxNzc4MzYwNzQwfDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 1272w, https://images.unsplash.com/photo-1613963931023-5dc59437c8a6?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwzfHxzdXJ2ZXl8ZW58MHx8fHwxNzc4MzYwNzQwfDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 1456w" sizes="100vw"><img src="https://images.unsplash.com/photo-1613963931023-5dc59437c8a6?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwzfHxzdXJ2ZXl8ZW58MHx8fHwxNzc4MzYwNzQwfDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080" width="4584" height="3063" data-attrs="{&quot;src&quot;:&quot;https://images.unsplash.com/photo-1613963931023-5dc59437c8a6?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwzfHxzdXJ2ZXl8ZW58MHx8fHwxNzc4MzYwNzQwfDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:3063,&quot;width&quot;:4584,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;black and white printed textile&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="black and white printed textile" title="black and white printed textile" srcset="https://images.unsplash.com/photo-1613963931023-5dc59437c8a6?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwzfHxzdXJ2ZXl8ZW58MHx8fHwxNzc4MzYwNzQwfDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 424w, https://images.unsplash.com/photo-1613963931023-5dc59437c8a6?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwzfHxzdXJ2ZXl8ZW58MHx8fHwxNzc4MzYwNzQwfDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 848w, https://images.unsplash.com/photo-1613963931023-5dc59437c8a6?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwzfHxzdXJ2ZXl8ZW58MHx8fHwxNzc4MzYwNzQwfDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 1272w, https://images.unsplash.com/photo-1613963931023-5dc59437c8a6?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwzfHxzdXJ2ZXl8ZW58MHx8fHwxNzc4MzYwNzQwfDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Photo by <a href="https://unsplash.com/@jontyson">Jon Tyson</a> on <a href="https://unsplash.com">Unsplash</a></figcaption></figure></div><p>I&#8217;ve become less skeptical of surveys. Economics, as a field, has a bias for revealed preferences&#8212;what people do&#8212;over what they say, and I mostly inherited the biases of the field because, by default, you believe whatever you read when you were twenty-three. </p><p>But I&#8217;m becoming a fan of surveys. </p><p>This post is about both sides of the revealed vs. stated-preference divide. I talk about the problems with using surveys to package and price products and ways to replace some common survey use cases with revealed preference methods. But also about why sometimes it pays to just ask people what they&#8217;d do, and believe them.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://underthenull.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://underthenull.com/subscribe?"><span>Subscribe now</span></a></p><div><hr></div><p>The difference between saying &#8220;I&#8217;d pay $100&#8221; and writing a check for $100 is the difference between the plan to run a marathon and lacing up. This is the fundamental problem with surveys.</p><p>Conjoints don&#8217;t solve this problem. Artificially creating a realistic choice set doesn&#8217;t bridge the gap between stating and paying. </p><p><em>[My little take here is that for the narrow task of pricing (as opposed to understanding the determinants of demand), conjoints are worse than just asking &#8220;would you pay $5?&#8221; My evidence is classified, but I&#8217;ve seen many price elasticities from conjoints, and they are always wrong to the point of being useless, while I&#8217;ve seen decent-enough results from the &#8220;would you pay $X for ___?&#8221; question.]</em></p><p>The right argument for running a survey is that we don&#8217;t have a good answer to the question: &#8220;what else could we do?&#8221; When there&#8217;s nothing else to do, you run a survey. But there&#8217;s a temptation to throw in the towel early because (we imagine) a survey is a time-bound, well-defined task that we can probably ship in a week or two. </p><p>But you can learn a lot from <em>revealed preferences</em> before you have to resort to <em>stated preferences</em>.</p><p>It&#8217;s rare to launch a genuinely new product, a product that&#8217;s completely unrelated to whatever else your company does, so you don&#8217;t have any relevant data. Most new products are re-packaging your existing product or a small new add-on. You want to offer an all-you-can-eat subscription, alongside your current &#224; la carte, transactional business. You&#8217;re going to start charging for a type of product usage that was previously free. Etcetera.</p><p>When revealed preference data exists that answers the relevant question, it&#8217;s better because it represents real checks.  For example, it might look like you don&#8217;t have any data on how people will respond to a price for a previously free product, but you can triangulate.</p><ul><li><p>When you introduced this product, how many more people signed up for the subscription? </p></li><li><p>When you raised the price by $5 last year, how many fewer people did?</p></li></ul><p>Combining those two answers tells you something about how valuable customers find the feature. You can say things like &#8220;people value the feature like a $3 reduction in the product&#8217;s price, so&#8230;&#8221; [You <em>do</em> need both parts here: variation in the presence of the feature and variation in the price.]</p><p>The point is that, if you&#8217;re a wee bit creative, you can use data to answer a broad class of questions before you need to make your own data via surveys.</p><div><hr></div><p>Surveys are worse than behavioral data, but they are 1000x better than vibes (the 1000x, however, was measured by vibes). </p><p>Analysis is a competitive market. If there&#8217;s no data analysis or survey, decisions will be made via vibes. There&#8217;s always an outside option. People don&#8217;t have to use any evidence at all to make decisions. You can just decide things. Vibes are always a backup plan.</p><p><em>[This is why I lean towards &#8220;give stakeholders something&#8221; instead of &#8220;we don&#8217;t really have any ready data on that&#8221; or &#8220;oh, that&#8217;ll be involved, we might be able to work that into the next sprint&#8221; (at which point the data is, to a rough approximation, always useless: the decision&#8217;s been made). The question is: &#8220;Do you have something that&#8217;s probably better than vibes?&#8221; If so, ship it.]</em></p><p>The point of a survey is to create data where we don&#8217;t have it. The typical types of missing data are:</p><ol><li><p>We don&#8217;t have price variation. The price has never changed before. </p></li><li><p>We don&#8217;t have product variation. Either everyone has always had the product, or no one has ever had it. So we don&#8217;t know how much anyone will like it.</p></li><li><p>We have no way to connect the new product to an existing product (it&#8217;s not just a re-packaging of goods we&#8217;re already selling).</p></li></ol><div><hr></div><p>It&#8217;s surprising how many problems in statistics amount to missing data problems. Causal inference is all about the fact that we don&#8217;t observe the potential outcome for treatments that people never experienced. Pricing new products is the same kind of problem. We don&#8217;t know what people will pay for products they&#8217;ve never been offered.</p><p>This is the key frame to use when writing surveys: what data is missing? We don&#8217;t just want to run survey to run a survey. We have a goal. We&#8217;re trying to fill in the gaps in our data. Answering this question makes writing a focused, short survey easy and natural. We need to ask questions that extract the missing data.</p><p>We don&#8217;t have price variation? Then we need to ask people, &#8220;Would you buy it at price X?&#8221; and &#8220;Would you buy it at price Y?&#8221; Bam. Now the price varies between X and Y.</p><p>We don&#8217;t have product variation? Suppose we&#8217;re looking at adding a new feature to a bundled subscription. Then, we need to ask the questions &#8220;Would you buy it at price X if it included feature Z?&#8221; and &#8220;Would you buy it at price X if it didn&#8217;t?&#8221; i.e., we need to keep the pricing constant and vary the feature set.</p><p>Another kind of missing data we need to extract from a pricing survey: the respondent's size. If you&#8217;re selling, say, a B2B product, the size of the company purchasing the product will be relevant to how much this customer&#8217;s price sensitivity matters. If you&#8217;re doing seat-based pricing, then you need to know the number of seats the respondent represents. If you&#8217;re selling a transaction-based or usage-based consumer product, you have to get a sense of how many potential transactions or how much potential usage the respondent represents. The particulars of how to do this depend on how demand scales for the product, but it&#8217;ll usually be something like &#8220;how many times do you run workflow X&#8221; or &#8220;how many employees work at your company&#8221;.</p><p>From there, you can maximize revenue/profit (depending on your cost structure) weighted by the respondent&#8217;s demand size (a lot of survey tools don&#8217;t do this sadly: they&#8217;ll just maximize revenue for you without taking into account demand size&#8212;alas). The demand curve is just given to you by the highest prices that people say they&#8217;re willing to accept. </p><p>I like to solve a problem that looks like this:</p><div class="latex-rendered" data-attrs="{&quot;persistentExpression&quot;:&quot;P(a) = \\arg \\max_{P} \\sum_{i=1}^{n} 1\\left(a \\text{WTP}_{i} > P\\right) \\times P \\times W_{i} &quot;,&quot;id&quot;:&quot;LFSOQRWVXR&quot;}" data-component-name="LatexBlockToDOM"></div><p></p><p>Where P is the price, W(i) is the weight associated with the size of the respondent&#8217;s demand (maybe based on their answer to company size questions, etc), WTP(i) is the highest price folks say they&#8217;re willing to pay (the survey usually gives an upper and lower bound on WTP, so it makes sense to solve this at each of those extremes), <em>a </em>is a discount or premium on people&#8217;s stated willingness to pay. I like to check for  robustness to deviations between stated willingness to pay and true willingness to pay, or even just to downweight WTP if you&#8217;re trying to price for growth. So you can plot the optimal price as a function of <em>a </em>and find a price that doesn&#8217;t vary a lot for small deviations in <em>a</em>.</p><p>There&#8217;s a bit of an art to this.</p><div><hr></div><p>For a well-targeted survey, a very high percentage of responses to the &#8220;Any other thoughts?&#8221; prompt are <em>really</em> thoughtful. This isn&#8217;t a real quote, but it&#8217;s illustrative of responses you&#8217;ll get: &#8220;Seat-based pricing wouldn&#8217;t really track the value here. We&#8217;d really only need one seat because only one engineer needs to manage this. The usage option you presented makes more sense, but only if there&#8217;s some cap or it gets cheaper as we scale&#8230;&#8221; </p><p>Humans like being helpful, and even though it takes them time, and it doesn&#8217;t really affect whether they get the $25 gift card, respondents take surveys seriously. Because humans are generally good folks who like to help their fellow corporate drones out. Go figure. The kids call this a &#8220;white pill&#8221; (I think?).</p><div><hr></div><p>It&#8217;s not like you have to blindly roll out the survey&#8217;s optimal price.  A couple of in-depth interviews with potential customers can at least make sure you&#8217;re not going off the deep end. If someone says, &#8220;That sounds reasonable,&#8221; it probably is. If they say, &#8220;lol what?&#8221; something&#8217;s probably gone wrong.</p><p>You don&#8217;t have to completely discard vibes. Vibes contain useful data. They&#8217;re a statistic of past experience. So, you can use them to discipline the survey, while still basing pricing (or other decisions) on data. If some respondents&#8217; stated willingness to pay makes no economic sense, just drop them. If you&#8217;re worried people are overstating their willingness to pay&#8212;before they have to actually convince Finance to sign off on it&#8212;then just underprice it (set <em>a &lt;</em> 1 in the above problem). </p><p>The point is that you can build trust in survey results. You don&#8217;t have to treat them as a machine that takes responses and converts them to decisions. This makes them infinitely more usable, despite their limitations.</p><div><hr></div><p>I&#8217;ve been thinking a lot about surveys recently. There might be a few more survey-focused techniques in upcoming blogs (thinking through some issues). </p><div><hr></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://underthenull.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Subscribe, please! I&#8217;ve modeled the newsletter&#8217;s revenue-maximizing price at $0 and priced it accordingly!</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><div><hr></div><p>Zach</p><p>Connect at: <a href="https://linkedin.com/in/zlflynn">https://linkedin.com/in/zlflynn</a></p>]]></content:encoded></item><item><title><![CDATA[I Want To Get Good]]></title><description><![CDATA[In which I try to get good at a new thing]]></description><link>https://underthenull.com/p/i-want-to-get-good</link><guid isPermaLink="false">https://underthenull.com/p/i-want-to-get-good</guid><dc:creator><![CDATA[Zach Flynn]]></dc:creator><pubDate>Sat, 09 May 2026 17:48:33 GMT</pubDate><enclosure url="https://images.unsplash.com/photo-1554757387-fa0367573d09?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw5fHxub3RlYm9va3xlbnwwfHx8fDE3NzgyMTU3MjR8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://images.unsplash.com/photo-1554757387-fa0367573d09?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw5fHxub3RlYm9va3xlbnwwfHx8fDE3NzgyMTU3MjR8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://images.unsplash.com/photo-1554757387-fa0367573d09?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw5fHxub3RlYm9va3xlbnwwfHx8fDE3NzgyMTU3MjR8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 424w, https://images.unsplash.com/photo-1554757387-fa0367573d09?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw5fHxub3RlYm9va3xlbnwwfHx8fDE3NzgyMTU3MjR8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 848w, https://images.unsplash.com/photo-1554757387-fa0367573d09?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw5fHxub3RlYm9va3xlbnwwfHx8fDE3NzgyMTU3MjR8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 1272w, https://images.unsplash.com/photo-1554757387-fa0367573d09?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw5fHxub3RlYm9va3xlbnwwfHx8fDE3NzgyMTU3MjR8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 1456w" sizes="100vw"><img src="https://images.unsplash.com/photo-1554757387-fa0367573d09?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw5fHxub3RlYm9va3xlbnwwfHx8fDE3NzgyMTU3MjR8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080" width="5236" height="3491" data-attrs="{&quot;src&quot;:&quot;https://images.unsplash.com/photo-1554757387-fa0367573d09?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw5fHxub3RlYm9va3xlbnwwfHx8fDE3NzgyMTU3MjR8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:3491,&quot;width&quot;:5236,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;opened notebook&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="opened notebook" title="opened notebook" srcset="https://images.unsplash.com/photo-1554757387-fa0367573d09?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw5fHxub3RlYm9va3xlbnwwfHx8fDE3NzgyMTU3MjR8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 424w, https://images.unsplash.com/photo-1554757387-fa0367573d09?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw5fHxub3RlYm9va3xlbnwwfHx8fDE3NzgyMTU3MjR8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 848w, https://images.unsplash.com/photo-1554757387-fa0367573d09?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw5fHxub3RlYm9va3xlbnwwfHx8fDE3NzgyMTU3MjR8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 1272w, https://images.unsplash.com/photo-1554757387-fa0367573d09?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw5fHxub3RlYm9va3xlbnwwfHx8fDE3NzgyMTU3MjR8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Photo by <a href="https://unsplash.com/@ashleywedwards">Ashley West Edwards</a> on <a href="https://unsplash.com">Unsplash</a></figcaption></figure></div><p>I&#8217;ve decided to write well.</p><p>Now, I know the first step traditionally is to move to Paris or a small American town&#8212;you can get away with NYC if you&#8217;ve got old money&#8212;and preferably not be employed in B2B SaaS, but I don&#8217;t have that kind of dedication. I like money, I have suburban tastes, and I like my neighbors like I like my comments&#8212;anonymous.</p><p>So, I&#8217;m going to try another tactic: practice. </p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://underthenull.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://underthenull.com/subscribe?"><span>Subscribe now</span></a></p><p>I&#8217;ve been blogging once or twice a month on <em>statistics</em> (which you call &#8220;data science&#8221; when you&#8217;re trying to get a job) for a few years now, but I&#8217;m going to write more frequently now. My goal is to put out a blog three out of every seven days.</p><p>Of course, that doesn&#8217;t mean I&#8217;ll write up three experimentation techniques every week, like in the old blogs. I have a limited supply of these! But I realized I had a lot of thoughts about industry tools, practices, news, etc., and just listing the ideas in my little <a href="https://www.fizzy.do/">Kanban board</a> made it clear there was enough content to do it. </p><p>So, we&#8217;re broadening our horizons, limited by the following principles:</p><ol><li><p>I have to care about the topic.</p></li><li><p>I have to know enough about it to not sound stupid (hard!).</p></li></ol><p>Especially looking forward to doing more tools-of-the-trade reviews! I did one recently on <a href="https://zachflynn.substack.com/p/reviewing-ggsql-a-grammar-of-graphics">ggsql</a>. There&#8217;s a ton of products, tools, techniques, etc that I&#8217;ve never really used because they weren&#8217;t used at prior jobs&#8212;or, they&#8217;re new&#8212;and it&#8217;d be fun to take a look at them. </p><p>I&#8217;ve got some initial ideas, but feel free to pitch me on tools to review! Including ones you wrote! (With the warning that I will say what I think of it. My rate for lying about how great your tool is $1 million. So readers should know that either I think the tool is really good or you paid me $1 million.)</p><p>Looking forward to the challenge! My current plan is to write the posts mainly over the weekend and schedule them throughout the week, but we&#8217;ll see how it evolves&#8230;</p><div><hr></div><p>Zach</p><p>Connect at: <a href="https://linkedin.com/in/zlflynn">https://linkedin.com/in/zlflynn</a></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://underthenull.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Marginal Science! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p>]]></content:encoded></item><item><title><![CDATA[Reviewing ggsql, a grammar of graphics for SQL]]></title><description><![CDATA[Reviewing an SQL-ish ggplot from Posit!]]></description><link>https://underthenull.com/p/reviewing-ggsql-a-grammar-of-graphics</link><guid isPermaLink="false">https://underthenull.com/p/reviewing-ggsql-a-grammar-of-graphics</guid><dc:creator><![CDATA[Zach Flynn]]></dc:creator><pubDate>Mon, 27 Apr 2026 04:46:45 GMT</pubDate><enclosure url="https://images.unsplash.com/photo-1642516303080-431f6681f864?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw1Mnx8Y2hhcnR8ZW58MHx8fHwxNzc3MjY0NDExfDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://images.unsplash.com/photo-1642516303080-431f6681f864?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw1Mnx8Y2hhcnR8ZW58MHx8fHwxNzc3MjY0NDExfDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://images.unsplash.com/photo-1642516303080-431f6681f864?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw1Mnx8Y2hhcnR8ZW58MHx8fHwxNzc3MjY0NDExfDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 424w, https://images.unsplash.com/photo-1642516303080-431f6681f864?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw1Mnx8Y2hhcnR8ZW58MHx8fHwxNzc3MjY0NDExfDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 848w, https://images.unsplash.com/photo-1642516303080-431f6681f864?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw1Mnx8Y2hhcnR8ZW58MHx8fHwxNzc3MjY0NDExfDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 1272w, https://images.unsplash.com/photo-1642516303080-431f6681f864?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw1Mnx8Y2hhcnR8ZW58MHx8fHwxNzc3MjY0NDExfDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 1456w" sizes="100vw"><img src="https://images.unsplash.com/photo-1642516303080-431f6681f864?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw1Mnx8Y2hhcnR8ZW58MHx8fHwxNzc3MjY0NDExfDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080" width="3800" height="2250" data-attrs="{&quot;src&quot;:&quot;https://images.unsplash.com/photo-1642516303080-431f6681f864?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw1Mnx8Y2hhcnR8ZW58MHx8fHwxNzc3MjY0NDExfDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:2250,&quot;width&quot;:3800,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;a very large group of trees that are very colorful&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="a very large group of trees that are very colorful" title="a very large group of trees that are very colorful" srcset="https://images.unsplash.com/photo-1642516303080-431f6681f864?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw1Mnx8Y2hhcnR8ZW58MHx8fHwxNzc3MjY0NDExfDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 424w, https://images.unsplash.com/photo-1642516303080-431f6681f864?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw1Mnx8Y2hhcnR8ZW58MHx8fHwxNzc3MjY0NDExfDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 848w, https://images.unsplash.com/photo-1642516303080-431f6681f864?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw1Mnx8Y2hhcnR8ZW58MHx8fHwxNzc3MjY0NDExfDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 1272w, https://images.unsplash.com/photo-1642516303080-431f6681f864?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw1Mnx8Y2hhcnR8ZW58MHx8fHwxNzc3MjY0NDExfDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Photo by <a href="https://unsplash.com/@maxberg">Maxim Berg</a> on <a href="https://unsplash.com">Unsplash</a></figcaption></figure></div><p>Posit released a new library for graphics programming (plotting) in a SQL-ish style language called <strong><a href="https://ggsql.org/">ggsql</a></strong>. It&#8217;s aiming to be like its ggplot project for R/Python, but with a SQL-ish syntax, which, I guess, is becoming more and more the language of everything (remember the NoSQL moment in the early 2010&#8217;s&#8230; yeah, that&#8217;s dead).</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://underthenull.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://underthenull.com/subscribe?"><span>Subscribe now</span></a></p><p></p><p>I gave it a spin over the weekend on some &#8220;ancient&#8221; data I re-discovered in an old Dropbox folder. In grad school, I scraped the internet for this data on radio station coverage and formed markets from sequences of intersecting stations for this paper I was working on. </p><p>The site was trying to stop scrapers, so I had a Perl script randomly cycle through a set of User Agents and switch Tor proxies frequently while downloading thousands of pages (it blocked every 1-5 and the algorithm tried to find the right combo of waiting + user agent switching + tor proxy restart that would unblock me). The site&#8217;s solution for stopping scraping was pretty good. It took my little eeePC netbook (remember those!) weeks to get all the data with all the switching, random pausing, and delays I threw in there to get past the detection automatically. I just kept the laptop open night and day. The big hole in their scraping-prevention technique was that they assumed the scraper valued their time and sanity more than paying them $100 (I think it was about that much to get a computer-readable form of the data). Their model of the world did not include a graduate student making ~$10k a year, who was perfectly content to parse HTML and wait weeks to save $100.</p><p>In any case, I haven&#8217;t looked at this data in forever, so it felt like the perfect laboratory to poke around with ggsql.</p><p>Funny coincidence: this paper was the last project I worked on, where I used <a href="https://cran.r-project.org/web/packages/lattice/index.html">lattice</a> for the graphs, not ggplot.</p><h2>What ggsql does (with a few examples)</h2><p>ggsql uses a &#8220;reader&#8221; that processes the pure SQL parts of the statement and the ggsql extensions. The easiest way for me to test things was with the DuckDBReader, which lets me visualize the output of DuckDB queries. I imagine there are other readers for different databases (or, there soon will be).  </p><p>ggsql outputs <a href="https://vega.github.io/">Vega</a> (a JSON format for graphics). Vega makes a lot of sense as an output target because it&#8217;s flexible, low-level, and plays nicely on the web side + it&#8217;s got some institutional support, and tools on top of this are sort of the key to making ggsql valuable. We can transform it directly on the web via the JavaScript library, so you can send the Vega output to the front end and render it on the fly. </p><p>To get a sense for what it looks like, here&#8217;s the syntax for plotting a histogram of the number of radio stations within each market.</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;sql&quot;,&quot;nodeId&quot;:&quot;1c9d7475-c4e5-4f43-949e-e397495e67a0&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-sql">SELECT * FROM radio_markets
VISUALIZE Firms AS x
DRAW histogram
LABEL title =&gt; 'Radio Station Distribution Across Markets',
x =&gt; 'Radio Stations',
y =&gt; 'Markets'
</code></pre></div><p>This is what it looks like after rendering:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!LJ_e!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F893dfa6d-5d40-4174-8760-4e88e7539136_1000x600.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!LJ_e!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F893dfa6d-5d40-4174-8760-4e88e7539136_1000x600.png 424w, https://substackcdn.com/image/fetch/$s_!LJ_e!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F893dfa6d-5d40-4174-8760-4e88e7539136_1000x600.png 848w, https://substackcdn.com/image/fetch/$s_!LJ_e!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F893dfa6d-5d40-4174-8760-4e88e7539136_1000x600.png 1272w, https://substackcdn.com/image/fetch/$s_!LJ_e!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F893dfa6d-5d40-4174-8760-4e88e7539136_1000x600.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!LJ_e!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F893dfa6d-5d40-4174-8760-4e88e7539136_1000x600.png" width="1000" height="600" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/893dfa6d-5d40-4174-8760-4e88e7539136_1000x600.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:600,&quot;width&quot;:1000,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:50166,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://zachflynn.substack.com/i/194825798?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F893dfa6d-5d40-4174-8760-4e88e7539136_1000x600.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!LJ_e!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F893dfa6d-5d40-4174-8760-4e88e7539136_1000x600.png 424w, https://substackcdn.com/image/fetch/$s_!LJ_e!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F893dfa6d-5d40-4174-8760-4e88e7539136_1000x600.png 848w, https://substackcdn.com/image/fetch/$s_!LJ_e!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F893dfa6d-5d40-4174-8760-4e88e7539136_1000x600.png 1272w, https://substackcdn.com/image/fetch/$s_!LJ_e!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F893dfa6d-5d40-4174-8760-4e88e7539136_1000x600.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The part preceding <code>VISUALIZE</code> is just standard SQL. You can add <code>WHERE</code>, <code>JOIN</code> stuff, etc.</p><p>After <code>VISUALIZE, </code>we enter ggsql mode and start providing (approximately) the ggplot arguments in this SQL-ish syntax.</p><p>If you&#8217;ve used ggplot before, there&#8217;s this concept of &#8220;aesthetics&#8221; where we define the x-axis, the y-axis, colors, etc. <code>VISUALIZE Firms AS x</code> puts the SQL variable <code>Firm</code> into the <code>x</code> part of the aesthetic. You can also do <code>VISUALIZE Firms As X, blah AS Y, blah2 AS color, etc, etc</code>.</p><p>The <code>DRAW</code> clause tells it what kind of visualization to make (you can have multiple DRAW layers, of course), and <code>LABEL</code>&#8230; labels things (it can also change the tick labels, not just the axes, and alter any legends, etc).</p><p>By the way, to actually run this, I wrote a Python script. That&#8217;s clearly not the vision for how to use this. The idea is more of a notebook or other UI that can parse Vega output automatically to show the visualizations as output from an SQL cell or as results in an SQL-running UI, like Databricks/BigQuery/etc. But for messing around with it, you can do something like this:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;python&quot;,&quot;nodeId&quot;:&quot;d686cf67-39c0-4748-b8e1-73defe1d934d&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-python">import ggsql
import pandas as pd
import duckdb

df = pd.read_csv("radio_market_selected_30.csv", sep=":")

with duckdb.connect("radio.db") as con:
    con.sql("CREATE OR REPLACE TABLE radio_markets AS SELECT * FROM df")
    
reader = ggsql.DuckDBReader("duckdb://radio.db")

viz_query = """
SELECT * FROM radio_markets
VISUALIZE Firms AS x
DRAW histogram
SCALE y
LABEL title =&gt; 'Radio Station Distribution Across Markets',
x =&gt; 'Radio Stations',
y =&gt; 'Markets'
"""

viz = reader.execute(viz_query)

writer = ggsql.VegaLiteWriter()
vegalite_json = writer.render(viz)
print(vegalite_json)</code></pre></div><p>And then, I just did:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;bash&quot;,&quot;nodeId&quot;:&quot;12e9365e-5a71-4986-9862-3a6d8a3091b4&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-bash">python3 histogram.py | xclip -selection clipboard</code></pre></div><p>And rendered it in Vega&#8217;s online demo thing: <a href="https://vega.github.io/editor/">https://vega.github.io/editor/</a></p><p>[PS. Did you notice the source file is colon-separated lol? As best I can figure, given how long ago this was, I did it that way because the city names had commas in them (Peoria, IL), and I didn&#8217;t want to quote the strings :) ]</p><p>To show the SQL elements of this, here&#8217;s the same chart, deleting the long tail that starts at around 200 stations.</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;sql&quot;,&quot;nodeId&quot;:&quot;abac966b-ce77-4ed2-9fa3-c51fc5a7b4b5&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-sql">SELECT * FROM radio_markets
WHERE Firms &lt;= 200
VISUALIZE Firms AS x
DRAW histogram
LABEL title =&gt; 'Radio Station Distribution Across Markets',
x =&gt; 'Radio Stations',
y =&gt; 'Markets'</code></pre></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!U1N-!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c1e55d3-2d71-4f8c-90df-2aa4a27903ff_1000x600.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!U1N-!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c1e55d3-2d71-4f8c-90df-2aa4a27903ff_1000x600.png 424w, https://substackcdn.com/image/fetch/$s_!U1N-!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c1e55d3-2d71-4f8c-90df-2aa4a27903ff_1000x600.png 848w, https://substackcdn.com/image/fetch/$s_!U1N-!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c1e55d3-2d71-4f8c-90df-2aa4a27903ff_1000x600.png 1272w, https://substackcdn.com/image/fetch/$s_!U1N-!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c1e55d3-2d71-4f8c-90df-2aa4a27903ff_1000x600.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!U1N-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c1e55d3-2d71-4f8c-90df-2aa4a27903ff_1000x600.png" width="1000" height="600" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5c1e55d3-2d71-4f8c-90df-2aa4a27903ff_1000x600.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:600,&quot;width&quot;:1000,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:51748,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://zachflynn.substack.com/i/194825798?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c1e55d3-2d71-4f8c-90df-2aa4a27903ff_1000x600.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!U1N-!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c1e55d3-2d71-4f8c-90df-2aa4a27903ff_1000x600.png 424w, https://substackcdn.com/image/fetch/$s_!U1N-!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c1e55d3-2d71-4f8c-90df-2aa4a27903ff_1000x600.png 848w, https://substackcdn.com/image/fetch/$s_!U1N-!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c1e55d3-2d71-4f8c-90df-2aa4a27903ff_1000x600.png 1272w, https://substackcdn.com/image/fetch/$s_!U1N-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c1e55d3-2d71-4f8c-90df-2aa4a27903ff_1000x600.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The best way to explore a new tool and figure out if it&#8217;s really a sensible system worth adopting is to just try to make something more involved from the basic getting-started examples, without referencing the docs until you absolutely have to. What you&#8217;re looking for is whether things work logically together. You start to intuit the logic of a system (or lack thereof) when you force yourself to try and figure it out instead of just Googling/LLM&#8217;ing for &#8220;how do I&#8230;&#8221;</p><p>ggsql definitely passes that test. It&#8217;s natural and intuitive. Here&#8217;s a slightly more involved example to see what I mean:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;sql&quot;,&quot;nodeId&quot;:&quot;053ff093-2f4e-49e8-8af7-d71b05297ccf&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-sql">SELECT * FROM radio_markets
WHERE Firms &lt;= 200
VISUALIZE Area AS x, Firms AS y
DRAW point
   MAPPING Population AS size
   SETTING fill =&gt; null
LABEL title =&gt; 'Radio Stations and Physical Area',
x =&gt; 'Radio Stations',
y =&gt; 'Land Area (sq. mi.)',
size =&gt; 'Population (100k)'</code></pre></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!9nL2!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c930f67-f8c0-4059-93f7-4feb877a3682_1000x600.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!9nL2!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c930f67-f8c0-4059-93f7-4feb877a3682_1000x600.png 424w, https://substackcdn.com/image/fetch/$s_!9nL2!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c930f67-f8c0-4059-93f7-4feb877a3682_1000x600.png 848w, https://substackcdn.com/image/fetch/$s_!9nL2!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c930f67-f8c0-4059-93f7-4feb877a3682_1000x600.png 1272w, https://substackcdn.com/image/fetch/$s_!9nL2!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c930f67-f8c0-4059-93f7-4feb877a3682_1000x600.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!9nL2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c930f67-f8c0-4059-93f7-4feb877a3682_1000x600.png" width="1000" height="600" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0c930f67-f8c0-4059-93f7-4feb877a3682_1000x600.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:600,&quot;width&quot;:1000,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:84033,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://zachflynn.substack.com/i/194825798?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c930f67-f8c0-4059-93f7-4feb877a3682_1000x600.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!9nL2!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c930f67-f8c0-4059-93f7-4feb877a3682_1000x600.png 424w, https://substackcdn.com/image/fetch/$s_!9nL2!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c930f67-f8c0-4059-93f7-4feb877a3682_1000x600.png 848w, https://substackcdn.com/image/fetch/$s_!9nL2!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c930f67-f8c0-4059-93f7-4feb877a3682_1000x600.png 1272w, https://substackcdn.com/image/fetch/$s_!9nL2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c930f67-f8c0-4059-93f7-4feb877a3682_1000x600.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h1>My Takes</h1><p>First off, this is super smooth, and I&#8217;ve always liked the &#8220;grammar of graphics&#8221; idea. It&#8217;s conceptually clear, easy to use, and easy to extend. It&#8217;s a great way to add plots to SQL. The part I&#8217;m stuck thinking about after playing with it is whether that&#8217;s what I want to do&#8230;</p><p>I can&#8217;t see this being very useful as a standalone thing. Even in a notebook, the utility seems limited. Being in SQL in-and-of-itself seems like it would only matter to the set of people who <em>can</em> be bothered to learn this new syntax but <em>can&#8217;t </em>be bothered to learn/don&#8217;t already know basic Python/R. I haven&#8217;t run a survey, but I&#8217;m pretty sure that&#8217;s an empty set. If I&#8217;m in a notebook, I already have access to ggplot/matplotlib/whatever, and I probably know how to use it.</p><p>One standalone use case that is valuable: it should make it easier to run visualizations on your main database compute engine, avoiding first loading the query results into your instance and then running Python/R/etc. You can return the Vega from the compute, plot it, and never touch the full dataset locally. That is super valuable if you&#8217;re plotting a larger dataset.</p><p>But the better use case really needs a full system where folks&#8212;or their Robots&#8212;write visualizations inline in a BI tool. ggsql (in its current state) isn&#8217;t a real replacement for the kind of viz you&#8217;d want in a BI tool, though. It&#8217;s not a language that can express (as far as I can tell) table viz, pivot tables, single value elements, layouts, etc. So, it&#8217;s got some of the elements, but not enough to replace a dashboard-like system. </p><p>On the other hand, it seems &#8220;right&#8221; to extend SQL with a declarative visualization layer on top of it. A good direction to go&#8212;and I have a feeling this is the plan&#8212;would be to add their <strong><a href="https://gt.rstudio.com/">grammar of tables</a> </strong>as well to get a fuller system for expressing visual output in SQL.</p><p>Another thing I noticed was that I don&#8217;t think the <code>VISUALIZE</code> syntax is exactly a SQL extension in the sense that I don&#8217;t think it really has the same semantics or processing. Here&#8217;s an example I stumbled upon because this old dataset still has the base-R-like periods substituting for spaces in variable names:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;python&quot;,&quot;nodeId&quot;:&quot;d097d19c-f3b8-4d00-bd81-cc6ea92c89cf&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-python">import duckdb
import ggsql
import pandas as pd

df = pd.DataFrame({"numbers": [1,2], "variable": [3,4], "variable.dotted": [3, 4]})
with duckdb.connect("reproduce.db") as con:
    con.sql("CREATE OR REPLACE TABLE test AS SELECT * FROM df")

reader = ggsql.DuckDBReader("duckdb://reproduce.db")

## Quoting the dotted variable name works in DuckDB.

with duckdb.connect("reproduce.db") as con:
    print(con.sql("SELECT \"variable.dotted\" FROM test"))

### But not in ggsql
viz_query = """
SELECT * FROM test
VISUALIZE numbers AS x, "variable.dotted" AS y
DRAW line
LABEL title =&gt; 'variable ~ numbers'
"""
viz = reader.execute(viz_query)

writer = ggsql.VegaLiteWriter()
vegalite_json = writer.render(viz) # errors</code></pre></div><p>I haven&#8217;t done a deep dive into the code base, but this very minor bug (?) suggests to me that ggsql sits outside the SQL engine and isn&#8217;t transparently working on the SQL elements. At least, that&#8217;s my first guess at why quoting wouldn&#8217;t work in its context.  I could be wrong here, and maybe it&#8217;s just a bug on the Writer side (I filed an issue with the GitHub project, so maybe that&#8217;ll be all it is). It&#8217;s a small thing anyway.</p><h1>Conclusion</h1><p>In general, this is a nice solution to the problem of wanting ggplot in SQL. It solves that problem fantastically. Very clean. Very intuitive if you already know ggplot. I could guess how to do things after an hour or two playing with it, and I was usually right. So, that&#8217;s an incredibly strong win.</p><p>I&#8217;m less convinced it&#8217;ll become anyone&#8217;s daily driver unless it delivers a full BI experience. In the short run, I see the main use case being to create visualizations for large datasets that you don&#8217;t want to pull into memory. That&#8217;s a real use case, but a bit narrower than I was hoping for when I started playing with it.</p><p>As of today, I think it&#8217;d be faster for me, in most cases, to just copy-paste the query output into Google Sheets and plot it there if I want a quick visualization, but we&#8217;ll see where things go!</p><p>Things are happening&#8212;even in SQL.</p><div><hr></div><p>Thanks for reading!</p><p>Zach</p><p>Connect at: <a href="https://www.linkedin.com/in/zlflynn/">https://www.linkedin.com/in/zlflynn/</a></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://underthenull.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Good Enough Statistics! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[New Things With Pseudo-True Estimators]]></title><description><![CDATA[Reading Club: Optimally-Transported GMM]]></description><link>https://underthenull.com/p/new-things-with-pseudo-true-estimators</link><guid isPermaLink="false">https://underthenull.com/p/new-things-with-pseudo-true-estimators</guid><dc:creator><![CDATA[Zach Flynn]]></dc:creator><pubDate>Fri, 17 Apr 2026 06:40:42 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!gs9M!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F68faa797-9bd6-4df0-abaf-8af5f75c1e39_989x989.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!RoGr!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F831b33d7-7639-447b-bfc3-742df96a774d_220x220.gif" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!RoGr!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F831b33d7-7639-447b-bfc3-742df96a774d_220x220.gif 424w, https://substackcdn.com/image/fetch/$s_!RoGr!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F831b33d7-7639-447b-bfc3-742df96a774d_220x220.gif 848w, https://substackcdn.com/image/fetch/$s_!RoGr!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F831b33d7-7639-447b-bfc3-742df96a774d_220x220.gif 1272w, https://substackcdn.com/image/fetch/$s_!RoGr!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F831b33d7-7639-447b-bfc3-742df96a774d_220x220.gif 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!RoGr!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F831b33d7-7639-447b-bfc3-742df96a774d_220x220.gif" width="320" height="320" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/831b33d7-7639-447b-bfc3-742df96a774d_220x220.gif&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:220,&quot;width&quot;:220,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:235973,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/gif&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://zachflynn.substack.com/i/194196975?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F831b33d7-7639-447b-bfc3-742df96a774d_220x220.gif&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!RoGr!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F831b33d7-7639-447b-bfc3-742df96a774d_220x220.gif 424w, https://substackcdn.com/image/fetch/$s_!RoGr!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F831b33d7-7639-447b-bfc3-742df96a774d_220x220.gif 848w, https://substackcdn.com/image/fetch/$s_!RoGr!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F831b33d7-7639-447b-bfc3-742df96a774d_220x220.gif 1272w, https://substackcdn.com/image/fetch/$s_!RoGr!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F831b33d7-7639-447b-bfc3-742df96a774d_220x220.gif 1456w" sizes="100vw" fetchpriority="high"></picture><div></div></div></a></figure></div><h2>Reading Club! April Edition!</h2><p>I&#8217;m starting a new thing. I&#8217;m going to write about a recent paper that strikes my fancy  once a month. More as a commitment device for myself to keep up with the lit than anything. I won&#8217;t just dive into the paper. I&#8217;ll talk about the relevant literature beforehand so the post is more or less self-contained.</p><p>This month&#8217;s paper is from a little-known, small journal from the fringes of Economics academia: &#8220;Econometrica.&#8221; It&#8217;s about figuring out how best to use the data to inform model estimates when we&#8217;ve got enough evidence to know the model&#8217;s &#8220;wrong.&#8221;</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://underthenull.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://underthenull.com/subscribe?"><span>Subscribe now</span></a></p><p>It&#8217;s one of those excuses you&#8217;ll hear. &#8220;I know the model&#8217;s wrong, but all models are wrong,&#8221; and you, the listener, who is both smarter and better-looking, think, &#8220;Well, yes, but, like, clearly there&#8217;s a limit to that. If it&#8217;s <em>really</em> wrong about important things, that matters!&#8221; Wouldn&#8217;t you know it? There is a whole literature about estimation when we know the model is sort of wrong. Here&#8217;s part of it and the links!</p><p>The Paper: March 2026, Econometrica: <a href="https://www.econometricsociety.org/publications/econometrica/2026/03/01/Optimally-Transported-Generalized-Method-of-Moments">https://www.econometricsociety.org/publications/econometrica/2026/03/01/Optimally-Transported-Generalized-Method-of-Moments</a> </p><p>Free ArXiv Link: <a href="https://arxiv.org/pdf/2511.05712">https://arxiv.org/pdf/2511.05712</a> </p><h2>Generalized Method of Moments</h2><p>To grok the paper, we have to start with the kind of estimation problem we&#8217;re looking at. It&#8217;s a Generalized Method of Moments problem, a very common method in economics, but the thing about statistics is that many fields teach it and they all do it a little differently&#8212;mostly by historical accident. I think I&#8217;d like this framework, even if I wasn&#8217;t brainwashed into liking it by my education, but I guess that counterfactual is unobserved&#8230; It&#8217;s a nice, flexible way to look at the empirical implications of a model.</p><p>Suppose we have a vector of parameters <em>b</em>. The Generalized Method of Moments (GMM) thinks about problems where the parameters are identified by &#8220;moment restrictions&#8221; like this:</p><div class="latex-rendered" data-attrs="{&quot;persistentExpression&quot;:&quot;E[g(X, b)] = 0&quot;,&quot;id&quot;:&quot;YGBPQYSVON&quot;}" data-component-name="LatexBlockToDOM"></div><p>You can write a slew of common estimators like this. </p><ul><li><p>OLS: E[X(Y - X&#8217;b)] = 0</p></li><li><p>IV: E[Z(Y - X&#8217;b)] = 0</p></li><li><p>Maximum Likelihood: E[ (dlog f/db)(X, b)] = 0</p></li><li><p>Quantile regression: E[X (p - 1(Y &lt;= X&#8217;b))] = 0</p></li><li><p>Etc.</p></li></ul><p>The idea is that Models produce moments, so by finding the model parameters that satisfy the moment conditions, we identify the version of our model that matches the data.</p><p>For another example, in an older post, <a href="https://zachflynn.substack.com/p/accelerating-online-experiments-that-target-quantile-treatment-effects-2">I used GMM to build this estimator that reduces the variance of quantile treatment effects in experiments.</a></p><p>Usually, we estimate the model by solving some version of this problem:</p><div class="latex-rendered" data-attrs="{&quot;persistentExpression&quot;:&quot;\\min_{b} \\hat{E}[g(X_{i}, b)]^{\\top} W \\hat{E}[g(X_{i}, b)]&quot;,&quot;id&quot;:&quot;KOKQHADAIH&quot;}" data-component-name="LatexBlockToDOM"></div><p>For some weighting matrix W. The estimator is consistent for any positive definite W, so the choice comes down to efficiency. </p><h2>Overidentification</h2><p>But sometimes models produce more moments than we need to estimate the parameters. This &#8220;overidentification&#8221; is useful because it allows us to use the extra moments to test whether the model is true. Intuition: a subset of the moment conditions pins down the model parameters, but we still have other moment conditions left over after fitting that we can plug the model parameters into to see whether all the restrictions can hold simultaneously.</p><p>But what if the model fails the test? What if it&#8217;s rejected by the data? It&#8217;s not terribly surprising that a model doesn&#8217;t hold exactly. So, how can we decide whether the model is wrong in the sense that it&#8217;s a simplification of a messy reality or if it&#8217;s wrong in the sense that we&#8217;re missing something critical?</p><p>One idea that emerged in the literature was: what if we could minimize the distance between our modeling assumptions and the data? We could capture some &#8220;pseudo-true&#8221; parameter, i.e., the most realistic parameter for the model given the data.</p><p>The parameter estimated by the GMM procedure above doesn&#8217;t really reflect that goal. It finds the parameter that minimizes the weighted norm of the moment conditions, which can have strong efficiency properties if the model is correctly specified. But if the model is wrong? Well, then the GMM estimator doesn&#8217;t really connect well with intuition about a parameter that minimizes the distance between the data and what the model requires. It&#8217;s just minimizing the norm of the moment conditions.</p><h2>Empirical Likelihood</h2><p>One idea in this vein is known as Empirical Likelihood, or EL. The empirical distribution assigns probability 1/n to each X(i), and we know this distribution doesn&#8217;t satisfy the moment conditions for any parameter b, but what if we take the mass points of the empirical distribution and tilt them until the moment conditions <em>are</em> satisfied for some b? What if we estimated the distribution of the data, subject to the constraint that it satisfies our model? </p><p>The empirical likelihood estimator does exactly like that. It maximizes the likelihood of the data subject to the moment condition:</p><div class="latex-rendered" data-attrs="{&quot;persistentExpression&quot;:&quot;\\max \\sum \\log p_{i} \\quad st: \\quad \\sum p_{i} g(X_{i}, b) = 0, p_{i} >= 0, \\sum p_{i} = 1&quot;,&quot;id&quot;:&quot;IRXWTPYNKM&quot;}" data-component-name="LatexBlockToDOM"></div><p>Note that without the moment conditions, the solution to this problem is p(i) = 1/n, i.e., the empirical distribution. The non-negativity constraints can&#8217;t bind because the derivative of log approaches infinity as its argument approaches 0, so the first order condition is:</p><p>1/p(i) = lambda =&gt; all the p(i)&#8217;s are equal so p(i) = 1/n.</p><p>That means that if there were a <em>b</em> parameter that satisfied the moment conditions, we would just set p(i) = 1/n and not make any adjustments to the data. We&#8217;re effectively maximizing the log likelihood of the empirical distribution subject to the constraints of our model.</p><p>Even though there are <em>n + dimension(b)</em> number of parameters, there are nice tricks for computing the estimator from the first order conditions, i.e.</p><div class="latex-rendered" data-attrs="{&quot;persistentExpression&quot;:&quot;1/p(i) - \\sum \\mu_{k} g_{k}(X_{i}, b) = \\lambda&quot;,&quot;id&quot;:&quot;TYXRGBDTRS&quot;}" data-component-name="LatexBlockToDOM"></div><p>So, </p><div class="latex-rendered" data-attrs="{&quot;persistentExpression&quot;:&quot;p_{i}(\\lambda + \\sum \\mu_{k} g_{k}(X_{i}, b)) = 1. &quot;,&quot;id&quot;:&quot;MLCXJAFKEU&quot;}" data-component-name="LatexBlockToDOM"></div><p>Summing across i gives (from sum p(i) = 1 and sum p(i) g_k(X(i),b) = 0:</p><div class="latex-rendered" data-attrs="{&quot;persistentExpression&quot;:&quot;\\lambda = n&quot;,&quot;id&quot;:&quot;ODDRPAVTBK&quot;}" data-component-name="LatexBlockToDOM"></div><p>For any given &#8220;b&#8221;, we can then solve for mu via the equations:</p><div class="latex-rendered" data-attrs="{&quot;persistentExpression&quot;:&quot;\\sum g(X_{i},b) / (n + \\mu&#8217;g(X_{i},b)) = 0&quot;,&quot;id&quot;:&quot;EJJXYHVVEN&quot;}" data-component-name="LatexBlockToDOM"></div><p>Define the solution as \mu(b).</p><p>So we have this lower-dimensional estimation problem:</p><div class="latex-rendered" data-attrs="{&quot;persistentExpression&quot;:&quot;\\max -\\log(n + \\mu(b)&#8217;g(X_{i}, b))&quot;,&quot;id&quot;:&quot;UCRPLKHAEO&quot;}" data-component-name="LatexBlockToDOM"></div><p></p><h2>Optimally-Transported GMM</h2><p>EL is what the maximum likelihood estimator of the empirical distribution would be if we added our model&#8217;s constraints, but this isn&#8217;t the only way to get at this problem. What if, instead of looking for the closest distribution to the empirical distribution by adjusting probabilities, we changed the mass points?</p><div class="latex-rendered" data-attrs="{&quot;persistentExpression&quot;:&quot;\\min_{Z,b} \\sum ||X_{i} - Z_{i}||^{2} \\quad st: \\quad \\sum g(Z_{i},b) = 0&quot;,&quot;id&quot;:&quot;CSLJBAJTCC&quot;}" data-component-name="LatexBlockToDOM"></div><p>So, now we&#8217;re keeping the empirical distribution's even weighting but perturbing the data points to make the moment conditions hold, minimizing the distance we travel to &#8220;transport&#8221; X to Z.</p><p>Like EL, this problem also has a convenient solution despite being a high-dimensional optimization problem, but this time based on successive linear approximation, see Algorithm 2.1 in the paper.</p><p>The estimator is intuitive. It finds a distribution of the data that minimizes change, as measured by a clear metric that satisfies the moment conditions. You get numbers for Z(i), so you can start asking questions like: if X(i) had to change that much, do I think I&#8217;m really on the right path in modeling this? Or: yeah, that seems like it&#8217;s just a little off&#8212;fine. It&#8217;s a nice way to quantify how bad a problem the misspecification is.</p><p>Empirical Likelihood can do something similar, but to me, anyway, I have a lot more intuition about variable-space than about probability weights&#8212;your mileage may vary. &#8220;You&#8217;re telling me I have to make revenue numbers twice as large&#8230; weird. I don&#8217;t know if I believe this. No, I don&#8217;t think I do.&#8221;</p><p>Downsides here are that I&#8217;m not sure E[||X-Z||^{2}] is really the loss function we have in mind when we&#8217;re thinking about minimizing how much we change covariates&#8212;I don&#8217;t think it&#8217;s crazy or anything, but I think we&#8217;re usually thinking about something a little less&#8230; &#8220;cardinal&#8221;, is maybe the word I&#8217;m looking for. There are some variables that I can&#8217;t imagine being mismeasured, so I&#8217;m suspicious of moving them around.  The method doesn&#8217;t really depend on the loss function here, but once you&#8217;re out of the least squares-ish world, you lose the nice computational trick, and you&#8217;ve got an n x dimension(X) parameter to optimize over&#8230;</p><p>One idea I had here was to make the problem a little more specific and, based on that, identify more intuitive restrictions for the particular problem. </p><p>For example, the overidentified linear IV model:</p><div class="latex-rendered" data-attrs="{&quot;persistentExpression&quot;:&quot;E[W(Y - X&#8217;b)] = 0&quot;,&quot;id&quot;:&quot;EZDKAGZPPF&quot;}" data-component-name="LatexBlockToDOM"></div><p>And the misspecification we&#8217;re worried about is that some of the IV&#8217;s are invalid. So, write:</p><div class="latex-rendered" data-attrs="{&quot;persistentExpression&quot;:&quot;Y = X&#8217;b + U, \\quad \\text{where U is the structural residual.}&quot;,&quot;id&quot;:&quot;LPPHNBPQUP&quot;}" data-component-name="LatexBlockToDOM"></div><p>And so, we&#8217;ve got:</p><div class="latex-rendered" data-attrs="{&quot;persistentExpression&quot;:&quot;E[W(Y - X&#8217;b)] = E[WU] \\ne 0&quot;,&quot;id&quot;:&quot;ERCBUDBTXX&quot;}" data-component-name="LatexBlockToDOM"></div><p></p><p>Maybe the misspecification problem is that U = E + U* where E is correlated with W but U* isn&#8217;t, so if instead the world had produced U* as the structural residual we wouldn&#8217;t have any misspecification. We could solve for the minimum &#8220;E&#8221; that solves the problem, like so:</p><div class="latex-rendered" data-attrs="{&quot;persistentExpression&quot;:&quot;\\min_{E,b} \\sum |E(i)|^{2} \\quad st: \\sum W_{i}(Y_{i} - X_{i}&#8217;b - E_{i}) = 0&quot;,&quot;id&quot;:&quot;DNNDSYTYOV&quot;}" data-component-name="LatexBlockToDOM"></div><p>So now we have a structural interpretation of the error. If I had to give any modeling advice&#8230; knowing <em>what</em> the error is is the first step toward wisdom&#8230;</p><p>Anyway, I think there are many other interesting applications of this idea and Empirical Likelihood, but I don&#8217;t think I&#8217;ve ever seen it used in industry, despite seeing many examples of overidentified IV models rejected by the data. If you&#8217;ve got a GMM problem and the time, it&#8217;s worth taking a look at these methods to get a sense of the size of the misspecification problem, and, if it&#8217;s small, using pseudo-true estimates that balance the model and the data.</p><div><hr></div><p>Thanks for reading!</p><p>Zach</p><p>Connect at: <a href="https://linkedin.com/in/zlflynn">https://linkedin.com/in/zlflynn</a></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://underthenull.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Good Enough Statistics! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[The Death and Resurrection of the Two-Language Problem]]></title><description><![CDATA[A "Julia" for LLMs]]></description><link>https://underthenull.com/p/the-death-and-resurrection-of-the</link><guid isPermaLink="false">https://underthenull.com/p/the-death-and-resurrection-of-the</guid><dc:creator><![CDATA[Zach Flynn]]></dc:creator><pubDate>Tue, 14 Apr 2026 06:46:16 GMT</pubDate><enclosure url="https://images.unsplash.com/photo-1506351541065-2de5d60265b3?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw3fHx0d298ZW58MHx8fHwxNzc2MTI0MzUyfDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://images.unsplash.com/photo-1506351541065-2de5d60265b3?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw3fHx0d298ZW58MHx8fHwxNzc2MTI0MzUyfDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://images.unsplash.com/photo-1506351541065-2de5d60265b3?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw3fHx0d298ZW58MHx8fHwxNzc2MTI0MzUyfDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 424w, https://images.unsplash.com/photo-1506351541065-2de5d60265b3?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw3fHx0d298ZW58MHx8fHwxNzc2MTI0MzUyfDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 848w, https://images.unsplash.com/photo-1506351541065-2de5d60265b3?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw3fHx0d298ZW58MHx8fHwxNzc2MTI0MzUyfDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 1272w, https://images.unsplash.com/photo-1506351541065-2de5d60265b3?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw3fHx0d298ZW58MHx8fHwxNzc2MTI0MzUyfDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 1456w" sizes="100vw"><img src="https://images.unsplash.com/photo-1506351541065-2de5d60265b3?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw3fHx0d298ZW58MHx8fHwxNzc2MTI0MzUyfDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080" width="2633" height="1757" data-attrs="{&quot;src&quot;:&quot;https://images.unsplash.com/photo-1506351541065-2de5d60265b3?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw3fHx0d298ZW58MHx8fHwxNzc2MTI0MzUyfDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1757,&quot;width&quot;:2633,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;two giraffe illustration&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="two giraffe illustration" title="two giraffe illustration" srcset="https://images.unsplash.com/photo-1506351541065-2de5d60265b3?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw3fHx0d298ZW58MHx8fHwxNzc2MTI0MzUyfDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 424w, https://images.unsplash.com/photo-1506351541065-2de5d60265b3?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw3fHx0d298ZW58MHx8fHwxNzc2MTI0MzUyfDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 848w, https://images.unsplash.com/photo-1506351541065-2de5d60265b3?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw3fHx0d298ZW58MHx8fHwxNzc2MTI0MzUyfDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 1272w, https://images.unsplash.com/photo-1506351541065-2de5d60265b3?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw3fHx0d298ZW58MHx8fHwxNzc2MTI0MzUyfDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Photo by <a href="https://unsplash.com/@vincentvanzalinge">Vincent van Zalinge</a> on <a href="https://unsplash.com">Unsplash</a></figcaption></figure></div><p>Once upon a time, there was a &#8220;Two-Language Problem&#8221; (which led to the creation of Julia; see the <a href="https://math.mit.edu/~edelman/publications/julia_a_fresh.pdf">old texts</a>). The problem was that while most analysis took place in high-level languages like Python or R, both were too slow, so most of the core logic of the various mathematical and statistical packages is not actually written in either language. It&#8217;s written in C (or in Fortran for many R packages). </p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://underthenull.com/p/the-death-and-resurrection-of-the?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://underthenull.com/p/the-death-and-resurrection-of-the?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p><p>One of the main selling points of Julia was that it avoided needing two languages by using a compiler with multiple dispatch to mimic a lot of the niceties of a dynamically-typed, flexible language while still being performant because it could act more like a compiled, statically-type language (each function is compiled once types are known, so the code generated knows the data type). </p><p>I like Julia because multiple dispatch and the language's more functional nature fit mathematics and statistics well. I was never bothered by using two languages in a project. It&#8217;s actually kind of a nice experience to write the parts of an analysis that need to be performant in Fortran, and handle the data cleaning, etc., in R.</p><p>But I admit to liking C and Fortran because they were the first two languages I learned to program in. So, I&#8217;m biased.</p><p>And yet&#8230; like when Nixon said &#8220;We&#8217;re all Keynesians now&#8221;, we&#8217;re all two-language people now. The dream of one language has been deferred. The new dual-language world is Natural Language and X, where X is one of those old programming languages that requires you to think logically and carefully about what you&#8217;re doing (lame). </p><p>Before, the distinction was between a language where you needed to think in bytes and data types and a language where you could be a little more loosey-goosey about such things. Now, the distinction is between a language where you need to think in syntax and semantics and structure, and a language where you don&#8217;t.</p><p>We won&#8217;t be able to ditch structured language entirely. Natural language is a lossy representation of computing, just as the flexible scripting languages before it were. But it loses precision that can&#8217;t be recovered by spending performance.</p><p>The lossyness of Python and Ruby hurt performance. The lossyness of Natural Language hits business logic.</p><p>I predict a language will emerge that solves the modern two-language &#8220;problem&#8221;.  It&#8217;ll be a more structured version of Natural Language that adds back some information, while still partially keeping the loosey-goosey feel of &#8220;build Spotify, make no mistakes.&#8221;</p><p>What I have in mind. Imagine you&#8217;re building a web app purely with AI today. You&#8217;re going to type lots of prompts to fix various things as you debug the app, but that doesn&#8217;t really scale for an app of any real complexity. Natural Language isn&#8217;t precise enough. In most cases, it&#8217;s quicker and better to just fix the code directly once the project is closer to being done.</p><p>But let&#8217;s say you defined things a little more precisely, then maybe you could keep it in Natural Language longer, i.e., in some kind of MVC-ish language:</p><ul><li><p>My app has a Model for users. They have passwords and emails and have to log in. Users can&#8217;t access other users&#8217; stuff unless it&#8217;s been shared with them.</p><ul><li><p>We need endpoints for users to sign-up, log-in, log-out,&#8230;</p></li></ul></li><li><p>My app has a Model for books. Users can write books or upload them as .epubs and share them with each other. There is an in-app reader for books.</p><ul><li><p>We need endpoints for &#8230;</p></li></ul></li><li><p>Etc</p></li></ul><p>So, I&#8217;m specifying the Model and a bit about the Controller components of MVC, and letting the LLM fill in what the views and controllers look like.</p><p>This scaffolding holds a lot more information than &#8220;clone Kindle.&#8221; I can add a model for pages read and mention that I want to bill by that metric rather than fixed prices, and I think the LLMs would do a decent job.</p><p>But this doesn&#8217;t really approach a maintainable language. I think we&#8217;ll get there. Someone will come up with a language that uses this newfangled LLM thing to both keep the expressiveness of Natural Language and recover some of the precision of structured language. </p><p>Or at least that&#8217;s where I hope it goes, because I doubt the old structured languages will ever gain market share.</p><p><em>(Alternatively, we&#8217;ll drown in endless AI slop, where nothing is built to last, and the past severs from the future, so that we exist in a never-ending present, neither returning nor progressing, until our souls, which yearn to plant some small monument, vanish into the void&#8230;)</em></p><p>I bet the language will look kind of like YAML, if I had to guess.</p><div><hr></div><p>Thanks for reading!</p><p>Zach</p><p>Connect at: <a href="https://linkedin.com/in/zlflynn">https://linkedin.com/in/zlflynn</a></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://underthenull.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Good Enough Statistics! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p><p></p><p></p><p></p><p></p><p></p><p></p><p></p>]]></content:encoded></item><item><title><![CDATA[Emergency Blog: Big Arch Review]]></title><description><![CDATA[The blog's first food review!]]></description><link>https://underthenull.com/p/emergency-blog-big-arch-review</link><guid isPermaLink="false">https://underthenull.com/p/emergency-blog-big-arch-review</guid><dc:creator><![CDATA[Zach Flynn]]></dc:creator><pubDate>Thu, 09 Apr 2026 03:51:47 GMT</pubDate><enclosure url="https://images.unsplash.com/photo-1567278526167-6290689c10d4?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwzfHxtY2RvbmFsZHxlbnwwfHx8fDE3NzU3MDU2NDB8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://images.unsplash.com/photo-1567278526167-6290689c10d4?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwzfHxtY2RvbmFsZHxlbnwwfHx8fDE3NzU3MDU2NDB8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://images.unsplash.com/photo-1567278526167-6290689c10d4?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwzfHxtY2RvbmFsZHxlbnwwfHx8fDE3NzU3MDU2NDB8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 424w, https://images.unsplash.com/photo-1567278526167-6290689c10d4?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwzfHxtY2RvbmFsZHxlbnwwfHx8fDE3NzU3MDU2NDB8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 848w, https://images.unsplash.com/photo-1567278526167-6290689c10d4?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwzfHxtY2RvbmFsZHxlbnwwfHx8fDE3NzU3MDU2NDB8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 1272w, https://images.unsplash.com/photo-1567278526167-6290689c10d4?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwzfHxtY2RvbmFsZHxlbnwwfHx8fDE3NzU3MDU2NDB8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 1456w" sizes="100vw"><img src="https://images.unsplash.com/photo-1567278526167-6290689c10d4?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwzfHxtY2RvbmFsZHxlbnwwfHx8fDE3NzU3MDU2NDB8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080" width="3024" height="4032" data-attrs="{&quot;src&quot;:&quot;https://images.unsplash.com/photo-1567278526167-6290689c10d4?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwzfHxtY2RvbmFsZHxlbnwwfHx8fDE3NzU3MDU2NDB8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:4032,&quot;width&quot;:3024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;McDonald's sign post&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="McDonald's sign post" title="McDonald's sign post" srcset="https://images.unsplash.com/photo-1567278526167-6290689c10d4?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwzfHxtY2RvbmFsZHxlbnwwfHx8fDE3NzU3MDU2NDB8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 424w, https://images.unsplash.com/photo-1567278526167-6290689c10d4?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwzfHxtY2RvbmFsZHxlbnwwfHx8fDE3NzU3MDU2NDB8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 848w, https://images.unsplash.com/photo-1567278526167-6290689c10d4?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwzfHxtY2RvbmFsZHxlbnwwfHx8fDE3NzU3MDU2NDB8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 1272w, https://images.unsplash.com/photo-1567278526167-6290689c10d4?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwzfHxtY2RvbmFsZHxlbnwwfHx8fDE3NzU3MDU2NDB8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Photo by <a href="https://unsplash.com/@andeeew">Andreeew Hoang</a> on <a href="https://unsplash.com">Unsplash</a></figcaption></figure></div><p>I love McDonald&#8217;s. I eat there 3-4 times a week&#8212;down from 5 pre-Covid, which is how we&#8217;re all marking time (from &#8220;since the birth of God&#8221; to &#8220;since the Plague&#8221;&#8230;). I couldn&#8217;t do that back in grad school (no money for such extravagances), but now that I have a real job... </p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://underthenull.com/p/emergency-blog-big-arch-review?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://underthenull.com/p/emergency-blog-big-arch-review?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p><p>I&#8217;ve eaten just about everything on the menu locally, but they add things&#8230; If you&#8217;ve seen the awkward vid of the McDonald&#8217;s CEO eating a hamburger, you might&#8217;ve caught that what he&#8217;s promoting is the Big Arch, a new burger. The idea, if you listen to this great segment from the WSJ (free on <a href="https://www.youtube.com/watch?v=rZxnFI2OW9k">YouTube</a>) with the CEO, is to try to capture a slice of the premium burger market. </p><p>It&#8217;s going to work. Now, I know it&#8217;s in keeping with this blog&#8217;s usual thing to do an actual analysis with some math and a little theory, but this time I&#8217;ve got a better, more convincing reason. I tried it tonight, and I have news to report:</p><p><strong>It tastes like the fruit must have tasted in the <a href="https://en.wikipedia.org/wiki/Garden_of_Eden">garden</a>.</strong> </p><p>Dear God.</p><p>Homer sang of the Lotus Eaters, a people who were lulled into a state of perfect apathy where they forgot their homes, their goals, and their loves upon tasting the fruit of the Lotus and desired only to eat it and bask in the bliss it offered for the rest of their days. I now understand why such a life might be desirable.</p><p>In a world where everyone&#8217;s out there making the robots write their CRUD apps, it&#8217;s a breath of fresh air to see true innovation in the wild.</p><p>Let&#8217;s get into specifics:</p><ul><li><p>The patty is truly big. Much larger and thicker than you&#8217;d expect from McDonald&#8217;s. A bit off-brand in this respect, but it&#8217;s so well done. Delectable.</p></li><li><p>They have these little fried onion things for some crunch. It crunches.</p></li><li><p>The sauce is very Big Mac-ish, so if you&#8217;re a fan of that (like me), you&#8217;ll dig it.</p></li><li><p>I was almost full before the fries (I eat in order: first burger, then fries. I&#8217;m not an animal).</p></li></ul><p>This is my true and honest review. Sadly, McDonald&#8217;s did not pay me for this. If they want to send money, I won&#8217;t decline. I am 100% for sale. I want to be clear on that.</p><p>The Big Arch will be my go-to for as long as they have it. Fabulous work, <span class="cashtag-wrap" data-attrs="{&quot;symbol&quot;:&quot;$MCD&quot;}" data-component-name="CashtagToDOM"></span> gang. </p><div><hr></div><p>Thanks for reading!</p><p>Zach</p><p>Connect at: <a href="https://linkedin.com/in/zlflynn">https://linkedin.com/in/zlflynn</a></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://underthenull.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Good Enough Statistics! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p><p></p><p></p><p></p>]]></content:encoded></item><item><title><![CDATA[Rebranding Data Scientist]]></title><description><![CDATA[It involves Magic and Augury. Wait! Hear me out:]]></description><link>https://underthenull.com/p/rebranding-data-scientist</link><guid isPermaLink="false">https://underthenull.com/p/rebranding-data-scientist</guid><dc:creator><![CDATA[Zach Flynn]]></dc:creator><pubDate>Fri, 03 Apr 2026 19:40:41 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!NGKX!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67d29a0a-f837-4459-8b91-cb5ce76b03ee_400x300.gif" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!NGKX!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67d29a0a-f837-4459-8b91-cb5ce76b03ee_400x300.gif" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!NGKX!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67d29a0a-f837-4459-8b91-cb5ce76b03ee_400x300.gif 424w, https://substackcdn.com/image/fetch/$s_!NGKX!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67d29a0a-f837-4459-8b91-cb5ce76b03ee_400x300.gif 848w, https://substackcdn.com/image/fetch/$s_!NGKX!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67d29a0a-f837-4459-8b91-cb5ce76b03ee_400x300.gif 1272w, https://substackcdn.com/image/fetch/$s_!NGKX!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67d29a0a-f837-4459-8b91-cb5ce76b03ee_400x300.gif 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!NGKX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67d29a0a-f837-4459-8b91-cb5ce76b03ee_400x300.gif" width="400" height="300" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/67d29a0a-f837-4459-8b91-cb5ce76b03ee_400x300.gif&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:300,&quot;width&quot;:400,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:576726,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/gif&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://zachflynn.substack.com/i/191876830?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67d29a0a-f837-4459-8b91-cb5ce76b03ee_400x300.gif&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!NGKX!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67d29a0a-f837-4459-8b91-cb5ce76b03ee_400x300.gif 424w, https://substackcdn.com/image/fetch/$s_!NGKX!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67d29a0a-f837-4459-8b91-cb5ce76b03ee_400x300.gif 848w, https://substackcdn.com/image/fetch/$s_!NGKX!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67d29a0a-f837-4459-8b91-cb5ce76b03ee_400x300.gif 1272w, https://substackcdn.com/image/fetch/$s_!NGKX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67d29a0a-f837-4459-8b91-cb5ce76b03ee_400x300.gif 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>We all know that Data Scientist is a silly name. What kind of science doesn&#8217;t use data? Vagueness is the first sin of good science, and we&#8217;re putting it right in the name!</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://underthenull.com/p/rebranding-data-scientist?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://underthenull.com/p/rebranding-data-scientist?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p><p>I&#8217;m proposing a new job title: Table Reader. Now, I know what you&#8217;re thinking. &#8220;Table Reader is reductive. I don&#8217;t just read Tables! I do other things!&#8221; Okay. I&#8217;m sure you do. Really. I believe that is your truth.</p><p>By &#8220;Reader&#8221;, I do not mean a &#8220;Book Reader,&#8221; of course. I mean it in the Mystical sense. You aren&#8217;t &#8220;Analyzing&#8221; (vague and Latinate). You&#8217;re taking a Reading, tracing the palm lines of the Table and considering what the flight paths of birds might have to say (using weather as an instrument). Google Sheets has been missing a spiritual layer.</p><p>Data Scientist doesn&#8217;t say anything about what we actually do. Table Reader evokes.</p><p>A question arises. You consult the Tables for guidance, perform the Rites, Read the signs, and tell folks what the Tables say. </p><p>Each word is a strict improvement. Table is better than Data because it specifies the kind of data we look at. Data covers a lot more than tables, but the job doesn&#8217;t.</p><p>Reader is better than Scientist because it evokes Magic and Mysticism, which is both more inspiring <em>and</em> accurate. I&#8217;m not saying the Art has a <em>lot</em> in common with Divination, but it has more in common with that Practice than Chemistry. </p><p>For example, a computer is a Technology. If we both give it the same instructions, it&#8217;ll do the same thing. My nature and experience don&#8217;t affect the way it operates.</p><p>Magic is different. If the extensive literature on the working of Magic has established anything, it is that the Practice is particular to the individual. For example, Magic can be acquired via being born a wizard (Rowling, J.K. 1997), or you can be gifted powers by a strange lady who spends a lot of time in the woods (Map, Walter c. 1220), or be possessed by the Gods (Pythia, c. 1400BC), or learn to speak the language and meanings of the Nonmen, all but destroyed in the First Apocalypse, when the No-God, Mog-Pharau, rose millennia ago (Bakker, Scott R. 2004)&#8230;. we&#8217;re getting off track.</p><p>The point is that if we give the same Tables to two Table Readers, we&#8217;ll get different answers. It requires experience and intuition to know which signs are real and which are misleading, which models &#8220;make sense&#8221; and which don&#8217;t. So, Table Reading is an individual Art. </p><p>But, you say, &#8220;There is Math involved!&#8221; Sure, the Practice may use aspects of Science or Technology, like Mathematics, but consider: </p><p>If an Augur foretells the future by learning the biology necessary to identify the different parts of an animal&#8217;s entrails and from these gains insights into the length of Caesar&#8217;s reign, do we say he is doing Science? In part. But the Science is only necessary to construct the components of the Magic. The Science serves the Magic. So, clearly, Augury is a Magic.</p><p>In a similar way, the Science serves the Table Reader&#8217;s judgement as he or she divines whether the treatment is good or bad, whether to run this in logs or levels, whether we&#8217;re going to make next quarter&#8217;s targets or not, what kinds of fixed effects to use, and whether there are any plausible excuses to explain this product&#8217;s failure that should not obviously have been foreseen by you or your stakeholders (I kid, I kid).</p><p>So, we need a name that evokes Judgement and Practice, not Science: Table Reader.</p><p>I also considered &#8220;Table Teller&#8221;, but it sounded too authoritative, too crafted. In the good version of our profession, we merely read what the Tables tell <em>us. </em>We don&#8217;t instruct the tables, like the Medium doesn&#8217;t instruct the Spirits. We listen to Them.</p><div><hr></div><p>Thanks for reading!</p><p>Zach</p><p>Connect on LinkedIn: <a href="https://linkedin.com/in/zlflynn">https://linkedin.com/in/zlflynn</a>.</p><p></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://underthenull.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Good Enough Statistics! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p>]]></content:encoded></item><item><title><![CDATA[A workhorse method for measuring censored relationships]]></title><description><![CDATA[Without making distributional assumptions!]]></description><link>https://underthenull.com/p/a-workhorse-method-for-measuring</link><guid isPermaLink="false">https://underthenull.com/p/a-workhorse-method-for-measuring</guid><dc:creator><![CDATA[Zach Flynn]]></dc:creator><pubDate>Fri, 06 Mar 2026 20:45:19 GMT</pubDate><enclosure url="https://images.unsplash.com/photo-1610337673044-720471f83677?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxfHxjZW5zb3JlZHxlbnwwfHx8fDE3NzI4Mjk3NjF8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://images.unsplash.com/photo-1610337673044-720471f83677?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxfHxjZW5zb3JlZHxlbnwwfHx8fDE3NzI4Mjk3NjF8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://images.unsplash.com/photo-1610337673044-720471f83677?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxfHxjZW5zb3JlZHxlbnwwfHx8fDE3NzI4Mjk3NjF8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 424w, https://images.unsplash.com/photo-1610337673044-720471f83677?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxfHxjZW5zb3JlZHxlbnwwfHx8fDE3NzI4Mjk3NjF8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 848w, https://images.unsplash.com/photo-1610337673044-720471f83677?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxfHxjZW5zb3JlZHxlbnwwfHx8fDE3NzI4Mjk3NjF8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 1272w, https://images.unsplash.com/photo-1610337673044-720471f83677?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxfHxjZW5zb3JlZHxlbnwwfHx8fDE3NzI4Mjk3NjF8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 1456w" sizes="100vw"><img src="https://images.unsplash.com/photo-1610337673044-720471f83677?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxfHxjZW5zb3JlZHxlbnwwfHx8fDE3NzI4Mjk3NjF8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080" width="4568" height="3434" data-attrs="{&quot;src&quot;:&quot;https://images.unsplash.com/photo-1610337673044-720471f83677?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxfHxjZW5zb3JlZHxlbnwwfHx8fDE3NzI4Mjk3NjF8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:3434,&quot;width&quot;:4568,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;purple and yellow abstract painting&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="purple and yellow abstract painting" title="purple and yellow abstract painting" srcset="https://images.unsplash.com/photo-1610337673044-720471f83677?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxfHxjZW5zb3JlZHxlbnwwfHx8fDE3NzI4Mjk3NjF8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 424w, https://images.unsplash.com/photo-1610337673044-720471f83677?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxfHxjZW5zb3JlZHxlbnwwfHx8fDE3NzI4Mjk3NjF8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 848w, https://images.unsplash.com/photo-1610337673044-720471f83677?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxfHxjZW5zb3JlZHxlbnwwfHx8fDE3NzI4Mjk3NjF8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 1272w, https://images.unsplash.com/photo-1610337673044-720471f83677?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxfHxjZW5zb3JlZHxlbnwwfHx8fDE3NzI4Mjk3NjF8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Photo by <a href="https://unsplash.com/@lazycreekimages">Michael Dziedzic</a> on <a href="https://unsplash.com">Unsplash</a></figcaption></figure></div><p>We&#8217;re going to talk mainly about the general problem of understanding censored relationships, but specifics make generality easier to grok&#8230; </p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://underthenull.com/p/a-workhorse-method-for-measuring?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://underthenull.com/p/a-workhorse-method-for-measuring?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p><p>Suppose we want to understand how the time until a Free/Basic Plan customer signs up for the Premium/Ultra/Mega Package varies with different actions or incentives the customer takes or receives. For customers that do eventually sign up for Premium, we observe the time it took them to do so from when they first signed up for the Free Plan. <em>But </em>for customers that <em>haven&#8217;t</em> signed up for Premium, the only thing we know about their Time to Premium is that it is greater than however long it&#8217;s been so far, i.e. we only have a lower bound on their Time to Premium. We&#8217;re missing data.</p><p>Most of causal inference is about making assumptions to fill in missing data. We don&#8217;t know what so-and-so would have done if they hadn&#8217;t been treated, so we find people who weren&#8217;t treated and say they&#8217;re kind of like so-and-so and fill in the treated subject&#8217;s missing outcome with theirs. In censored problems, like this one, we come up with an assumption about what the censored data would look like.</p><p>The classical methods <a href="https://zachflynn.substack.com/p/central-limit-theorems-and-the-deeper-naivete-2">(recall that &#8220;classical&#8221; is math-speak for &#8220;lame&#8221;</a>) use parametric assumptions&#8212;impose a functional form on the censored variable&#8217;s distribution&#8212;to make the censored variable informative about the full distribution.</p><p>The classical example looks like this:</p><div class="latex-rendered" data-attrs="{&quot;persistentExpression&quot;:&quot;y = x^{\\top}b+ e, \\quad e \\sim N(0, s^{2})&quot;,&quot;id&quot;:&quot;HFJOUBXNXO&quot;}" data-component-name="LatexBlockToDOM"></div><p>Where we only observe <em>y* = max{y, 0} </em>and <em>y</em> is unobserved<em>. b </em>and <em>s </em>are the parameters to estimate.</p><p>The parametric assumption, that <em>y</em> is normally distributed, allows the uncensored data to be informative about the distribution of the censored data because we know:</p><div class="latex-rendered" data-attrs="{&quot;persistentExpression&quot;:&quot;y* | x \\sim \\text{truncated normal}(x^{\\top} b, s^{2}, 0, \\infty)&quot;,&quot;id&quot;:&quot;HWJFTVBIMD&quot;}" data-component-name="LatexBlockToDOM"></div><p>And we can identify the parameters of this distribution just from data on (y*, x). The normality of e allows us to connect the error from the uncensored data to what the error would be on the censored data. But this is a very strong assumption and we&#8217;re essentially letting functional form tell us about the extent of the censoring problem. Not very satisfying!</p><p>What is the most we can identify without this kind of functional form assumption?</p><p>What can we learn about how the distribution of a latent, censored variable changes with a covariate without making distributional assumptions about what we can&#8217;t see?</p><p>Fundamentally, the question of how the distribution of <em>y</em> changes with <em>x</em> is a question about how quantiles change. So, write:</p><div class="latex-rendered" data-attrs="{&quot;persistentExpression&quot;:&quot;y = f_{t}\\left(x\\right) + e_{t} \\quad \\forall t \\in \\left(0,1\\right), \\quad \\text{pr}\\left(e_{t} \\le 0 | x\\right) = t&quot;,&quot;id&quot;:&quot;ZRZGWOIASX&quot;}" data-component-name="LatexBlockToDOM"></div><p><em>f</em> is the conditional quantile of <em>y</em> given <em>x</em>.</p><p>Let <em>v</em> be a uniform random variable drawn on (0,1). Then, here&#8217;s a random variable that has the same distribution as <em>y</em> given <em>x = x</em>: </p><div class="latex-rendered" data-attrs="{&quot;persistentExpression&quot;:&quot;f_{v}(x)&quot;,&quot;id&quot;:&quot;RMFGERPXCL&quot;}" data-component-name="LatexBlockToDOM"></div><p>So, if we can identify this quantile function, we&#8217;ll know a lot about how <em>x</em> affects <em>y</em>.</p><p>The problem is that we don&#8217;t observe y, so we can&#8217;t just estimate the model using our favorite quantile regression method.</p><p>Instead, we observe <em>y*</em> = max{<em>y</em>, 0}. </p><p>What we&#8217;re going to do is show that for a certain set of (x,t) we <em>can</em> identify f(t,x). Maybe that set is good enough that we don&#8217;t need to make any other assumptions. We can answer whatever question we&#8217;re asking the data just from identified points of the quantile function. If we need more, then we can extrapolate, i.e. make the dirty parametric assumptions, but we can do so, starting from points that are identified <em>without</em> having to make such compromises.</p><p>Whenever I&#8217;m thinking about how to identify something, I start with the distribution function. The reason to start there is that it fully characterizes the information available in the data. So it gives you the most identifying power to play with. </p><p>The data we have available to us is (y*, x). So let&#8217;s do a little algebra and see what y* given x tells us.</p><div class="latex-rendered" data-attrs="{&quot;persistentExpression&quot;:&quot;\\text{pr}\\left[y^{\\star} \\le u | x \\right] = \\text{pr}\\left[\\max\\left\\{f_{t}\\left(x\\right) + e_{t}, 0\\right\\} \\le u | x \\right]&quot;,&quot;id&quot;:&quot;YXFCXRMSWT&quot;}" data-component-name="LatexBlockToDOM"></div><div class="latex-rendered" data-attrs="{&quot;persistentExpression&quot;:&quot;= \\text{pr}\\left[f_{t}\\left(x\\right) + e_{t} \\le u | x, f_{t}\\left(x\\right) + e_{t} \\ge 0\\right] \\text{pr}\\left[f_{t}\\left(x\\right) + e_{t} \\ge 0\\right]  &quot;,&quot;id&quot;:&quot;IMUPWEQJPY&quot;}" data-component-name="LatexBlockToDOM"></div><div class="latex-rendered" data-attrs="{&quot;persistentExpression&quot;:&quot;+ 1\\left(0 \\le u\\right)\\left(1 - \\text{pr}\\left[f_{t}\\left(x\\right) + e_{t} \\ge 0 | x\\right]\\right)&quot;,&quot;id&quot;:&quot;HHYCPWCJMP&quot;}" data-component-name="LatexBlockToDOM"></div><p>Let p(x) = pr[f(x,t) + e(t) &#8805; 0 | x] be the probability of <em>not</em> being censored, conditional on <em>x</em>. The nice thing here is that we can estimate this function from the data because we know whether each observation is censored.</p><p>Let C be the event of an observation being censored. Then we can write the above as.</p><div class="latex-rendered" data-attrs="{&quot;persistentExpression&quot;:&quot;pr\\left[y^{\\star} \\le u | x\\right] = pr\\left[f_{t}\\left(x\\right) + e_{t} \\le u |x, \\neg C\\right] p(X) + 1(0 &#8804; u) (1&#8202;&#8212;&#8202;p(x))&quot;,&quot;id&quot;:&quot;MNHYNIZJPK&quot;}" data-component-name="LatexBlockToDOM"></div><p>At all points on y*&#8217;s support, u is nonnegative because y* is nonnegative, so:</p><div class="latex-rendered" data-attrs="{&quot;persistentExpression&quot;:&quot;pr\\left[y^{\\star} \\le u |x\\right] = pr\\left[f_{t}\\left(x\\right) + e_{t} \\le u |x, \\neg C\\right] p(x) + (1&#8202;&#8212;&#8202;p(x))&quot;,&quot;id&quot;:&quot;CPSLHMFTLY&quot;}" data-component-name="LatexBlockToDOM"></div><p>Let&#8217;s substitute in the true quantile function of <em>y</em> for <em>u</em> here:</p><div class="latex-rendered" data-attrs="{&quot;persistentExpression&quot;:&quot;\\text{pr}\\left[y^{\\star} \\le f_{t}\\left(x\\right) | x\\right] = \\text{pr}\\left[y \\le f_{t}\\left(x\\right) | x, \\neg C\\right] p\\left(x\\right) + \\left(1 - p(x)\\right)&quot;,&quot;id&quot;:&quot;MPZCUYEHXG&quot;}" data-component-name="LatexBlockToDOM"></div><p>Because f is the conditional quantile function, we know:</p><div class="latex-rendered" data-attrs="{&quot;persistentExpression&quot;:&quot;t = pr[y \\le f_{t}(x) |x] = pr[y \\le f_{t}(x)|x, \\neg C] p(x) + pr[y \\le f_{t}(x)|x, C] (1-p(x))&quot;,&quot;id&quot;:&quot;MGPPLNJMDN&quot;}" data-component-name="LatexBlockToDOM"></div><div class="latex-rendered" data-attrs="{&quot;persistentExpression&quot;:&quot;t&#8202;&#8212;&#8202;pr[y \\le f_{t}(x)|x, C] (1-p(x)) = pr[y &#8804; f_{t}(x)|x, \\neg C] p(x)&quot;,&quot;id&quot;:&quot;EPFSMRYUXX&quot;}" data-component-name="LatexBlockToDOM"></div><p>So substitute for that term in the conditional CDF of y* expression:</p><div class="latex-rendered" data-attrs="{&quot;persistentExpression&quot;:&quot;pr[y^{\\star} \\le f_{t}(x) |x] = t&#8202;&#8212;&#8202;pr[y \\le f_{t}(x) | x, C] (1-p(x)) + (1-p(x)) &quot;,&quot;id&quot;:&quot;GUWPFQWZDK&quot;}" data-component-name="LatexBlockToDOM"></div><div class="latex-rendered" data-attrs="{&quot;persistentExpression&quot;:&quot;= t + (1&#8202;&#8212;&#8202;pr[y \\le f_{t}(x) | x, C]) (1-p(x))&quot;,&quot;id&quot;:&quot;NWHRPCQNFA&quot;}" data-component-name="LatexBlockToDOM"></div><p>Now, we&#8217;re cooking. We&#8217;ve got the true quantile that we want (<em>t)</em> plus a bias term introduced by the censoring. It turns out that we can actually identify the set of (x,t) where the bias term is 0.</p><p>Suppose that for a certain (x,t): p(x) = 1 - t + c where c &gt; 0.</p><div class="latex-rendered" data-attrs="{&quot;persistentExpression&quot;:&quot;p(x) = \\text{pr}\\left[ f_{t}\\left(x\\right) + e_{t} \\ge 0|x\\right] = 1 - \\text{pr}\\left[e_{t} \\le -f_{t}\\left(x\\right)|x\\right] = 1 - t + c&quot;,&quot;id&quot;:&quot;BORUTWXLNR&quot;}" data-component-name="LatexBlockToDOM"></div><p>Because:</p><div class="latex-rendered" data-attrs="{&quot;persistentExpression&quot;:&quot;1 - \\text{pr}\\left[e_{t}\\le 0 |x\\right] = 1 - t&quot;,&quot;id&quot;:&quot;YHJQILYCUA&quot;}" data-component-name="LatexBlockToDOM"></div><p>We must have that <em>f(t,x)</em> <em>&gt; 0</em> because <em>c &gt; 0</em>.</p><p>If the data is censored, then y &lt; 0. Because f(t,x) &gt; 0, the probability of y being less than f(t,x) <em>given</em> that y is censored is 100%. So:</p><div class="latex-rendered" data-attrs="{&quot;persistentExpression&quot;:&quot;pr[y^{\\star} \\le u |x] = t + (1&#8202;&#8212;&#8202;pr[y \\le f_{t}(x) | x, C]) (1-p(x)) = t + \\left(1 - 1\\right)\\left(1 - p(x)\\right)&quot;,&quot;id&quot;:&quot;IMBXLCXZRG&quot;}" data-component-name="LatexBlockToDOM"></div><div class="latex-rendered" data-attrs="{&quot;persistentExpression&quot;:&quot;= t&quot;,&quot;id&quot;:&quot;TEEIZVRFVH&quot;}" data-component-name="LatexBlockToDOM"></div><p>So, for any (x,t) with sufficient probability of not being censored, we can identify the conditional quantile of <em>y</em> given <em>x</em> just from the conditional quantile of <em>y*</em> given <em>x</em>.</p><p>Cool. What does that buy us? This tells us the set of quantiles and covariate variables for which we do not face a real censoring problem and can identify the quantile function directly from data on (y*, x). </p><p>Unfortunately, this will usually not be enough. We&#8217;ll need to know how the quantile function responds at other (x,t) besides the ones that aren&#8217;t identified.</p><p>My preferred method for doing this is to do one of the following, depending on what you need: simply parameterize f(x,t; r) with a vector of parameters <em>r</em>. This form of parametric assumption is more natural and easier to motivate than assumptions about the functional forms of residual densities because you&#8217;re choosing how a response function varies as the quantile increases and as covariates change, and the shape is strongly informed by the actually-identified points instead of being a functional form assumption without strong justification, i.e. in a simplified example: suppose you had the following point-identified points and one non-identified point:</p><div class="latex-rendered" data-attrs="{&quot;persistentExpression&quot;:&quot;\\begin{array}{cc}\n x &amp; f_{0.5}(x)\\\\\n2 &amp; 3.0\\\\\n4 &amp; ? \\\\\n6 &amp; 4.9 \\\\\n8 &amp; 6.2\n\\end{array}&quot;,&quot;id&quot;:&quot;DHHLFRNZTL&quot;}" data-component-name="LatexBlockToDOM"></div><p>It seems sort of reasonable to think it&#8217;s roughly linear with x in this example so that x=4 should have a median around 4. The point is that you can use the nonparametrically-identified shapes to inform what parametric restrictions you put on the problem to identify the rest.</p><p>Anyway, this is just a tool that I think is less well-known than it deserves to be. So, I&#8217;m sharing it. Enjoy!</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://underthenull.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Good Enough Statistics! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><div><hr></div><p>Thanks for reading!</p><p>Zach</p><p>Connect at: <a href="https://linkedin.com/in/zlflynn">https://linkedin.com/in/zlflynn</a></p><p></p><p></p><p></p>]]></content:encoded></item><item><title><![CDATA[Statistics and Compute]]></title><description><![CDATA[The key question for whether LLM capability plateaus]]></description><link>https://underthenull.com/p/statistics-and-compute</link><guid isPermaLink="false">https://underthenull.com/p/statistics-and-compute</guid><dc:creator><![CDATA[Zach Flynn]]></dc:creator><pubDate>Mon, 23 Feb 2026 02:01:45 GMT</pubDate><enclosure url="https://images.unsplash.com/photo-1693921289604-aa37858636e6?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw2fHxjb21wdXRlciUyMG9sZHxlbnwwfHx8fDE3NzE3OTAyOTl8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://images.unsplash.com/photo-1693921289604-aa37858636e6?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw2fHxjb21wdXRlciUyMG9sZHxlbnwwfHx8fDE3NzE3OTAyOTl8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://images.unsplash.com/photo-1693921289604-aa37858636e6?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw2fHxjb21wdXRlciUyMG9sZHxlbnwwfHx8fDE3NzE3OTAyOTl8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 424w, https://images.unsplash.com/photo-1693921289604-aa37858636e6?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw2fHxjb21wdXRlciUyMG9sZHxlbnwwfHx8fDE3NzE3OTAyOTl8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 848w, https://images.unsplash.com/photo-1693921289604-aa37858636e6?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw2fHxjb21wdXRlciUyMG9sZHxlbnwwfHx8fDE3NzE3OTAyOTl8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 1272w, https://images.unsplash.com/photo-1693921289604-aa37858636e6?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw2fHxjb21wdXRlciUyMG9sZHxlbnwwfHx8fDE3NzE3OTAyOTl8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 1456w" sizes="100vw"><img src="https://images.unsplash.com/photo-1693921289604-aa37858636e6?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw2fHxjb21wdXRlciUyMG9sZHxlbnwwfHx8fDE3NzE3OTAyOTl8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080" width="5855" height="3896" data-attrs="{&quot;src&quot;:&quot;https://images.unsplash.com/photo-1693921289604-aa37858636e6?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw2fHxjb21wdXRlciUyMG9sZHxlbnwwfHx8fDE3NzE3OTAyOTl8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:3896,&quot;width&quot;:5855,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;an old computer sitting on the floor next to a wall&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="an old computer sitting on the floor next to a wall" title="an old computer sitting on the floor next to a wall" srcset="https://images.unsplash.com/photo-1693921289604-aa37858636e6?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw2fHxjb21wdXRlciUyMG9sZHxlbnwwfHx8fDE3NzE3OTAyOTl8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 424w, https://images.unsplash.com/photo-1693921289604-aa37858636e6?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw2fHxjb21wdXRlciUyMG9sZHxlbnwwfHx8fDE3NzE3OTAyOTl8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 848w, https://images.unsplash.com/photo-1693921289604-aa37858636e6?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw2fHxjb21wdXRlciUyMG9sZHxlbnwwfHx8fDE3NzE3OTAyOTl8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 1272w, https://images.unsplash.com/photo-1693921289604-aa37858636e6?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw2fHxjb21wdXRlciUyMG9sZHxlbnwwfHx8fDE3NzE3OTAyOTl8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Photo by <a href="https://unsplash.com/@mattgyver">Matt Benson</a> on <a href="https://unsplash.com">Unsplash</a></figcaption></figure></div><p>Look. The first thing I&#8217;m going to do is hook you. I&#8217;m going to tell you this is about AI and LLMs. You have to believe me that we&#8217;ll get there. If, along the way, this starts to look like it&#8217;s about time series regressions (&#8220;boring shit&#8221;), just trust me. Believe me. Keep the faith.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://underthenull.com/p/statistics-and-compute?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://underthenull.com/p/statistics-and-compute?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p><h2>Computation and Statistics</h2><p>Suppose we have a time-series regression (remember: trust me) where we don&#8217;t know the lag structure.</p><div class="latex-rendered" data-attrs="{&quot;persistentExpression&quot;:&quot;y_{t} = a + \\sum_{p=1}^{\\infty} r_{p} y_{t-p} + e_{t}&quot;,&quot;id&quot;:&quot;BIQNSNKSOU&quot;}" data-component-name="LatexBlockToDOM"></div><p>We find the &#8220;best&#8221; model for the time series in terms of out-of-sample prediction error by using the following computational procedure:</p><ol><li><p>Fix an L, require that <em>p</em> cannot be greater than <em>L</em>, i.e. for every <em>p</em> greater than <em>L</em>, <em>r<sub>p</sub> = 0.</em></p></li><li><p>For each of the 2<sup>L</sup> candidate models, compute the cross-validation score by leaving out future data and evaluating how well the model predicts it.</p></li></ol><p>The reason we fix an L is that 2<sup>L</sup> gets awfully large awfully fast. Computationally, we just can&#8217;t evaluate that many models. L models our computational constraint. We have two possible scenarios:</p><ol><li><p>The optimal model selected via this criterion has max{p} = L.</p></li><li><p>The optimal model selected via this criterion has max{p} &lt; L.</p></li></ol><p>In scenario 1, we are <em>computationally constrained</em>. If we could increase L and make our model more flexible, our predictions would improve. We just need to call up NVIDIA and get more, better chips.</p><p>In scenario 2, we are <em>statistically constrained</em>. The problem isn&#8217;t that we don&#8217;t have enough computational power. The problem is that, given the data available to us, the best models we can construct are less flexible. We need more data before we can improve the model. NVIDIA can&#8217;t help us. If we spend billions of dollars on compute, the return on it will be zip, zilch, nada.</p><h2>LLMs</h2><p>The key question of how much core AI capability will improve over the next few years is whether we are computationally or statistically constrained. </p><p>Until now, LLMs have been primarily computationally constrained. When we got better chips, when folks spent more on compute, the result was better models. But I think anyone who&#8217;s used the tech over the past few years has noticed the core technology leveling off.</p><p>The difference between GPT 3.5 and 4.0 was <em>enormous</em>. I recall asking 3.5 to explain statistical significance in a stakeholder-friendly way, and it responded with gibberish that was so bad it didn&#8217;t even rise to the level of being wrong&#8212;and to a simple, textbook question! 4.0 was so much better that it boggled the mind. But 5.x&#8230; It&#8217;s fine. I&#8217;m sure it&#8217;s better, but I hardly notice.</p><p>I have no inside info, but it does make me wonder whether we aren&#8217;t moving into the statistically constrained regime&#8212;or, at least, will be in the next couple of cycles. And if we are&#8230; it&#8217;ll be very difficult to improve the core model. Throwing more parameters and more compute into the mix won&#8217;t change the mathematics.</p><p>Unlike other technologies, the returns to more data are not increasing. They decrease <em>rapidly</em>. <a href="https://projecteuclid.org/journals/annals-of-statistics/volume-10/issue-4/Optimal-Global-Rates-of-Convergence-for-Nonparametric-Regression/10.1214/aos/1176345969.full">You need exponential increases in data to generate </a><em><a href="https://projecteuclid.org/journals/annals-of-statistics/volume-10/issue-4/Optimal-Global-Rates-of-Convergence-for-Nonparametric-Regression/10.1214/aos/1176345969.full">sublinear</a></em><a href="https://projecteuclid.org/journals/annals-of-statistics/volume-10/issue-4/Optimal-Global-Rates-of-Convergence-for-Nonparametric-Regression/10.1214/aos/1176345969.full"> improvements in performance.</a></p><p>I think we&#8217;ll run into the statistical constraint sooner than the market&#8217;s priced in. Word prediction is a hard game. The difference between the right word and the wrong word is a big thing.</p><blockquote><p>The difference between the <em>almost right</em> word and the <em>right</em> word is really a large matter&#8212;'tis the difference between the lightning-bug and the lightning.</p><p><em>Mark Twain</em></p></blockquote><p>In math, the loss function is steep. Small errors are big errors. A steep loss function, combined with a very high dimensional, nonsmooth problem, implies we&#8217;ll need a lot of data. We&#8217;ll have to get it from somewhere.</p><p>I think I can see how it happens.</p><h2>Skills</h2><p>We <em>can&#8217;t</em> generate vast sums of additional, real data. The AI companies are already using as much as is plausibly available. So, we need to make <em>better</em> data, not just more. Structured data. We have to add single observations that are worth billions of unstructured rows. We need to generate data for LLMs rather than rely on data originally generated for other purposes.</p><p>This is where folks are going with &#8220;skills&#8221; and related ideas. Provide tight context in a structured format to give LLMs data that is worth a vast amount of unintentional data.</p><p>Going back to our time series example. Suppose we knew that there was a seasonal component that hit every four time units. So all the models that can&#8217;t capture that structure are right out. This tells us information that might take a long time series history to discover from the data alone.</p><p>In other words, <strong>skills are parameter restrictions.</strong> If the restrictions are true, they dramatically improve model performance. </p><p>In five years, I think the vast improvement in perceived LLM performance will come from these kinds of purpose-built skills, not from core model performance. The core model will soon run into statistical constraints, if it isn&#8217;t there already, but there will be skills that help it write better code, better emails, etc, by applying rules and logic that humans already know in a structured way.</p><p>Like in classical statistics, the way to learn more from a fixed data set is to make more credible assumptions about the data-generating process. Give the problem structure by applying what you know about how the world works, and stop requiring the data to learn everything.</p><p>The trick is to tell the data what to think when you know what it ought to think and to let it tell you what to think when you don&#8217;t. </p><p>Anyway, I think that&#8217;s why it&#8217;s going where it&#8217;s going.</p><p>Fewer chips, more context.</p><div><hr></div><p>Thanks for reading!</p><p>Zach</p><p>Connect at: <a href="https://linkedin.com/in/zlflynn">https://linkedin.com/in/zlflynn</a></p><p>Look at my website: <a href="https://zflynn.com">https://zflynn.com</a></p><p></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://underthenull.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Good Enough Statistics! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p><p></p>]]></content:encoded></item><item><title><![CDATA[A model for where I live]]></title><description><![CDATA[A forecasting model for Illinois' Unemployment Rate and local concerns]]></description><link>https://underthenull.com/p/a-model-for-where-i-live</link><guid isPermaLink="false">https://underthenull.com/p/a-model-for-where-i-live</guid><dc:creator><![CDATA[Zach Flynn]]></dc:creator><pubDate>Sun, 15 Feb 2026 20:47:10 GMT</pubDate><enclosure url="https://images.unsplash.com/photo-1581373449483-37449f962b6c?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw1fHxjaGljYWdvJTIwc2t5bGluZXxlbnwwfHx8fDE3NzExODc5NjB8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://images.unsplash.com/photo-1581373449483-37449f962b6c?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw1fHxjaGljYWdvJTIwc2t5bGluZXxlbnwwfHx8fDE3NzExODc5NjB8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://images.unsplash.com/photo-1581373449483-37449f962b6c?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw1fHxjaGljYWdvJTIwc2t5bGluZXxlbnwwfHx8fDE3NzExODc5NjB8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 424w, https://images.unsplash.com/photo-1581373449483-37449f962b6c?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw1fHxjaGljYWdvJTIwc2t5bGluZXxlbnwwfHx8fDE3NzExODc5NjB8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 848w, https://images.unsplash.com/photo-1581373449483-37449f962b6c?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw1fHxjaGljYWdvJTIwc2t5bGluZXxlbnwwfHx8fDE3NzExODc5NjB8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 1272w, https://images.unsplash.com/photo-1581373449483-37449f962b6c?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw1fHxjaGljYWdvJTIwc2t5bGluZXxlbnwwfHx8fDE3NzExODc5NjB8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 1456w" sizes="100vw"><img src="https://images.unsplash.com/photo-1581373449483-37449f962b6c?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw1fHxjaGljYWdvJTIwc2t5bGluZXxlbnwwfHx8fDE3NzExODc5NjB8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080" width="4896" height="3268" data-attrs="{&quot;src&quot;:&quot;https://images.unsplash.com/photo-1581373449483-37449f962b6c?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw1fHxjaGljYWdvJTIwc2t5bGluZXxlbnwwfHx8fDE3NzExODc5NjB8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:3268,&quot;width&quot;:4896,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;city skyline during night time&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="city skyline during night time" title="city skyline during night time" srcset="https://images.unsplash.com/photo-1581373449483-37449f962b6c?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw1fHxjaGljYWdvJTIwc2t5bGluZXxlbnwwfHx8fDE3NzExODc5NjB8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 424w, https://images.unsplash.com/photo-1581373449483-37449f962b6c?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw1fHxjaGljYWdvJTIwc2t5bGluZXxlbnwwfHx8fDE3NzExODc5NjB8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 848w, https://images.unsplash.com/photo-1581373449483-37449f962b6c?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw1fHxjaGljYWdvJTIwc2t5bGluZXxlbnwwfHx8fDE3NzExODc5NjB8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 1272w, https://images.unsplash.com/photo-1581373449483-37449f962b6c?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw1fHxjaGljYWdvJTIwc2t5bGluZXxlbnwwfHx8fDE3NzExODc5NjB8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Photo by <a href="https://unsplash.com/@maxwbender">Max Bender</a> on <a href="https://unsplash.com">Unsplash</a></figcaption></figure></div><p>I live in Lake County, Illinois, just north of Chicago. That fact hasn&#8217;t mattered for the past six years &#8212; except at tax time and whenever I look at that <em>obscene </em>property tax bill (<em>obscene </em>in the old sense: indecent, an offense to good morals, perverse). </p><p>I&#8217;ve worked either remotely or from home since moving here a month before COVID. I&#8217;m not from here, and my daily wanderings to Walgreens, Target, and the occasional restaurant (McDonald&#8217;s) do not exactly immerse me in the local culture. </p><p>None of the work I do &#8220;contributes&#8221; to the local economy. I&#8217;m pretty sure I&#8217;ve single-handedly put the Dominos guy&#8217;s kid through college, but that&#8217;s via my consumption, not my labor. </p><p>I&#8217;ve never worked for a company with a local focus. Why would you hire a data scientist if 1-5% revenue increases wouldn&#8217;t justify the salary? You can&#8217;t make a product <em>good enough</em> via data science. You can only make it better once it&#8217;s good enough. You&#8217;ve got to see some action&#8230;</p><p>All of which is to say, I have very little connection to where I live&#8212;and this is the place I&#8217;ve lived the longest since leaving home! Six years! I don&#8217;t keep up with local politics or have opinions on the Parks District race. But I want to! I like living here. It&#8217;s lovely for one thing, and there are rabbits that follow me around whenever I go outside (because I give them food).</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Ui4l!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6f1bd97b-fbed-47ab-a5d2-c99b30248836_545x615.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Ui4l!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6f1bd97b-fbed-47ab-a5d2-c99b30248836_545x615.jpeg 424w, https://substackcdn.com/image/fetch/$s_!Ui4l!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6f1bd97b-fbed-47ab-a5d2-c99b30248836_545x615.jpeg 848w, https://substackcdn.com/image/fetch/$s_!Ui4l!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6f1bd97b-fbed-47ab-a5d2-c99b30248836_545x615.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!Ui4l!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6f1bd97b-fbed-47ab-a5d2-c99b30248836_545x615.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Ui4l!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6f1bd97b-fbed-47ab-a5d2-c99b30248836_545x615.jpeg" width="545" height="615" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6f1bd97b-fbed-47ab-a5d2-c99b30248836_545x615.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:615,&quot;width&quot;:545,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:317913,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://zachflynn.substack.com/i/187979023?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6f1bd97b-fbed-47ab-a5d2-c99b30248836_545x615.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Ui4l!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6f1bd97b-fbed-47ab-a5d2-c99b30248836_545x615.jpeg 424w, https://substackcdn.com/image/fetch/$s_!Ui4l!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6f1bd97b-fbed-47ab-a5d2-c99b30248836_545x615.jpeg 848w, https://substackcdn.com/image/fetch/$s_!Ui4l!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6f1bd97b-fbed-47ab-a5d2-c99b30248836_545x615.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!Ui4l!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6f1bd97b-fbed-47ab-a5d2-c99b30248836_545x615.jpeg 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Helping me make a stone path through the backyard. Not begging for food.</figcaption></figure></div><p>A subspecies of science fiction talks about this. Disconnection from the physical. Folks augment themselves with machines, becoming human-shaped <a href="https://en.wikipedia.org/wiki/Ship_of_Theseus">Ships of Theseus</a>, severing the self from the body and the physical environment. The protagonist does this to himself in search of security, riches, respect, or meaning, but it causes problems. The writers solve these problems in different ways, but part of the solution typically involves an attractive woman with a katana, some unresolved issue with her dead father, and an alternative aesthetic. She reminds him of what it means to be human. That there&#8217;s some flesh you don&#8217;t want to part with even for cybernetic glory&#8230;</p><p>Okay, I&#8217;m stretching the analogy. What I&#8217;m trying to say is that I think it&#8217;d be good if where I lived affected what I do in some small way. So, I think I&#8217;ve got a solution...</p><p>Forecasting models.</p><p>Hear me out:</p><p>Respectable people forecast the national accounts, unemployment rates, inflation rates, etc. They put vast sums of money on the line, betting on how those series will move. We pay less attention to local forecasts, which, as far as I can tell, are primarily generated by a city or state paying some consulting company to do it.</p><p>The kind of person who would execute a weekend project to forecast local economic conditions, without hope of financial reward, clearly could not be called rootless. No, he would have to be very attached. A pillar of the community, even. You see my plan.</p><p>So, I started this project that I&#8217;m calling <a href="https://zflynn.com/zilcast">ZILCAST</a>, Zach&#8217;s Illinois Forecasts, to forecast various things of local concern to Illinois and the Chicago area. I started with the Illinois Unemployment Rate because it&#8217;s an easy series to understand and build my model on, but the goal is to expand this to local series that are a bit off the beaten path.</p><p>The mathematical idea is to create solid local forecasts using a kernel-weighting strategy that borrows data from similar locales, reducing forecasting error from otherwise noisy series. It also uses (frequentist) model averaging to average over different model types, lag structures, and bandwidth selection strategies.</p><p>I&#8217;ll write up more about the statistical method at some point, but I put it all together technically over the last few weekends. You can watch my forecasts evolve, fail, and succeed here: <a href="https://zflynn.com/zilcast">https://zflynn.com/zilcast</a>. The forecasts and actuals for the Illinois Unemployment Rate will update as the BLS posts more data.</p><p>The tech stack is simple but fun. I wrote the whole workflow from fetching the data to running the fancy regressions in R, which I think has been devalued far too quickly in tech-land, but that&#8217;s another post. I run the actual forecasting on AWS because it&#8217;s fairly computationally-intensive, but the whole thing is &#8220;orchestrated&#8221; via cron jobs running on my laptop. I archive the results on this tiny Postgres box I use for all my side projects.</p><p>Here&#8217;s the current median forecast for 2026 (the latest available data is December 2025; it should update soon with January 2026 actuals).</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!HUmB!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5dfbbef4-2a7e-43e5-af3d-c7bf7af879e8_1024x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!HUmB!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5dfbbef4-2a7e-43e5-af3d-c7bf7af879e8_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!HUmB!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5dfbbef4-2a7e-43e5-af3d-c7bf7af879e8_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!HUmB!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5dfbbef4-2a7e-43e5-af3d-c7bf7af879e8_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!HUmB!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5dfbbef4-2a7e-43e5-af3d-c7bf7af879e8_1024x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!HUmB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5dfbbef4-2a7e-43e5-af3d-c7bf7af879e8_1024x1024.png" width="1024" height="1024" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5dfbbef4-2a7e-43e5-af3d-c7bf7af879e8_1024x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1024,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:46697,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://zachflynn.substack.com/i/187979023?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5dfbbef4-2a7e-43e5-af3d-c7bf7af879e8_1024x1024.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!HUmB!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5dfbbef4-2a7e-43e5-af3d-c7bf7af879e8_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!HUmB!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5dfbbef4-2a7e-43e5-af3d-c7bf7af879e8_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!HUmB!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5dfbbef4-2a7e-43e5-af3d-c7bf7af879e8_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!HUmB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5dfbbef4-2a7e-43e5-af3d-c7bf7af879e8_1024x1024.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>It would have absolutely crushed in 2025, except at the end. You should always be skeptical of backtests, but the forecast below is from data up to December 2024. The gap in the series is because the BLS didn&#8217;t produce the data for October 2025 because of the budget &#8220;issue&#8221;.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!XhQs!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F15ed47dd-050a-4f7f-94cf-b36856b35efe_1024x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!XhQs!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F15ed47dd-050a-4f7f-94cf-b36856b35efe_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!XhQs!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F15ed47dd-050a-4f7f-94cf-b36856b35efe_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!XhQs!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F15ed47dd-050a-4f7f-94cf-b36856b35efe_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!XhQs!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F15ed47dd-050a-4f7f-94cf-b36856b35efe_1024x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!XhQs!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F15ed47dd-050a-4f7f-94cf-b36856b35efe_1024x1024.png" width="1024" height="1024" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/15ed47dd-050a-4f7f-94cf-b36856b35efe_1024x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1024,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:52131,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://zachflynn.substack.com/i/187979023?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F15ed47dd-050a-4f7f-94cf-b36856b35efe_1024x1024.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!XhQs!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F15ed47dd-050a-4f7f-94cf-b36856b35efe_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!XhQs!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F15ed47dd-050a-4f7f-94cf-b36856b35efe_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!XhQs!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F15ed47dd-050a-4f7f-94cf-b36856b35efe_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!XhQs!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F15ed47dd-050a-4f7f-94cf-b36856b35efe_1024x1024.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Anyway, I hope my little attempt to connect to where I live via fancy regressions is useful to at least a few people! Check it out at <a href="https://zflynn.com/zilcast">https://zflynn.com/zilcast</a>. </p><div><hr></div><p>Thanks for reading!</p><p>Zach</p><p>I&#8217;m on LinkedIn at: <a href="https://linkedin.com/in/zlflynn">https://linkedin.com/in/zlflynn</a></p><p>And I have a normal, personal website at: <a href="https://zflynn.com">https://zflynn.com</a></p><div><hr></div><p>PS. If you&#8217;re a local government that&#8217;d like a forecast like this for planning, etc, feel free to reach out. I&#8217;m looking at what would be most useful to add to the site.</p><p></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://underthenull.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Good Enough Statistics! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Price Testing]]></title><description><![CDATA[More information is better than less.]]></description><link>https://underthenull.com/p/price-testing</link><guid isPermaLink="false">https://underthenull.com/p/price-testing</guid><dc:creator><![CDATA[Zach Flynn]]></dc:creator><pubDate>Fri, 06 Feb 2026 08:50:50 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/bead59d5-c4db-4bfe-abcd-e8f42c68fd51_800x533.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h4>More information is better than less. Capital Allocation Matters.&nbsp;Etc.</h4><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!hBEJ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff75bd784-15ae-472a-8f9d-daa72fea14ee_800x533.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!hBEJ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff75bd784-15ae-472a-8f9d-daa72fea14ee_800x533.jpeg 424w, https://substackcdn.com/image/fetch/$s_!hBEJ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff75bd784-15ae-472a-8f9d-daa72fea14ee_800x533.jpeg 848w, https://substackcdn.com/image/fetch/$s_!hBEJ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff75bd784-15ae-472a-8f9d-daa72fea14ee_800x533.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!hBEJ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff75bd784-15ae-472a-8f9d-daa72fea14ee_800x533.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!hBEJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff75bd784-15ae-472a-8f9d-daa72fea14ee_800x533.jpeg" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f75bd784-15ae-472a-8f9d-daa72fea14ee_800x533.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!hBEJ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff75bd784-15ae-472a-8f9d-daa72fea14ee_800x533.jpeg 424w, https://substackcdn.com/image/fetch/$s_!hBEJ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff75bd784-15ae-472a-8f9d-daa72fea14ee_800x533.jpeg 848w, https://substackcdn.com/image/fetch/$s_!hBEJ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff75bd784-15ae-472a-8f9d-daa72fea14ee_800x533.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!hBEJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff75bd784-15ae-472a-8f9d-daa72fea14ee_800x533.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div></div></div></a><figcaption class="image-caption">Photo by <a href="https://unsplash.com/@sharonmccutcheon?utm_source=medium&amp;utm_medium=referral">Alexander Grey</a> on&nbsp;<a href="https://unsplash.com?utm_source=medium&amp;utm_medium=referral">Unsplash</a></figcaption></figure></div><p>Instacart recently ended <a href="https://www.instacart.com/company/updates/ending-item-price-tests-on-instacart">customer-level price tests</a>.</p><p>This blog is a reaction to that, but it&#8217;s also an attempt to change attitudes towards these tests more generally. Thesis: price tests are good and make the world a better place. Bad philosophies of &#8220;fairness&#8221; make us poorer than we have to be.</p><p>I also have a take on press releases.</p><h3>What we&#8217;re talking&nbsp;about</h3><p>A customer-level price test works like this: we randomly assign some customers a price vector (a mapping from each product to its price), and assign the other customers alternative prices. We then run the experiment for a few weeks and see which prices make more moo-lah.</p><p>These tests are extremely powerful because not only do we learn which prices perform better, we learn how elastic demand is near current prices and, if designed correctly, how various goods substitute for each other. This helps us move prices in the right direction, getting closer to maximizing revenue given demand.</p><h3>What&#8217;s the objection</h3><p>The objection&#8202;&#8212;&#8202;as I understand it&#8202;&#8212;&#8202;is that folks don&#8217;t think they should pay different prices for the same good at the same time. This happens every day in an unending list of industries, but it&#8217;s an &#8220;ick&#8221; in other industries, evidently including consumer packaged goods and groceries.</p><p>Why do I care what other people pay? I care what I pay. You tell me the price, and I decide whether to buy the thing at that price. Why would it matter to me that someone else got a &#8220;better deal?&#8221; Good for them?</p><p>Another theory is that businesses do this to charge customers higher prices. If they wanted to charge higher prices, they could just go ahead and do that! They don&#8217;t need to run an experiment! In fact, if they are considering increasing prices, running an experiment decreases prices in expectation. Without the experiment, they&#8217;d just increase prices. That&#8217;s their prior. With the experiment, they might learn, &#8220;Woah, we can&#8217;t increase prices.&#8221;</p><p>Whenever I think an argument is silly, I come up with a model of the world where I&#8217;m wrong, and the argument works. There&#8217;s always a model. I think this helps to avoid dismissing things reflexively. Sometimes, an argument only <em>sounds</em> silly.</p><p>My best attempt to steelman this: yes, consumers can be better off if firms are ignorant.</p><h3>Steelman: Is ignorance bliss (for consumers)?</h3><p>Suppose we&#8217;ve got a monopolist&#8202;&#8212;&#8202;the worst case because they can fully exploit the demand curve, if they know it&#8202;&#8212;&#8202;do they price higher or lower if they have full information?</p><p>Chalkboard model. Our monopolist produces a good with zero marginal cost. They face a linear demand curve:</p><p>Q = C&#8212; DP</p><p>Now, suppose that our monopolist doesn&#8217;t know this demand curve. They have some beliefs about it, of course, but they don&#8217;t know it. They&#8217;re risk-neutral. They maximize expected profits.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!SMFh!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb097ae3b-b14f-4208-b422-63c0eb5de9ae_329x76.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!SMFh!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb097ae3b-b14f-4208-b422-63c0eb5de9ae_329x76.png 424w, https://substackcdn.com/image/fetch/$s_!SMFh!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb097ae3b-b14f-4208-b422-63c0eb5de9ae_329x76.png 848w, https://substackcdn.com/image/fetch/$s_!SMFh!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb097ae3b-b14f-4208-b422-63c0eb5de9ae_329x76.png 1272w, https://substackcdn.com/image/fetch/$s_!SMFh!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb097ae3b-b14f-4208-b422-63c0eb5de9ae_329x76.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!SMFh!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb097ae3b-b14f-4208-b422-63c0eb5de9ae_329x76.png" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b097ae3b-b14f-4208-b422-63c0eb5de9ae_329x76.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!SMFh!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb097ae3b-b14f-4208-b422-63c0eb5de9ae_329x76.png 424w, https://substackcdn.com/image/fetch/$s_!SMFh!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb097ae3b-b14f-4208-b422-63c0eb5de9ae_329x76.png 848w, https://substackcdn.com/image/fetch/$s_!SMFh!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb097ae3b-b14f-4208-b422-63c0eb5de9ae_329x76.png 1272w, https://substackcdn.com/image/fetch/$s_!SMFh!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb097ae3b-b14f-4208-b422-63c0eb5de9ae_329x76.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>If they knew C and D, they&#8217;d just replace the expectations above with the truth.</p><p>So the monopolist price with perfect knowledge is P* = C/2D, and we have that:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Rlh6!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d88e257-5733-4aa6-8c4c-daca2c753ef4_215x47.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Rlh6!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d88e257-5733-4aa6-8c4c-daca2c753ef4_215x47.png 424w, https://substackcdn.com/image/fetch/$s_!Rlh6!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d88e257-5733-4aa6-8c4c-daca2c753ef4_215x47.png 848w, https://substackcdn.com/image/fetch/$s_!Rlh6!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d88e257-5733-4aa6-8c4c-daca2c753ef4_215x47.png 1272w, https://substackcdn.com/image/fetch/$s_!Rlh6!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d88e257-5733-4aa6-8c4c-daca2c753ef4_215x47.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Rlh6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d88e257-5733-4aa6-8c4c-daca2c753ef4_215x47.png" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1d88e257-5733-4aa6-8c4c-daca2c753ef4_215x47.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Rlh6!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d88e257-5733-4aa6-8c4c-daca2c753ef4_215x47.png 424w, https://substackcdn.com/image/fetch/$s_!Rlh6!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d88e257-5733-4aa6-8c4c-daca2c753ef4_215x47.png 848w, https://substackcdn.com/image/fetch/$s_!Rlh6!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d88e257-5733-4aa6-8c4c-daca2c753ef4_215x47.png 1272w, https://substackcdn.com/image/fetch/$s_!Rlh6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d88e257-5733-4aa6-8c4c-daca2c753ef4_215x47.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>On average, is the perfect knowledge price greater than the imperfect knowledge price?</p><p>Let&#8217;s assume the monopolist has rational expectations. Then, this is just a question of whether the expectation of the ratio is greater than the ratio of the expectation.</p><p>If our beliefs about (C,D) were independent, for example (unlikely, but just to make the point), then, on average, the monopolist price with perfect knowledge would price above the monopolist under uncertainty because&#8230;</p><p>D&gt;0, so the Harmonic Mean is less than the Arithmetic Mean, and we have:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!KZkR!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F128b7acc-a33a-4d04-a29a-5c86ce695b52_354x20.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!KZkR!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F128b7acc-a33a-4d04-a29a-5c86ce695b52_354x20.png 424w, https://substackcdn.com/image/fetch/$s_!KZkR!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F128b7acc-a33a-4d04-a29a-5c86ce695b52_354x20.png 848w, https://substackcdn.com/image/fetch/$s_!KZkR!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F128b7acc-a33a-4d04-a29a-5c86ce695b52_354x20.png 1272w, https://substackcdn.com/image/fetch/$s_!KZkR!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F128b7acc-a33a-4d04-a29a-5c86ce695b52_354x20.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!KZkR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F128b7acc-a33a-4d04-a29a-5c86ce695b52_354x20.png" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/128b7acc-a33a-4d04-a29a-5c86ce695b52_354x20.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!KZkR!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F128b7acc-a33a-4d04-a29a-5c86ce695b52_354x20.png 424w, https://substackcdn.com/image/fetch/$s_!KZkR!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F128b7acc-a33a-4d04-a29a-5c86ce695b52_354x20.png 848w, https://substackcdn.com/image/fetch/$s_!KZkR!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F128b7acc-a33a-4d04-a29a-5c86ce695b52_354x20.png 1272w, https://substackcdn.com/image/fetch/$s_!KZkR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F128b7acc-a33a-4d04-a29a-5c86ce695b52_354x20.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>So: E[C/D] = E[C]E[1/D] (by independence) &#8805; E[C]/E[D]</p><p>Ergo, the monopolist prices higher with knowledge (on average).</p><p>I&#8217;ll emphasize <em>on average</em> one more time because, even in this case, it is still possible for C/D &lt; E[C]/E[D] (perfect knowledge pricing is less than pricing under uncertainty) to happen frequently.</p><p>This is only a special case and depends on many detailed assumptions about the nature of uncertainty and how it affects demand, but even so&#8230;</p><h3>But what if we have competition?</h3><p>We get a very different result when we combine risk aversion and perfectly competitive firms.</p><p>This part comes from <a href="https://www.jstor.org/stable/1910541?seq=1">Sandmo (1971)</a>. I&#8217;m stealing it whole cloth. It&#8217;s a good paper. You should read it.</p><p>Suppose we have a competitive industry, i.e., firms take prices as given, but they are uncertain about what those prices will be. Firms are risk-averse, and they have a baseline income M. Firms choose output to solve:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!XPEm!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F94a303e9-3fde-4b7d-b3f5-12d8ed169f91_279x20.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!XPEm!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F94a303e9-3fde-4b7d-b3f5-12d8ed169f91_279x20.png 424w, https://substackcdn.com/image/fetch/$s_!XPEm!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F94a303e9-3fde-4b7d-b3f5-12d8ed169f91_279x20.png 848w, https://substackcdn.com/image/fetch/$s_!XPEm!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F94a303e9-3fde-4b7d-b3f5-12d8ed169f91_279x20.png 1272w, https://substackcdn.com/image/fetch/$s_!XPEm!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F94a303e9-3fde-4b7d-b3f5-12d8ed169f91_279x20.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!XPEm!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F94a303e9-3fde-4b7d-b3f5-12d8ed169f91_279x20.png" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/94a303e9-3fde-4b7d-b3f5-12d8ed169f91_279x20.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!XPEm!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F94a303e9-3fde-4b7d-b3f5-12d8ed169f91_279x20.png 424w, https://substackcdn.com/image/fetch/$s_!XPEm!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F94a303e9-3fde-4b7d-b3f5-12d8ed169f91_279x20.png 848w, https://substackcdn.com/image/fetch/$s_!XPEm!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F94a303e9-3fde-4b7d-b3f5-12d8ed169f91_279x20.png 1272w, https://substackcdn.com/image/fetch/$s_!XPEm!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F94a303e9-3fde-4b7d-b3f5-12d8ed169f91_279x20.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>Where P is random with E[P] = r. U is increasing and concave (firms are risk-averse). C is increasing and convex. M is the baseline income, and F is the fixed cost.</p><p>The first order condition of output choice is:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!jlvq!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F16fd8a74-cd63-4c2b-8e65-fa95764995c0_448x21.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!jlvq!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F16fd8a74-cd63-4c2b-8e65-fa95764995c0_448x21.png 424w, https://substackcdn.com/image/fetch/$s_!jlvq!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F16fd8a74-cd63-4c2b-8e65-fa95764995c0_448x21.png 848w, https://substackcdn.com/image/fetch/$s_!jlvq!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F16fd8a74-cd63-4c2b-8e65-fa95764995c0_448x21.png 1272w, https://substackcdn.com/image/fetch/$s_!jlvq!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F16fd8a74-cd63-4c2b-8e65-fa95764995c0_448x21.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!jlvq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F16fd8a74-cd63-4c2b-8e65-fa95764995c0_448x21.png" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/16fd8a74-cd63-4c2b-8e65-fa95764995c0_448x21.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!jlvq!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F16fd8a74-cd63-4c2b-8e65-fa95764995c0_448x21.png 424w, https://substackcdn.com/image/fetch/$s_!jlvq!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F16fd8a74-cd63-4c2b-8e65-fa95764995c0_448x21.png 848w, https://substackcdn.com/image/fetch/$s_!jlvq!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F16fd8a74-cd63-4c2b-8e65-fa95764995c0_448x21.png 1272w, https://substackcdn.com/image/fetch/$s_!jlvq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F16fd8a74-cd63-4c2b-8e65-fa95764995c0_448x21.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>Subtract E[U&#8217; x r] from both sides to get:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!AAlq!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdf83a818-8adf-454a-9854-13e53ec6da8d_304x21.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!AAlq!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdf83a818-8adf-454a-9854-13e53ec6da8d_304x21.png 424w, https://substackcdn.com/image/fetch/$s_!AAlq!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdf83a818-8adf-454a-9854-13e53ec6da8d_304x21.png 848w, https://substackcdn.com/image/fetch/$s_!AAlq!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdf83a818-8adf-454a-9854-13e53ec6da8d_304x21.png 1272w, https://substackcdn.com/image/fetch/$s_!AAlq!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdf83a818-8adf-454a-9854-13e53ec6da8d_304x21.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!AAlq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdf83a818-8adf-454a-9854-13e53ec6da8d_304x21.png" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/df83a818-8adf-454a-9854-13e53ec6da8d_304x21.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!AAlq!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdf83a818-8adf-454a-9854-13e53ec6da8d_304x21.png 424w, https://substackcdn.com/image/fetch/$s_!AAlq!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdf83a818-8adf-454a-9854-13e53ec6da8d_304x21.png 848w, https://substackcdn.com/image/fetch/$s_!AAlq!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdf83a818-8adf-454a-9854-13e53ec6da8d_304x21.png 1272w, https://substackcdn.com/image/fetch/$s_!AAlq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdf83a818-8adf-454a-9854-13e53ec6da8d_304x21.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>Write profits as V = M + PQ&#8202;&#8212;&#8202;C(Q)&#8202;&#8212;&#8202;F = E[V] + (P&#8202;&#8212;&#8202;r) Q.</p><p>So, suppose P &#8805; r. Then, V &#8805; E[V] and because U is concave:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!WRcB!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1e44a9e8-94da-4c1f-b5ee-a34c87fe189e_152x21.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!WRcB!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1e44a9e8-94da-4c1f-b5ee-a34c87fe189e_152x21.png 424w, https://substackcdn.com/image/fetch/$s_!WRcB!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1e44a9e8-94da-4c1f-b5ee-a34c87fe189e_152x21.png 848w, https://substackcdn.com/image/fetch/$s_!WRcB!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1e44a9e8-94da-4c1f-b5ee-a34c87fe189e_152x21.png 1272w, https://substackcdn.com/image/fetch/$s_!WRcB!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1e44a9e8-94da-4c1f-b5ee-a34c87fe189e_152x21.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!WRcB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1e44a9e8-94da-4c1f-b5ee-a34c87fe189e_152x21.png" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1e44a9e8-94da-4c1f-b5ee-a34c87fe189e_152x21.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!WRcB!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1e44a9e8-94da-4c1f-b5ee-a34c87fe189e_152x21.png 424w, https://substackcdn.com/image/fetch/$s_!WRcB!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1e44a9e8-94da-4c1f-b5ee-a34c87fe189e_152x21.png 848w, https://substackcdn.com/image/fetch/$s_!WRcB!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1e44a9e8-94da-4c1f-b5ee-a34c87fe189e_152x21.png 1272w, https://substackcdn.com/image/fetch/$s_!WRcB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1e44a9e8-94da-4c1f-b5ee-a34c87fe189e_152x21.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>Because P &#8805; r, we can write:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!zT5a!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffbe4f99f-4356-4bee-9792-ffa404377ef5_280x21.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!zT5a!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffbe4f99f-4356-4bee-9792-ffa404377ef5_280x21.png 424w, https://substackcdn.com/image/fetch/$s_!zT5a!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffbe4f99f-4356-4bee-9792-ffa404377ef5_280x21.png 848w, https://substackcdn.com/image/fetch/$s_!zT5a!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffbe4f99f-4356-4bee-9792-ffa404377ef5_280x21.png 1272w, https://substackcdn.com/image/fetch/$s_!zT5a!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffbe4f99f-4356-4bee-9792-ffa404377ef5_280x21.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!zT5a!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffbe4f99f-4356-4bee-9792-ffa404377ef5_280x21.png" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/fbe4f99f-4356-4bee-9792-ffa404377ef5_280x21.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!zT5a!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffbe4f99f-4356-4bee-9792-ffa404377ef5_280x21.png 424w, https://substackcdn.com/image/fetch/$s_!zT5a!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffbe4f99f-4356-4bee-9792-ffa404377ef5_280x21.png 848w, https://substackcdn.com/image/fetch/$s_!zT5a!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffbe4f99f-4356-4bee-9792-ffa404377ef5_280x21.png 1272w, https://substackcdn.com/image/fetch/$s_!zT5a!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffbe4f99f-4356-4bee-9792-ffa404377ef5_280x21.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>In fact, this inequality holds for all P because if P &lt; r, then U&#8217;(V) &#8805; U&#8217;(E[V]) but (P-r) &lt; 0, so the above still holds.</p><p>Okay, so we can take expectation across P on both sides of the inequality:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!PlQB!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8254cc7-6ae7-4186-a017-e002c35b22c8_355x21.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!PlQB!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8254cc7-6ae7-4186-a017-e002c35b22c8_355x21.png 424w, https://substackcdn.com/image/fetch/$s_!PlQB!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8254cc7-6ae7-4186-a017-e002c35b22c8_355x21.png 848w, https://substackcdn.com/image/fetch/$s_!PlQB!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8254cc7-6ae7-4186-a017-e002c35b22c8_355x21.png 1272w, https://substackcdn.com/image/fetch/$s_!PlQB!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8254cc7-6ae7-4186-a017-e002c35b22c8_355x21.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!PlQB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8254cc7-6ae7-4186-a017-e002c35b22c8_355x21.png" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c8254cc7-6ae7-4186-a017-e002c35b22c8_355x21.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!PlQB!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8254cc7-6ae7-4186-a017-e002c35b22c8_355x21.png 424w, https://substackcdn.com/image/fetch/$s_!PlQB!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8254cc7-6ae7-4186-a017-e002c35b22c8_355x21.png 848w, https://substackcdn.com/image/fetch/$s_!PlQB!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8254cc7-6ae7-4186-a017-e002c35b22c8_355x21.png 1272w, https://substackcdn.com/image/fetch/$s_!PlQB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8254cc7-6ae7-4186-a017-e002c35b22c8_355x21.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>Going back to the first order condition, this means:</p><p>E[U&#8217;(V) (P&#8202;&#8212;&#8202;r)] = E[U&#8217;(V) (C&#8217;(Q)&#8202;&#8212;&#8202;r)] &#8804; 0, which since U&#8217; &gt; 0 must mean that at the optimal Q,</p><p>C&#8217;(Q) &#8804; r</p><p>i.e., at the optimal output, the marginal cost is less than the expected price. If prices were known with certainty, the firm would choose output to set marginal cost equal to the known price. Because marginal cost is an increasing function of Q (more or less necessary for price-taking models), this means that:</p><ol><li><p>Uncertainty about price <em>reduces output</em>.</p></li><li><p>Equilibrium prices will be <em>higher</em> because firms restrict output relative to perfect knowledge.</p></li></ol><p>i.e., consumers actually want firms to know more! It leads to lower prices!</p><p><strong>Note.</strong> It&#8217;s a little funky to think about price uncertainty. It&#8217;s more natural to think of firms picking a price and seeing how much demand they get. But this model works at the limit of competition, so output is the firm&#8217;s only choice.</p><h3>Policy</h3><p>So, depending on our model of the world, we get very different implications for consumers when firms learn more about the demand curve.</p><p>The point is that it&#8217;s far from clear how firms having better information plays out, <em>and,</em> in any case, we shouldn&#8217;t base policy (governmental, social norms, or biz decisions) on the idea that firms will remain ignorant of their demand curve. They <strong>will</strong> learn it from experience! They don&#8217;t <em>need</em> experimental data to learn demand. It&#8217;s just a better and more accurate way to do so. Enforcing ignorance is a bad solution to a market power problem&#8230;</p><p>Profit-maximizing prices matter. They tell folks where to put capital. They tell us how valuable a product really is. They allocate resources. The right prices matter for more than the individual firm trying to make a buck. When resources are misallocated across an economy, <a href="http://klenow.com/MMTFP.pdf">it lowers aggregate output</a>, lowers productivity (because capital matches with the wrong labor/other factors), and prevents economic growth. Sad!</p><p>Experiments give us something clear. A solid ground and a judge of what works and what doesn&#8217;t&#8202;&#8212;&#8202;instead of having to base all pricing analysis on tortured regressions or highly parameterized discrete-choice models.</p><p>Consider what would happen in the absence of experimentation. If firms don&#8217;t experiment, they&#8217;ll use non-experimental analysis methods to set prices (this is what most pricing analyses are exactly because of the Instacart experience&#8202;&#8212;&#8202;there&#8217;s this vague sense that randomized pricing isn&#8217;t &#8220;fair&#8221;). If this works well, then it&#8217;ll lead to the same outcome as the experimentation approach. So, there&#8217;s no harm in the firm experimenting.</p><p>If the assumptions underlying the non-experimental analysis are wrong, who knows what will happen? Maybe we get lucky, and firms don&#8217;t recognize their full market power because of their ignorance. Maybe resources are misallocated. Maybe the firm underprices, and a valuable good or service doesn&#8217;t get the capital it needs? Maybe the firm overprices? Who knows?</p><p>Does more information make pricing more pro-consumer or less? It depends. But I find it difficult to imagine that an economy operating under greater uncertainty is better than one operating with more information, all else equal.</p><h3>Press Releases</h3><p>I&#8217;m going to close by discussing an exciting new topic, not yet explored on this blog. Press releases.</p><blockquote><p>&#8220;At a time when families are working exceptionally hard to stretch every grocery dollar, those tests raised concerns, leaving some people questioning the prices they see on Instacart. That&#8217;s not okay&#8202;&#8212;&#8202;especially for a company built on trust, transparency, and affordability.&#8221;</p></blockquote><p>?</p><p>Why can&#8217;t we write this?</p><p>&#8220;We enabled our retailers to run price experiments where one customer might see a different price than another customer for the same good at the same time. Our customers said they didn&#8217;t like that. The upside of running those experiments isn&#8217;t worth the blowback. So, we won&#8217;t enable our retailers to run price experiments like that anymore. Thanks.&#8221;</p><p>Everyone reading knows that&#8217;s the truth&#8202;&#8212;&#8202;and it&#8217;s a fine truth! There&#8217;s nothing wrong with it! Not saying it clearly and introducing vague &#8220;concerns&#8221; just creates this sense of impropriety where none exists. The reader wonders how Instacart&#8217;s pricing experiments hurt families struggling to pay for groceries. Why are people questioning the prices? Were the prices &#8220;fake&#8221; in some way? Etc.</p><p>Not to bring up politics, but this is one thing Trump did effectively in the 2016 GOP Primary. His opponents would catch him contradicting a previous position, and then he would say, &#8220;Yeah, well, I changed positions because this one polls better.&#8221; And his opponents were caught flat-footed. &#8220;Wait, you can just admit that? You don&#8217;t have to come up with a fake justification for changing your position?&#8221; Of course! It&#8217;s obviously true!</p><p>You wanted us to stop it, so we&#8217;re stopping it. End of story.</p><p>(I realize I just lost everyone with the absolute unit of a hot take that &#8220;we should handle PR like Trump,&#8221; but I only mean in this specific way! We should feel less shame when we have nothing to be ashamed of. Democracy requires aligning yourself with voters. Business requires trying things to make more moo-lah.)</p><div><hr></div><p>Thanks for reading!</p><p>Zach</p><p>Connect at: <a href="https://linkedin.com/in/zlflynn">https://linkedin.com/in/zlflynn</a></p><p>Visit me on the World Wide Web: <a href="https://zflynn.com">https://zflynn.com</a></p>]]></content:encoded></item><item><title><![CDATA[“So? He seems like a nice fellow.”]]></title><description><![CDATA[Why AI art won&#8217;t work.]]></description><link>https://underthenull.com/p/so-he-seems-like-a-nice-fellow</link><guid isPermaLink="false">https://underthenull.com/p/so-he-seems-like-a-nice-fellow</guid><dc:creator><![CDATA[Zach Flynn]]></dc:creator><pubDate>Sun, 21 Dec 2025 08:50:51 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/21a5b22c-1b0e-4049-a33f-f628d3394e69_800x498.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h4>Why AI art won&#8217;t&nbsp;work.</h4><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!H6-d!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbd8a2394-7762-45cc-8fa3-c981ac39b08f_800x498.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!H6-d!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbd8a2394-7762-45cc-8fa3-c981ac39b08f_800x498.png 424w, https://substackcdn.com/image/fetch/$s_!H6-d!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbd8a2394-7762-45cc-8fa3-c981ac39b08f_800x498.png 848w, https://substackcdn.com/image/fetch/$s_!H6-d!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbd8a2394-7762-45cc-8fa3-c981ac39b08f_800x498.png 1272w, https://substackcdn.com/image/fetch/$s_!H6-d!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbd8a2394-7762-45cc-8fa3-c981ac39b08f_800x498.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!H6-d!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbd8a2394-7762-45cc-8fa3-c981ac39b08f_800x498.png" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/bd8a2394-7762-45cc-8fa3-c981ac39b08f_800x498.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!H6-d!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbd8a2394-7762-45cc-8fa3-c981ac39b08f_800x498.png 424w, https://substackcdn.com/image/fetch/$s_!H6-d!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbd8a2394-7762-45cc-8fa3-c981ac39b08f_800x498.png 848w, https://substackcdn.com/image/fetch/$s_!H6-d!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbd8a2394-7762-45cc-8fa3-c981ac39b08f_800x498.png 1272w, https://substackcdn.com/image/fetch/$s_!H6-d!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbd8a2394-7762-45cc-8fa3-c981ac39b08f_800x498.png 1456w" sizes="100vw" fetchpriority="high"></picture><div></div></div></a><figcaption class="image-caption">Albert Bierstadt. Estes Park, Colorado.</figcaption></figure></div><p>My most Luddite opinion (tough competition): AI art won&#8217;t work. Not even if the models get better. Beauty isn&#8217;t enough.</p><p>No one talks about art without talking about who made it. It&#8217;s an essential part of the thing. We connect with it because we know someone made it. It matters <em>who </em>Van Gogh is. We put ourselves in the artist&#8217;s shoes, or they repulse us. We react. You can feel what they do and identify with it, or be stupefied by an experience so alien to your own&#8230; If you know it&#8217;s a machine, the whole thing falls apart.</p><p>There&#8217;s a genre of pro-AI Art take. The writer points out that people can&#8217;t tell the difference between AI-generated images and paintings by human artists, but the test, like the Turing Test, misses the point. It&#8217;s not whether people can be fooled that matters, but what happens when they know the truth. We&#8217;ll know the robots are true intelligences when you can tell a human being that they&#8217;ve been talking to a robot, and they respond, &#8220;So? He seems like a nice fellow.&#8221;</p><p>If you show folks two pictures and tell them AI made one and a human artist made the other, they&#8217;ll choose the human one&#8202;&#8212;&#8202;and mean it. It&#8217;s not just loyalty to carbon over silicon. It&#8217;s a sense of connection. They know that any artistic insight generated via AI comes from endless training data and some opaque process of aggregating that information, not from a particularly foggy morning or falling in love.</p><p>It&#8217;s an uncanny valley: the models produce something that looks like art, but it has no biography, no connection, and look, frankly, the robots have never smoked clove cigarettes or said anything unbearably pretentious but also sort of true, so I don&#8217;t think they&#8217;ll make it in the art world.</p><div><hr></div><p>Zach</p><p>LinkedIn: <a href="https://linkedin.com/in/zlflynn">https://linkedin.com/in/zlflynn</a></p><p>Website: <a href="https://zflynn.com">https://zflynn.com</a></p><p>Udemy course: <a href="https://www.udemy.com/course/identifying-causal-effects-for-data-scientists/?couponCode=CHEAPCAUSALINF3">https://www.udemy.com/course/identifying-causal-effects-for-data-scientists/</a></p>]]></content:encoded></item><item><title><![CDATA[Accepting the Null]]></title><description><![CDATA[Can we accept the null?]]></description><link>https://underthenull.com/p/accepting-the-null</link><guid isPermaLink="false">https://underthenull.com/p/accepting-the-null</guid><dc:creator><![CDATA[Zach Flynn]]></dc:creator><pubDate>Wed, 26 Nov 2025 08:50:51 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/188f80c2-299e-4db8-915a-6c8eaaf87dd0_800x534.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h4>Can we accept the&nbsp;null?</h4><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!cNAm!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c43b094-de9c-4101-81e0-41953cf332d6_800x534.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!cNAm!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c43b094-de9c-4101-81e0-41953cf332d6_800x534.jpeg 424w, https://substackcdn.com/image/fetch/$s_!cNAm!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c43b094-de9c-4101-81e0-41953cf332d6_800x534.jpeg 848w, https://substackcdn.com/image/fetch/$s_!cNAm!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c43b094-de9c-4101-81e0-41953cf332d6_800x534.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!cNAm!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c43b094-de9c-4101-81e0-41953cf332d6_800x534.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!cNAm!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c43b094-de9c-4101-81e0-41953cf332d6_800x534.jpeg" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0c43b094-de9c-4101-81e0-41953cf332d6_800x534.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!cNAm!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c43b094-de9c-4101-81e0-41953cf332d6_800x534.jpeg 424w, https://substackcdn.com/image/fetch/$s_!cNAm!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c43b094-de9c-4101-81e0-41953cf332d6_800x534.jpeg 848w, https://substackcdn.com/image/fetch/$s_!cNAm!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c43b094-de9c-4101-81e0-41953cf332d6_800x534.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!cNAm!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c43b094-de9c-4101-81e0-41953cf332d6_800x534.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div></div></div></a><figcaption class="image-caption">Photo by <a href="https://unsplash.com/@benhershey?utm_source=medium&amp;utm_medium=referral">Ben Hershey</a> on&nbsp;<a href="https://unsplash.com?utm_source=medium&amp;utm_medium=referral">Unsplash</a></figcaption></figure></div><p>You might have heard we don&#8217;t &#8220;accept&#8221; the null hypothesis. We merely &#8220;find no evidence&#8221; to reject it.</p><p>There&#8217;s a version of the world where this framing of statistical inference makes sense: where the chief task of the researcher is to gather information about the world and conclude whether it can tell us anything, and if not? Oh well. We&#8217;ll get &#8217;em next time.</p><p>This world exists, and we&#8217;ll vacation there in this blog, but I&#8217;ve never lived there, and you probably don&#8217;t either.</p><p>When you <em>ar</em>e the policymaker&#8202;&#8212;&#8202;even the policymaker&#8217;s assistant&#8217;s understudy&#8202;&#8212;&#8202;you can&#8217;t avoid&#8230; making policy. You either ship A or you ship B.</p><p>If you &#8220;found no evidence to reject the null,&#8221; and shipped A, then you looked at the data and decided that A was better than B by some metric. Why else wouldn&#8217;t you go with B? So, there&#8217;s a very real sense that you &#8220;accepted&#8221; the null.</p><p>The distinction is between decision-making and fact-finding.</p><p>Suppose we&#8217;ve got T = E[Y(B)]&#8202;&#8212;&#8202;E[Y(A)], a standard average treatment effect, and, if we knew T, we would want to do action B if T &gt; 0, and action A if T &lt; 0.</p><p>T &gt; 0 is either true or false. It&#8217;s a fact. So, one framing of statistical inference: do we have enough evidence to conclude T &gt; 0 is true? If we take this approach, we set up a hypothesis test with the null hypothesis that T &#8804; 0 and evaluate whether to reject it. From this perspective, it really does make sense to say, &#8220;Oh well.&#8221; In fact, we must be willing to because we can&#8217;t assume there&#8217;s enough evidence to prove T &gt; 0.</p><p>But this is an unusual way to state the problem if we&#8217;re deciding between A and B. We can&#8217;t avoid making a choice, so it doesn&#8217;t make sense to talk about the data &#8220;not having enough evidence&#8221; for us to decide. Some datasets support choice A, and others support choice B.</p><p>That isn&#8217;t to say the hypothesis testing framework and <a href="https://goodenoughstatistics.com/in-defense-of-statistical-significance-996e8c62f3e8">statistical significance</a> aren&#8217;t <em>useful</em>. They are. They&#8217;re a nice way of quantifying how much <a href="https://goodenoughstatistics.com/use-decision-theory-to-choose-significance-levels-for-experiments-073fecae0865">status quo bias</a> we want to incorporate into our decision (and we should have some: we have more experience with the past and more knowledge of its risks&#8202;&#8212;&#8202;better the devil you know&#8230;).</p><p>Statistical inference, like art and morality, requires us to draw the line somewhere. The hypothesis testing framework helps us find where to draw it.</p><p>But the key is to recognize that we aren&#8217;t actually testing a hypothesis. Not really. We&#8217;re not finding facts. We&#8217;re making decisions. So, we do accept nulls and alternatives as we please.</p><p>A side-benefit of treating statistical inference as a decision problem is that it&#8217;s much easier to explain. We&#8217;re looking at this dataset and deciding whether it favors A or B. You don&#8217;t need to try to explain the subtle asymmetries of nulls and alternatives.</p><p>Nice!</p><div><hr></div><p>Thanks for reading!</p><p>Zach</p><p>Connect at: <a href="https://linkedin.com/in/zlflynn">https://linkedin.com/in/zlflynn</a></p><p>Udemy course: <a href="https://www.udemy.com/course/identifying-causal-effects-for-data-scientists/?couponCode=928E40B177B5DB6F5266">https://www.udemy.com/course/identifying-causal-effects-for-data-scientists/?couponCode=928E40B177B5DB6F5266</a></p><p>If you would like my help with something (involving statistics, I should clarify): <a href="https://zflynn.com/consulting.html">https://zflynn.com/consulting.html</a></p>]]></content:encoded></item><item><title><![CDATA[Creative Destruction]]></title><description><![CDATA[A Nobel paper I can write about!]]></description><link>https://underthenull.com/p/creative-destruction</link><guid isPermaLink="false">https://underthenull.com/p/creative-destruction</guid><dc:creator><![CDATA[Zach Flynn]]></dc:creator><pubDate>Fri, 31 Oct 2025 07:50:51 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/a4917c5c-7a5d-481b-bcc6-7fac9c3bf9e6_800x1065.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h4>A Nobel paper I can write&nbsp;about!</h4><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!x59W!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa888903c-fee7-4fa0-afd2-880459e677a2_800x1065.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!x59W!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa888903c-fee7-4fa0-afd2-880459e677a2_800x1065.jpeg 424w, https://substackcdn.com/image/fetch/$s_!x59W!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa888903c-fee7-4fa0-afd2-880459e677a2_800x1065.jpeg 848w, https://substackcdn.com/image/fetch/$s_!x59W!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa888903c-fee7-4fa0-afd2-880459e677a2_800x1065.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!x59W!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa888903c-fee7-4fa0-afd2-880459e677a2_800x1065.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!x59W!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa888903c-fee7-4fa0-afd2-880459e677a2_800x1065.jpeg" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a888903c-fee7-4fa0-afd2-880459e677a2_800x1065.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!x59W!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa888903c-fee7-4fa0-afd2-880459e677a2_800x1065.jpeg 424w, https://substackcdn.com/image/fetch/$s_!x59W!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa888903c-fee7-4fa0-afd2-880459e677a2_800x1065.jpeg 848w, https://substackcdn.com/image/fetch/$s_!x59W!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa888903c-fee7-4fa0-afd2-880459e677a2_800x1065.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!x59W!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa888903c-fee7-4fa0-afd2-880459e677a2_800x1065.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div></div></div></a><figcaption class="image-caption">Photo by <a href="https://unsplash.com/@jhalinar?utm_source=medium&amp;utm_medium=referral">Joe Halinar</a> on&nbsp;<a href="https://unsplash.com?utm_source=medium&amp;utm_medium=referral">Unsplash</a></figcaption></figure></div><p>I went through a few phases in grad school where I thought certain papers had the answer to everything&#8202;&#8212;&#8202;in particular, to the most critical question: &#8220;What should I write my thesis on?&#8221;</p><p>One of those phases sent me down this rabbit hole on Aghion and Howitt (1992) and the inverted U-shaped relationship between innovation and competition, creative destruction, Schumpeter, and all that.</p><p>Recently, Aghion and Howitt won the Nobel&#8202;&#8212;&#8202;largely because of that paper and research program.</p><p>So, we have two factors coming together:</p><ol><li><p>I know the paper well because of the hours I spent thinking and writing about it&#8202;&#8212;&#8202;generating zero usable output&#8202;&#8212;&#8202;at many Madison-area coffee shops circa 2014.</p></li><li><p>I have a blog.</p></li></ol><p>So, I have to write about it to cash in on those sweet Nobel clicks&#8202;&#8212;&#8202;maybe? We&#8217;ll see. In any case, it&#8217;s a great paper, and you should know about it.</p><div><hr></div><p>The paper wrestles with the question of how innovation drives economic growth.</p><p><strong>Economic growth is the most important thing in the entire world.</strong> And that&#8217;s understating it.</p><p>Throughout most of human history, economic growth measured by something like GDP per capita was anemic by modern standards. 2% <em>in a year</em> would have been considered insane progress. And it kind of is: 2% growth means the economy <em>doubles </em>every thirty-five years. Not doubles because of inflation&#8202;&#8212;&#8202;doubles in the sense that we really produce twice as much or stuff that&#8217;s twice as valuable. Nowadays, that&#8217;s the growth rate of even already very advanced economies like the United States.</p><p>Why? What changed? And what causes economic growth in any case? We only have one Earth and whatever resources God and the stars deigned to give us. And ourselves. So how do we produce more per person from the same materials and the same people?</p><p>At first, the answer seems obvious. Technological progress. We get better at making things. And, in fact, that answer is correct, more or less. There&#8217;s an old model that already won a Nobel Prize&#8202;&#8212;&#8202;before Aghion and Howitt even wrote their paper (well, maybe it was already a working paper, publication takes time)&#8202;&#8212;&#8202;by Mr. Solow.</p><p>Solow showed, among other things, that, in the long run, all economic growth comes via improved <em>productivity.</em></p><p>But what is productivity?</p><p>Well, stuff we can&#8217;t measure and don&#8217;t know about. Factors of production besides capital and labor.</p><p>So, productivity is a great answer but a partial one. Economic growth can&#8217;t be <em>driven</em> by technological progress because progress is itself an outcome. It begs the question: why is there technological progress in the first place?</p><p>And so, economists started a literature on &#8220;endogenous growth theory,&#8221; which tried to&#8202;&#8212;&#8202;you guessed it&#8202;&#8212;&#8202;endogenize growth, i.e. make growth an outcome of an economy, not an exogenous technological improvement.</p><p><em>Aside: Economists as a species are horribly uninspired when it comes to naming things. Machine learning types would have written about Real Economic Learning or the Progress Function or something that would sell. There&#8217;s room for improvement in the Econ marketing department.</em></p><p>Aghion and Howitt (1992) is part of that literature. They propose a new avenue for economic growth: Creative Destruction.</p><p>Reading <a href="https://www.amazon.com/Capitalism-Socialism-Democracy-Perennial-Thought/dp/0061561614/">Schumpeter</a> (1942) is the first step toward radicalization:</p><blockquote><p>&#8220;This process of Creative Destruction is the essential fact about capitalism. It is what capitalism consists in and what every capitalist concern has got to live in&#8230; The problem that is usually being visualized is how capitalism administers existing structures, whereas the relevant problem is how it creates and destroys them. As long as this is not recognized, the investigator does a meaningless job. As soon as it is recognized, his outlook on capitalist practice and its social results changes considerably.&#8221;&#8202;&#8212;&#8202;Joseph Schumpeter (1942)</p></blockquote><blockquote><p>&#8220;The fundamental impulse that sets and keeps the capitalist engine in motion comes from the new consumers&#8217; goods, the new methods of production or transportation, the new markets&#8230;. [This process] incessantly revolutionizes the economic structure from within, incessantly destroying the old one, incessantly creating a new one. This process of Creative Destruction is the essential fact about capitalism.&#8221;&#8202;&#8212;&#8202;Joseph Schumpeter (1942)</p></blockquote><h3>Model Setting</h3><p>Aghion and Howitt&#8217;s model has three kinds of goods in it:</p><ol><li><p>Labor</p></li><li><p>A Good People Want To Consume</p></li><li><p>An intermediate good used to make the consumption good</p></li></ol><p>The world consists of a continuum of people who live forever (nice!), and don&#8217;t mind working (no disutility from labor).</p><p>There are three kinds of labor folks can do:</p><ol><li><p>Unskilled labor, which can only make the Consumption Good.</p></li><li><p>Skilled labor, which can do &#8220;research&#8221; or produce the Intermediate Good.</p></li><li><p>Specialized labor, which does &#8220;research&#8221;.</p></li></ol><p>A key simplifying assumption here is that the mass of each of these three labor types is fixed at (M, N, R). Note that this still allows for different research intensities because the Skilled Labor can choose to produce research or intermediate goods.</p><p>Because unskilled labor is fixed and supplied inelastically, we can write the production function for the consumption good without including it directly, i.e. y = A F(x), where x is the flow of the intermediate input and A is current productivity.</p><p>The flow of intermediate input is determined linearly by the amount of Skilled Labor working on the intermediate good (L): x = L.</p><p>Research produces innovations arriving randomly via a Poisson parameter that depends on the amount of labor allocated to work on research, i.e. q x g(n, R) where n is the skilled labor working on research.</p><p><strong>This is the key part</strong>. When a new innovation arrives, it increases productivity by a constant factor A&#8217; = v A, <em>but</em> the new innovation requires a new type of intermediate input. To be more productive, we need to do different things than we did before.</p><p>Property rights are perfect so that the innovative firm can capture the full rewards from the more productive technology, and the lower-cost product immediately monopolizes the industry.</p><p>There is only one firm active at any given point in time, and it&#8217;s a monopolist&#8202;&#8212;&#8202;but only until a new firm comes along with a better production process to replace it.</p><p>The monopolist, however, is not the only firm. There are other firms, waiting in the wings, deciding how much to invest in research to have a chance of being the firm to produce the next innovation.</p><p>The beauty of this model is that it&#8217;s trying to capture a very complex problem: how economies evolve with an endogenous innovation and, yet, at any point in time, there&#8217;s really only one decision for the economy to figure out: how much <em>skilled</em> labor to allocate to research and how much to allocate to production.</p><p>The model had such a great impact exactly because of this setup, I think. It&#8217;s an elegant way to model out and think seriously about Creative Destruction (discussed in economics since at least Marx, who viewed the process as eventually leading to the end of capitalism, etc).</p><p>Okay, so that&#8217;s the setup. What do Aghion and Howitt do with it?</p><h3>Implications</h3><p>So, first, we have some direct comparative statics about how much research skilled labor does in equilibrium.</p><p>Research increases when interest rates fall (because the marginal benefit of research rises as current consumption can be delayed), as the size of the innovation (v above) increases (again, because the benefit of research increases), and if innovations arrive more rapidly. That more rapid innovation leads to increased research is not obvious because more rapid innovation cycles decrease future profits from monopolizing the industry, so the marginal benefit of innovation falls. However, it turns out, the marginal cost of innovation falls more.</p><p>But the most interesting result is how the equilibrium research intensity differs from the socially optimal one.</p><p>When the size of innovations (v) are large, firms will <em>underinvest</em> relative to the social optimum because the discount rate of private firms is larger than the discount rate of the social planner, who understands that the innovation will have permanent effects on economic growth. The private firms understand they have only a finite lifespan until they are destroyed via competition.</p><p>When the size of innovations is relatively small compared to the size of monopoly power, then firms will <em>overinvest </em>because the rewards to winning the research race are greater and longer-lasting. In other words, less competition drives increased innovation!</p><p>The paper has a great slew of other interesting extensions to this core idea&#8202;&#8212;&#8202;<a href="https://www.jstor.org/stable/2951599?read-now=1&amp;seq=17#page_scan_tab_contents">you should check it out</a>!</p><h3>Conclusion</h3><p>If you haven&#8217;t read it, or if you haven&#8217;t read it carefully, the paper and the entire growth research program really, is well worth it. Most of <em>Modern Economics </em>is a lot of statistics, demand models, <em>details</em>. This literature steps back and asks the big questions&#8202;&#8212;&#8202;which can be a nice break from figuring out how to calculate standard errors&nbsp;</p><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!nPrN!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0eac212b-af57-4757-90bb-c95f83d1d0fe_72x72.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!nPrN!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0eac212b-af57-4757-90bb-c95f83d1d0fe_72x72.png 424w, https://substackcdn.com/image/fetch/$s_!nPrN!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0eac212b-af57-4757-90bb-c95f83d1d0fe_72x72.png 848w, https://substackcdn.com/image/fetch/$s_!nPrN!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0eac212b-af57-4757-90bb-c95f83d1d0fe_72x72.png 1272w, https://substackcdn.com/image/fetch/$s_!nPrN!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0eac212b-af57-4757-90bb-c95f83d1d0fe_72x72.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!nPrN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0eac212b-af57-4757-90bb-c95f83d1d0fe_72x72.png" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0eac212b-af57-4757-90bb-c95f83d1d0fe_72x72.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&#128578;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="&#128578;" title="&#128578;" srcset="https://substackcdn.com/image/fetch/$s_!nPrN!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0eac212b-af57-4757-90bb-c95f83d1d0fe_72x72.png 424w, https://substackcdn.com/image/fetch/$s_!nPrN!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0eac212b-af57-4757-90bb-c95f83d1d0fe_72x72.png 848w, https://substackcdn.com/image/fetch/$s_!nPrN!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0eac212b-af57-4757-90bb-c95f83d1d0fe_72x72.png 1272w, https://substackcdn.com/image/fetch/$s_!nPrN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0eac212b-af57-4757-90bb-c95f83d1d0fe_72x72.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><div><hr></div><p>Thanks for reading!</p><p>Zach</p><p>Connect at: <a href="https://linkedin.com/in/zlflynn">https://linkedin.com/in/zlflynn</a></p><p>Take my Udemy course at: <a href="https://www.udemy.com/course/identifying-causal-effects-for-data-scientists/?couponCode=1DD1B90E5C29DD496967">https://www.udemy.com/course/identifying-causal-effects-for-data-scientists/?couponCode=1DD1B90E5C29DD496967</a></p>]]></content:encoded></item><item><title><![CDATA[Culture, Not Laws]]></title><description><![CDATA[Thoughts on creating an experimentation culture]]></description><link>https://underthenull.com/p/culture-not-laws</link><guid isPermaLink="false">https://underthenull.com/p/culture-not-laws</guid><dc:creator><![CDATA[Zach Flynn]]></dc:creator><pubDate>Tue, 30 Sep 2025 07:50:52 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/07352f99-12a5-4e56-95cc-dc472487dd27_800x1200.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h4>Thoughts on creating an experimentation culture</h4><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!em4m!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7a31741-1a89-4fd0-b8f7-30d514cd2e5a_800x1200.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!em4m!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7a31741-1a89-4fd0-b8f7-30d514cd2e5a_800x1200.jpeg 424w, https://substackcdn.com/image/fetch/$s_!em4m!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7a31741-1a89-4fd0-b8f7-30d514cd2e5a_800x1200.jpeg 848w, https://substackcdn.com/image/fetch/$s_!em4m!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7a31741-1a89-4fd0-b8f7-30d514cd2e5a_800x1200.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!em4m!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7a31741-1a89-4fd0-b8f7-30d514cd2e5a_800x1200.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!em4m!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7a31741-1a89-4fd0-b8f7-30d514cd2e5a_800x1200.jpeg" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b7a31741-1a89-4fd0-b8f7-30d514cd2e5a_800x1200.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!em4m!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7a31741-1a89-4fd0-b8f7-30d514cd2e5a_800x1200.jpeg 424w, https://substackcdn.com/image/fetch/$s_!em4m!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7a31741-1a89-4fd0-b8f7-30d514cd2e5a_800x1200.jpeg 848w, https://substackcdn.com/image/fetch/$s_!em4m!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7a31741-1a89-4fd0-b8f7-30d514cd2e5a_800x1200.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!em4m!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7a31741-1a89-4fd0-b8f7-30d514cd2e5a_800x1200.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div></div></div></a><figcaption class="image-caption">Photo by <a href="https://unsplash.com/@wesleyphotography?utm_source=medium&amp;utm_medium=referral">Wesley Tingey</a> on&nbsp;<a href="https://unsplash.com?utm_source=medium&amp;utm_medium=referral">Unsplash</a></figcaption></figure></div><p><em>This blog is written in the context of a centralized Experimentation Team, but it can apply more generally if you are working to expand Experimentation within your particular team, as well.</em></p><p>The first temptation when trying to create an Experimentation culture is not unlike the temptation faced by the would-be utopian reformer: we should write some laws. There should be <em>rules</em> for how to experiment, we think.</p><p>Unlike the utopian reformer, we (thankfully) don&#8217;t have the option to convert into a dictator when our Enlightened Laws prove difficult to enforce.</p><p>Rules for experimentation are not enforceable and cannot be enforced because an Experimentation Team lacks the two necessary requirements for any law enforcement agency:</p><ol><li><p>Punishment.</p></li><li><p>Borders.</p></li></ol><p>We do not have a mechanism to penalize people for not following our rules and we have no means of forcing them to run an experiment at all. Teams can simply secede from Experimentation Nation.</p><p>Think about it: How could an Experimentation Team possibly &#8220;block&#8221; direct code changes? How would that even work? It would clearly be a bad thing, in any case, because an Experimentation Team doesn&#8217;t have the information and skillset necessary to do this in a smart way.</p><p>Be humble.</p><p>The essential thing about a good experimentation culture is that people <em>run experiments. </em>Bad experiments are better than no experiments. Get people to run experiments and look at the data. If you show up to the gym everyday, eventually you&#8217;ll lift and get stronger&#8202;&#8212;&#8202;even if you don&#8217;t use the &#8220;best&#8221; workout routine.</p><p>If we try to use rules to create an experimentation culture, we will end up doing one of two things:</p><ol><li><p>We will make the rules so weak that the rules become meaningless, or</p></li><li><p>We will be forced to engage with a significant number of teams about why their individual experiments should not launch despite their desire to do so. We will need to be comfortable being and empowered to be a blocker for them despite us having no direct stake in their product or roadmap and a limited, narrow understanding of the constraints they face. Experimentation will become an obstacle to overcome. <strong>A road block, not a road sign</strong> to know whether we&#8217;re going the right way.</p></li></ol><p>So, we should not make rules or write laws. <strong>We should provide </strong><em><strong>guidance</strong></em><strong> that we make no effort to enforce but significant effort to disseminate.</strong></p><p>Instead of laws, we should write <strong>guidelines</strong>.</p><p>We can make guidelines strong and prescriptive (and, therefore, meaningful and useful) because teams have the option of simply not following them, when they run into an exception&#8202;&#8212;&#8202;or they just don&#8217;t want to.</p><p>The key thing is that they are experimenting. They are looking at the data, making tradeoffs. There is a record of the tradeoffs they made. And they have some advice about what to do.</p><p>The Main Problem is not that teams don&#8217;t use the right standard errors or peek too much. The Main Problem is when things launch without looking at any metrics about what the impact of the product change is, or we only look at pre-post effects where most product impacts are masked by daily demand fluctuations. The Main Problem is when we have no record and no idea of how what we launched this quarter affected our revenue.</p><p>Solve the Main Problem with Culture and make the UI helpful enough that the Secondary Problems aren&#8217;t a big deal. Don&#8217;t let the Secondary Problems get you off-message.</p><p>In real life&#8202;&#8212;&#8202;which, arguably, work is a part of&#8202;&#8212;&#8202;Culture changes Law, not the other way around (see: Uber, LLMs). Carry this over into your thinking about how to make experimentation a larger part of your org&#8217;s decision-making.</p><p>A strong Culture does not need strong Laws.</p><div><hr></div><p>Thanks for reading!</p><p>Zach</p><p>Connect at: <a href="https://linkedin.com/in/zlflynn">https://linkedin.com/in/zlflynn</a></p><p>Check out my Udemy course on Causal Inference!: <a href="https://www.udemy.com/course/identifying-causal-effects-for-data-scientists/?couponCode=A105FEABA0A750B7BB41">https://www.udemy.com/course/identifying-causal-effects-for-data-scientists/?couponCode=A105FEABA0A750B7BB41</a></p><p>If you want my help with any Experimentation, Analytics, etc. problem, click <a href="https://zflynn.com/consulting.html">here</a>.</p>]]></content:encoded></item><item><title><![CDATA[The Residual]]></title><description><![CDATA[Understanding the &#8220;measure of our ignorance.&#8221;]]></description><link>https://underthenull.com/p/the-residual</link><guid isPermaLink="false">https://underthenull.com/p/the-residual</guid><dc:creator><![CDATA[Zach Flynn]]></dc:creator><pubDate>Wed, 24 Sep 2025 07:50:52 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/330e66b8-ede6-4f2b-9b5c-3156decc2458_800x1200.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h4>Understanding the &#8220;measure of our ignorance.&#8221;</h4><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!cIA8!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ee7a59f-0080-444b-9c60-4089242041cc_800x1200.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!cIA8!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ee7a59f-0080-444b-9c60-4089242041cc_800x1200.jpeg 424w, https://substackcdn.com/image/fetch/$s_!cIA8!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ee7a59f-0080-444b-9c60-4089242041cc_800x1200.jpeg 848w, https://substackcdn.com/image/fetch/$s_!cIA8!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ee7a59f-0080-444b-9c60-4089242041cc_800x1200.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!cIA8!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ee7a59f-0080-444b-9c60-4089242041cc_800x1200.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!cIA8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ee7a59f-0080-444b-9c60-4089242041cc_800x1200.jpeg" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2ee7a59f-0080-444b-9c60-4089242041cc_800x1200.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!cIA8!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ee7a59f-0080-444b-9c60-4089242041cc_800x1200.jpeg 424w, https://substackcdn.com/image/fetch/$s_!cIA8!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ee7a59f-0080-444b-9c60-4089242041cc_800x1200.jpeg 848w, https://substackcdn.com/image/fetch/$s_!cIA8!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ee7a59f-0080-444b-9c60-4089242041cc_800x1200.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!cIA8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ee7a59f-0080-444b-9c60-4089242041cc_800x1200.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div></div></div></a><figcaption class="image-caption">Photo by <a href="https://unsplash.com/@melwasthis?utm_source=medium&amp;utm_medium=referral">Mel&#8202;&#8212;</a>&#8202;on&nbsp;<a href="https://unsplash.com?utm_source=medium&amp;utm_medium=referral">Unsplash</a></figcaption></figure></div><p>The equations we estimate in data science, statistics, economics, etc., tend to look something like this:</p><p>Outcome = F(Observables) + Unobservable</p><p>We have a set of observed covariates or features that relate in some way to the outcome, but there&#8217;s another part of the data-generating process that we do not observe.</p><p>We call the unobserved part of the equation a &#8220;residual.&#8221; The name suggests it measures the limits of how well the covariates can predict outcomes. This intuition doesn&#8217;t apply when the equation we&#8217;re estimating is supposed to represent <em>something&#8202;&#8212;&#8202;</em>when the<em> </em>equation is not a merely statistical relationship.</p><p>We can think of outcomes as a function of the choices people make and the states they face, i.e., Y(S, C), where S is the complete vector of states and C is the complete vector of choices. If we observed S and C, we could perfectly explain how Y varies both in a predictive sense <em>and</em> in a causal sense because observing (Y, S, C) and (Y&#8217;, S&#8217;, C&#8217;) would be enough to tell you how moving from (S,C) to (S&#8217;,C&#8217;) changed Y.</p><p>[Causal inference is fundamentally a missing data problem: we don&#8217;t observe all potential outcomes.]</p><p>The problem we face is that our observed covariates are a subset of (S,C), and our <em>residual</em> is an index of the other state and choice variables that we do not observe.</p><p>If we think about residuals this way&#8202;&#8212;&#8202;from first principles&#8202;&#8212;&#8202;it is much easier to think about what the residual <em>is </em>and what identification assumptions make sense. For example: Does it make sense that <em>F</em> and the unobservable states and choices are additively separable?</p><p>When we think about residuals as states and choices, a lot of the &#8220;standard&#8221; assumptions start to sound a little&#8230; less satisfying?</p><p>Why are the observed states and choices treated so asymmetrically from the unobserved states and choices? Why does the fact that we can measure these variables and not those variables change how they enter the data-generating process? Etc.</p><h3>Examples Of The Different Kinds Of Residuals</h3><h4>Prediction Error</h4><p>The name &#8220;residual&#8221; makes the most sense in the regression problem, where we want to estimate E[Y|X=x] for some covariates X, i.e.</p><p>Y = E[Y|X=x] + V, where E[V|X=x] = 0.</p><p>V is the residual in the sense that it represents the part of Y ignored by X. Var[V] = 0 if Y=Y(X), so the residual exists and matters because Y is not a function of X.</p><p>So, our first definition of a residual is the part of the dependent variable we can&#8217;t predict.</p><p>In this model, the relationship of the residual to real-world states and choices is less important because our primary goal is to estimate the statistical object E[Y|X=x].</p><h4>Effect Heterogeneity</h4><p>The residual can also be unobserved heterogeneity in treatment effects. If we run an experiment, we might identify the average treatment effect like so:</p><p>Y(z) = E[Y(z)] + U(z)<br>Y = ZY(1) + (1-Z)Y(0)<br>Y = E[Y(0)]+ (E[Y(1)]&#8202;&#8212;&#8202;E[Y(0)]) Z + U(0) + Z(U(1)&#8202;&#8212;&#8202;U(0))</p><p>Because U(z) are independent of treatment assignment in an experiment: E[U(0) + Z(U(1)-U(0))|Z] = 0,</p><p>So, when we write our regression specification as Y = a + bZ + V, the residual (V) means U(0) + Z[U(1)-U(0)].</p><p>In this particular case, the residual is both the prediction error from regressing Y on Z, <em>and</em> it has a structural interpretation.</p><h4>Structural Residuals</h4><p>Now, suppose we&#8217;re estimating an equation from some theoretical model. Say a production function from economics:</p><p>log Q = log F(Z) + log A,</p><p>Where Q is output, Z is a vector of inputs, and A is total factor productivity.</p><p>We have data on inputs (Z) and output (Q), and we want to estimate this equation to recover the production function and productivity.</p><p>Productivity <em>is</em> a residual. It is the part of the production process that is unobserved, but its meaning comes from the behavioral model, not a statistical criterion.</p><p>The definition of productivity and how to measure it is part of a grand old literature (GOL) spanning more than 80 years. From <a href="https://www.jstor.org/stable/1905432">Marshak and Andrews (1944)</a> to <a href="https://www.jstor.org/stable/2117968?seq=5">Griliches (1994)</a> to some great, recent papers and one okay<a href="https://zflynn.com/papers/pit_zf.pdf"> essay</a>. The one thing the literature agrees about is that productivity is not the error or a residual from regressing outputs on inputs.</p><p>To see why, notice that when Q = F(Z)A, greater productivity increases the marginal product of inputs. Therefore, the choice of inputs will be related to productivity and E[log A|Z]&nbsp;!= E[log A].</p><h3>Why A Careful Model Of The Residual&nbsp;Matters</h3><p>How we identify structural functions or make causal inference depends crucially on how we define the residual: what states and choices are unobserved? For example:</p><ol><li><p>In demand estimation, it&#8217;s common to treat each product as a bundle of product characteristics (to reduce dimensionality) and write something like this: Q = D(P, X, U), where X is a vector of observed product characteristics, and U is unobserved. We can treat U as an index of unobserved product characteristics. A common identification assumption is that U is independent of X. If we don&#8217;t think about the residual as unobserved choices and states, that assumption sounds pretty reasonable. &#8220;Shocks&#8221; sound like the sort of things that are at least roughly uncorrelated with product design decisions. But that&#8217;s not what U is in our model. U is an unobserved product characteristic. Are the product characteristics in X independent of each other? No. So why do we expect them to be independent of unobserved product characteristics?</p></li><li><p>When we write Q = F(Z)A for the production function, how should we think about &#8220;A&#8221;? One model treats A as a <em>parameter,</em> heterogeneity in how the production function translates Z into outputs. But: what <em>is </em>that heterogeneity? It doesn&#8217;t really make sense that some firms or countries can, by their very nature, produce more output. There must be a <em>reason</em>. Whatever that reason is is an unobserved factor of production. So, instead, let&#8217;s think about the residual as an index of unobserved inputs. Z is the vector of observed inputs, and Q is the observed output. What&#8217;s left over are the inputs we don&#8217;t observe. These different models of the residual produce <a href="http://zflynn.com/papers/pit_zf.pdf">different identification strategies</a>.</p></li></ol><div><hr></div><p>Thanks for reading!</p><p>Zach</p><p>Connect at: <a href="https://linkedin.com/in/zlflynn">https://linkedin.com/in/zlflynn</a></p><p>Check out my Udemy course on Causal Inference: <a href="https://www.udemy.com/course/identifying-causal-effects-for-data-scientists/?couponCode=A105FEABA0A750B7BB41">https://www.udemy.com/course/identifying-causal-effects-for-data-scientists/?couponCode=A105FEABA0A750B7BB41</a></p><p>If you want my help with any Experimentation, Analytics, etc. problem, click <a href="https://zflynn.com/consulting.html">here</a>.</p>]]></content:encoded></item><item><title><![CDATA[“It Takes Too Long To Experiment”]]></title><description><![CDATA[But this is wrong!]]></description><link>https://underthenull.com/p/it-takes-too-long-to-experiment</link><guid isPermaLink="false">https://underthenull.com/p/it-takes-too-long-to-experiment</guid><dc:creator><![CDATA[Zach Flynn]]></dc:creator><pubDate>Fri, 05 Sep 2025 07:50:52 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/32584e50-a2fc-46e9-b71f-344b540b2fd4_800x1200.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h4>But this is&nbsp;wrong!</h4><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Gd81!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff1feffe4-0751-4695-beb6-7dccdfc93713_800x1200.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Gd81!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff1feffe4-0751-4695-beb6-7dccdfc93713_800x1200.jpeg 424w, https://substackcdn.com/image/fetch/$s_!Gd81!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff1feffe4-0751-4695-beb6-7dccdfc93713_800x1200.jpeg 848w, https://substackcdn.com/image/fetch/$s_!Gd81!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff1feffe4-0751-4695-beb6-7dccdfc93713_800x1200.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!Gd81!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff1feffe4-0751-4695-beb6-7dccdfc93713_800x1200.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Gd81!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff1feffe4-0751-4695-beb6-7dccdfc93713_800x1200.jpeg" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f1feffe4-0751-4695-beb6-7dccdfc93713_800x1200.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Gd81!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff1feffe4-0751-4695-beb6-7dccdfc93713_800x1200.jpeg 424w, https://substackcdn.com/image/fetch/$s_!Gd81!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff1feffe4-0751-4695-beb6-7dccdfc93713_800x1200.jpeg 848w, https://substackcdn.com/image/fetch/$s_!Gd81!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff1feffe4-0751-4695-beb6-7dccdfc93713_800x1200.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!Gd81!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff1feffe4-0751-4695-beb6-7dccdfc93713_800x1200.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div></div></div></a><figcaption class="image-caption">Photo by <a href="https://unsplash.com/@hb5__?utm_source=medium&amp;utm_medium=referral">Holden Baxter</a> on&nbsp;<a href="https://unsplash.com?utm_source=medium&amp;utm_medium=referral">Unsplash</a></figcaption></figure></div><p>If you&#8217;ve ever worked in an area of data science bordering on experimentation or if you&#8217;ve worked in Product, Marketing, etc., in an environment where experiments are possible, you&#8217;ve probably heard (or even said&#8202;&#8212;&#8202;it&#8217;s okay, this is a safe space) that <em>ideally</em> we&#8217;d run an experiment here, but we need to <strong>&#8220;move fast.&#8221;</strong></p><p>I&#8217;m going to make the case that there isn&#8217;t a tradeoff. Experimentation <strong>maximizes velocity.</strong></p><p>Admittedly, there <em>is</em> a tradeoff between Experimentation and <em>Speed</em>, but <em>Speed is not Velocity!</em></p><p>Speed is how fast you&#8217;re moving, but Velocity has a direction. A sign. A destination you&#8217;re drifting towards.</p><p>If you don&#8217;t care whether you&#8217;re moving in the right direction, then sure, you don&#8217;t need to run experiments&#8202;&#8212;&#8202;or do any other analysis for that matter. Just move.</p><p>That&#8217;s not what we want to do.</p><blockquote><p>&#8220;Never confuse movement for action.&#8221;</p></blockquote><blockquote><p>From a letter Hemingway allegedly wrote to Marlene Dietrich, probably not about A/B testing. Likely a quote of a quote. Unoriginal. An old proverb. A truism. The point is it&#8217;s a saying that I found on the Internet that made the point I wanted to make.</p></blockquote><p>So, what you&#8217;ll hear people propose is: &#8220;let&#8217;s just launch it and <em>see how it looks </em><strong>[as if it were easy!]</strong><em> </em>after a few weeks.&#8221;</p><p>Now, if things go exceptionally well or exceptionally poorly, you probably will be able to just &#8220;see how it looks&#8221;. Sometimes, &#8220;sciency&#8221; folks get a little picky here, but if metrics suddenly jump up or down an enormous amount and stay consistently at those new levels for weeks, and the timing happens to line up with exactly when you launched the thing&#8230;</p><p><strong>But 99.9% of product changes (conservatively) are not like this.</strong> They slightly improve conversion rates. They don&#8217;t cause massive jumps in time series. Product improvements shift company metrics by less than their normal day-to-day variation. For example, here is a made-up time series where there is a 2% average improvement in the metric at some point. That&#8217;s a big win! Can you spot the improvement in the series?</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!CU2L!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a2fa899-cae8-4cde-8bd6-afd08791df98_480x480.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!CU2L!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a2fa899-cae8-4cde-8bd6-afd08791df98_480x480.png 424w, https://substackcdn.com/image/fetch/$s_!CU2L!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a2fa899-cae8-4cde-8bd6-afd08791df98_480x480.png 848w, https://substackcdn.com/image/fetch/$s_!CU2L!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a2fa899-cae8-4cde-8bd6-afd08791df98_480x480.png 1272w, https://substackcdn.com/image/fetch/$s_!CU2L!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a2fa899-cae8-4cde-8bd6-afd08791df98_480x480.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!CU2L!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a2fa899-cae8-4cde-8bd6-afd08791df98_480x480.png" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6a2fa899-cae8-4cde-8bd6-afd08791df98_480x480.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!CU2L!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a2fa899-cae8-4cde-8bd6-afd08791df98_480x480.png 424w, https://substackcdn.com/image/fetch/$s_!CU2L!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a2fa899-cae8-4cde-8bd6-afd08791df98_480x480.png 848w, https://substackcdn.com/image/fetch/$s_!CU2L!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a2fa899-cae8-4cde-8bd6-afd08791df98_480x480.png 1272w, https://substackcdn.com/image/fetch/$s_!CU2L!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a2fa899-cae8-4cde-8bd6-afd08791df98_480x480.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption">There is a two-percent increase in the average value of this series at some point, but it&#8217;s invisible to both the naked eye and analysis. It gets swallowed up by the large daily variation.</figcaption></figure></div><p>Another issue with analyzing just the time series: companies make many product and marketing changes <a href="https://medium.com/good-enough-statistics/does-it-matter-that-online-experiments-interact-9c4012b75fbd">at the same time</a>, so how are we going to distinguish which change is responsible for improving metrics, and which is holding us back?</p><p>So, what&#8217;s the alternative to running an experiment if:</p><ol><li><p>We&#8217;re maximizing velocity, not speed. We want to know that we&#8217;re moving in the right direction.</p></li><li><p>We&#8217;re not massively altering our product. So, we&#8217;re not expecting metric movements of +/- 20%.</p></li><li><p>We&#8217;re changing many product features at the same time.</p></li></ol><p>The obvious candidate is a causal inference method based on observational data, but let&#8217;s think about how that would work in practice.</p><p>While there&#8217;s an enormous variety of causal inference methods (learn some of them in my <a href="https://www.udemy.com/course/identifying-causal-effects-for-data-scientists/?couponCode=A105FEABA0A750B7BB41">Udemy course</a>&#8202;&#8212;&#8202;look, I&#8217;m learning how to plug things!), they all share a similar structure:</p><ol><li><p>There is a time before customers were treated with the new experience, and we&#8217;ll assume we can use that to establish a baseline for the treated population.</p></li><li><p>There is a set of customers who do <em>not</em> receive the experience at any time, so we can use changes in their experience over time to differentiate between changes from all the other things going on at the company&#8202;&#8212;&#8202;or in the broader economy/industry&#8212; from the actual product change.</p></li></ol><p>So, it&#8217;s just another method of holding some people out of treatment&#8202;&#8212;&#8202;except that the resulting analysis is much less credible and depends on a bevy of assumptions. We have to wait to see results anyway. If the results look bad, there&#8217;s always a discussion of whether it&#8217;s really bad or if the method is bad&#8230;</p><p>Why bother, if you have the choice? Go with the finest and loveliest method, the original. The experiment doesn&#8217;t have to be 50&#8211;50, A vs B. Even a small &#8220;A&#8221; group protects against the worst outcomes, which are always more likely than you think.</p><p>Another way to think about it: why would the best allocation for the control group be 0%? Why not something else, just a little more?</p><div><hr></div><p>Thanks for reading!</p><p>Zach</p><p>Connect at: <a href="https://linkedin.com/in/zlflynn">https://linkedin.com/in/zlflynn</a></p><p>Check out my Udemy course on causal inference: <a href="https://www.udemy.com/course/identifying-causal-effects-for-data-scientists/?couponCode=A105FEABA0A750B7BB41">https://www.udemy.com/course/identifying-causal-effects-for-data-scientists/?couponCode=A105FEABA0A750B7BB41</a></p><p>If you want my help with any Experimentation, Analytics, etc. problem, click <a href="https://zflynn.com/consulting.html">here</a>.</p>]]></content:encoded></item><item><title><![CDATA[Medium and Substack]]></title><description><![CDATA[Re: the Medium blog comparing the two]]></description><link>https://underthenull.com/p/medium-and-substack</link><guid isPermaLink="false">https://underthenull.com/p/medium-and-substack</guid><dc:creator><![CDATA[Zach Flynn]]></dc:creator><pubDate>Fri, 11 Jul 2025 07:50:52 GMT</pubDate><enclosure url="https://cdn-images-1.medium.com/max/800/0*8GvjjtIRY7AHqj85" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h4>Re: the Medium blog comparing the&nbsp;two</h4><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!1AyU!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F603ad807-45ed-4477-80fd-d82777030bb1_800x554.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!1AyU!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F603ad807-45ed-4477-80fd-d82777030bb1_800x554.jpeg 424w, https://substackcdn.com/image/fetch/$s_!1AyU!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F603ad807-45ed-4477-80fd-d82777030bb1_800x554.jpeg 848w, https://substackcdn.com/image/fetch/$s_!1AyU!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F603ad807-45ed-4477-80fd-d82777030bb1_800x554.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!1AyU!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F603ad807-45ed-4477-80fd-d82777030bb1_800x554.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!1AyU!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F603ad807-45ed-4477-80fd-d82777030bb1_800x554.jpeg" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/603ad807-45ed-4477-80fd-d82777030bb1_800x554.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!1AyU!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F603ad807-45ed-4477-80fd-d82777030bb1_800x554.jpeg 424w, https://substackcdn.com/image/fetch/$s_!1AyU!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F603ad807-45ed-4477-80fd-d82777030bb1_800x554.jpeg 848w, https://substackcdn.com/image/fetch/$s_!1AyU!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F603ad807-45ed-4477-80fd-d82777030bb1_800x554.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!1AyU!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F603ad807-45ed-4477-80fd-d82777030bb1_800x554.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div></div></div></a><figcaption class="image-caption">Photo by <a href="https://unsplash.com/@fridalannerstrom?utm_source=medium&amp;utm_medium=referral">Frida Lannerstr&#246;m</a> on&nbsp;<a href="https://unsplash.com?utm_source=medium&amp;utm_medium=referral">Unsplash</a></figcaption></figure></div><p>Medium recently <a href="https://medium.com/blog/medium-versus-substack-six-reasons-writers-pick-medium-4c27b0501669">published</a> an argument for why writers without a large external audience should pick Medium over Substack. I fall into the &#8220;limited external audience&#8221; category, and I&#8217;m but a wee little blog, so I thought I&#8217;d write up my take on it.</p><p>It&#8217;s comfortably outside the blog&#8217;s normal focus on economics and statistics, but I&#8217;m a card-carrying member of the economics cult. So, I have to shoehorn it into everything.</p><p><em>Clearly</em>, by revealed preference (see? I did it already), I agree with the conclusion of the post. I&#8217;m writing this on Medium.</p><p>But there&#8217;s one part of the post that people who start writing here should at least know is unlikely to hold true for them.</p><h4>Re: &#8220;Write on Medium if you don&#8217;t have an existing audience&#8221;</h4><p>I disagree with the post&#8217;s suggestion that you can just start writing on Medium and people will read it, i.e., that discovery on Medium will get you reads, even without an audience or trying to promote the blog.</p><p>Discovery on Medium is a multiplier. If you get a sufficient number of reads from some other source, then you&#8217;ll start getting discovery on top of what you can bring in&#8202;&#8212;&#8202;which is great!&#8202;&#8212;&#8202;but it&#8217;s not like you can hit publish and get any real exposure.</p><p>I&#8217;d prefer data from more diverse sources, but I only have one dataset to go off of: my own. And, as always, you go to the Data War with the Data Army you have.</p><p>I&#8217;ve written a couple blogs that I didn&#8217;t share on my <a href="https://linkedin.com/in/zlflynn">LinkedIn</a> for whatever reason. The total reads from those blogs are less than 20&#8202;&#8212;&#8202;cumulative. One of the posts was in January 2025 where I had about 2300 reads in total. Maybe that gives a sense of how little action you&#8217;ll get on a post unless you have some alternative way of telling people about it.</p><p>Most of the great blogs on Medium I&#8217;ve found via LinkedIn posts, not on-site discovery.</p><p>[I think part of this is caused by Medium having these omnibus publications with limited editorial input. It&#8217;s the natural outcome of the market, of course. Getting more blogs improves the publication&#8217;s chances, and there&#8217;s basically no downside to including a weak blog in the pub. These posts flood the discovery feeds, and you can&#8217;t follow a pub for its good posts without getting spammed by its bad posts. Publications with editorial input could solve this problem by providing more of a filter&#8202;&#8212;&#8202;and a meaningful stamp of approval&#8202;&#8212;&#8202;but that&#8217;s not what the product encourages.]</p><p>You aren&#8217;t going to get readers from Medium&#8217;s discovery without first getting a seed amount of readers from elsewhere [probably? There&#8217;s one of everything]. So, I don&#8217;t think this is a great reason to choose Medium over Substack. You have to acquire the audience either way, and Substack also has discovery mechanisms.</p><h4>So, why do you use&nbsp;Medium?</h4><p>It has a nice, easy &#8220;follow&#8221; button for people to get notifications about my new posts. People don&#8217;t have to click a lot of buttons or give extra info. They can just follow. Substack feels more like I&#8217;m being moved through a conversion funnel. There are buttons saying &#8220;Subscribe now!&#8221;, e-mail addresses to enter, etc.</p><p>I don&#8217;t want to &#8220;monetize.&#8221; I want an experience that minimizes the friction to reading. So, I don&#8217;t want landing pages covering the post asking for e-mails, etc.</p><p>(My take: Direct monetization is a silly strategy for blogs about career stuff. Any direct money you might earn will be minuscule compared to the Right People seeing the post. You want to maximize the probability they see it, not try to make a hundred dollars by paywalling it.)</p><p>The SEO is strong if a post does well, too. I only have one post that&#8217;s done well enough to get picked up by search engines&#8202;&#8212;&#8202;<a href="https://goodenoughstatistics.com/in-defense-of-statistical-significance-996e8c62f3e8">In Defense of Statistical Significance</a>&#8202;&#8212;&#8202;but that&#8217;s kind of neat to see.</p><p>It&#8217;s an easy writing experience. A couple clicks to get a landing photo from Unsplash. Simple to use. I don&#8217;t have to set anything up to start writing. People can comment easily. What&#8217;s not to like?</p><h4>Ads</h4><p>Of course, I know nothing about Medium&#8217;s traffic patterns to have a sense of whether it has the scale to work business-wise, but will that stop me from commenting on its business strategy? This is the Internet. Of course not. I don&#8217;t need &#8220;data&#8221; to drop a hot take.</p><p>On Medium I&#8217;d prefer the ads model, I think, without any direct monetization for bloggers. I think the vision the CEO put forward in this <a href="https://medium.com/the-coach-life/fell-in-a-hole-got-out-381356ec8d7f">post</a> is a good one: Making a site for people who aren&#8217;t &#8220;content creators.&#8221;</p><p>People who aren&#8217;t [aspiring] &#8220;content creators&#8221; aren&#8217;t looking to make money from writing blogs.</p><p>(I&#8217;m never going to stop scare-quoting that phrase&#8202;&#8212;&#8202;&#8220;content creator&#8221;&#8202;&#8212;&#8202;because it sounds alien&#8202;&#8212;&#8202;bizarre. A person makes a series of images shown in rapid succession to imitate movement, but we&#8217;re too embarrassed to call it a movie, a film, or a flick. So, we searched for a word to describe the Thing, and found one neutral, bland, and beige enough that it can refer to what&#8217;s inside a cardboard box, my stomach, and <em>For Whom the Bell Tolls.</em>).</p><p>So long as the revenue is via Premium subscriptions (I&#8217;m a subscriber!), there has to be a reason to make Premium posts, so you have to pay bloggers, and you&#8217;ll get the &#8220;hustle&#8221; types that try to hack Medium&#8217;s algo in some way to make a little dough. So, I think it&#8217;d be neat to move away from that.</p><h4>In Conclusion&#8230;</h4><p>Anyway, that&#8217;s my take. It&#8217;s definitely outside the normal topics I write about. There wasn&#8217;t a single equation!</p><p>But, as the post said, Medium is a good place to write outside your niche. I&#8217;m proving out the theory.</p><div><hr></div><p>Thanks for reading!</p><p>Zach</p><p>Connect at: <a href="https://linkedin.com/in/zlflynn">https://linkedin.com/in/zlflynn</a></p><p>My little Udemy course on Causal Inference: <a href="https://www.udemy.com/course/identifying-causal-effects-for-data-scientists/?couponCode=CHEAPCAUSALINF3">https://www.udemy.com/course/identifying-causal-effects-for-data-scientists/?couponCode=CHEAPCAUSALINF3</a></p><p>If you want my help with any Experimentation, Analytics, etc. problem, click <a href="https://zflynn.com/consulting.html">here</a>.</p>]]></content:encoded></item><item><title><![CDATA[Experimentation is a reasonable tax.]]></title><description><![CDATA[Experimentation helps us reach a socially efficient equilibrium in an understudied market.]]></description><link>https://underthenull.com/p/experimentation-is-a-reasonable-tax</link><guid isPermaLink="false">https://underthenull.com/p/experimentation-is-a-reasonable-tax</guid><dc:creator><![CDATA[Zach Flynn]]></dc:creator><pubDate>Tue, 01 Jul 2025 07:50:52 GMT</pubDate><enclosure url="https://cdn-images-1.medium.com/max/800/0*br_Bw7_ZOUE4pnwL" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h4>Experimentation helps us reach a socially efficient equilibrium in an understudied market.</h4><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://cdn-images-1.medium.com/max/800/0*br_Bw7_ZOUE4pnwL" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://cdn-images-1.medium.com/max/800/0*br_Bw7_ZOUE4pnwL 424w, https://cdn-images-1.medium.com/max/800/0*br_Bw7_ZOUE4pnwL 848w, https://cdn-images-1.medium.com/max/800/0*br_Bw7_ZOUE4pnwL 1272w, https://cdn-images-1.medium.com/max/800/0*br_Bw7_ZOUE4pnwL 1456w" sizes="100vw"><img src="https://cdn-images-1.medium.com/max/800/0*br_Bw7_ZOUE4pnwL" data-attrs="{&quot;src&quot;:&quot;https://cdn-images-1.medium.com/max/800/0*br_Bw7_ZOUE4pnwL&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://cdn-images-1.medium.com/max/800/0*br_Bw7_ZOUE4pnwL 424w, https://cdn-images-1.medium.com/max/800/0*br_Bw7_ZOUE4pnwL 848w, https://cdn-images-1.medium.com/max/800/0*br_Bw7_ZOUE4pnwL 1272w, https://cdn-images-1.medium.com/max/800/0*br_Bw7_ZOUE4pnwL 1456w" sizes="100vw" fetchpriority="high"></picture><div></div></div></a><figcaption class="image-caption">Photo by <a href="https://unsplash.com/@quaritsch?utm_source=medium&amp;utm_medium=referral">Quaritsch Photography</a> on&nbsp;<a href="https://unsplash.com?utm_source=medium&amp;utm_medium=referral">Unsplash</a></figcaption></figure></div><p>Bullshit producers produce their output at near zero marginal cost, but the social costs of bullshit are far greater. Some folks will hear the bullshit and believe it is true&#8202;&#8212;&#8202;perhaps supposing that people must be saying it for a reason besides vibes and hunches (the primary inputs to the bullshit production process). It&#8217;s impossible to look into everything you hear, so an oversupply of bullshit increases the probability that we make the wrong decision by inadvertendly &#8220;buying&#8221; the bullshit.</p><p>The key market failure that leads to an oversupply of bullshit is that the costs of dealing with bullshit fall almost entirely on economic agents that did not produce the bullshit. So, what we need to do to make the market efficient is to lower the costs of countering/dealing with bullshit and increase the costs of producing it.</p><p>Experimentation does a little of both. It provides data to refute bullshit, subsidizing the countering process, and it increases the costs to saying bullshit because someone might just run an experiment and show that the claim is bullshit.</p><p><strong>VERY IMPORTANT: THE EFFICIENT LEVEL OF BULLSHIT IS NOT ZERO.</strong></p><p>Some bullshit is socially valuable. For example, you have a hunch that something might work. It&#8217;s not based on anything but vibes, but you just want to test it out. It&#8217;s bullshit, right? Well, sometimes these ideas end up working out because vibes are sort of data&#8230; The point is that there&#8217;s a good level of bullshit. We need to take risks and not just wait until we can &#8220;prove&#8221; everything. That means allowing for a little bullshit.</p><p>I&#8217;ve yet to find a more efficient tax/subsidy scheme than Experimentation for approximating the socially efficient equilibrium supply of bullshit. It doesn&#8217;t overtax it to the point that no one&#8217;s willing to just &#8220;try things&#8221; or speculate, but it has enough of a tax to control the flow&#8230;</p><div><hr></div><p>Thanks for reading!</p><p>Zach</p><p>Connect at: <a href="https://linkedin.com/in/zlflynn">https://linkedin.com/in/zlflynn</a></p><p>Check out my Udemy course on causal inference: <a href="https://www.udemy.com/course/identifying-causal-effects-for-data-scientists/?couponCode=CHEAPCAUSALINF3">https://www.udemy.com/course/identifying-causal-effects-for-data-scientists/?couponCode=CHEAPCAUSALINF3</a></p><p>If you want my help with any Experimentation, Analytics, etc. problem, click <a href="https://zflynn.com/consulting.html">here</a>.</p>]]></content:encoded></item><item><title><![CDATA[Combining Structural Models And Causal Inference Methods]]></title><description><![CDATA[How to &#8220;localize&#8221; structural models]]></description><link>https://underthenull.com/p/combining-structural-models-and-causal-inference-methods</link><guid isPermaLink="false">https://underthenull.com/p/combining-structural-models-and-causal-inference-methods</guid><dc:creator><![CDATA[Zach Flynn]]></dc:creator><pubDate>Fri, 27 Jun 2025 07:50:51 GMT</pubDate><enclosure url="https://cdn-images-1.medium.com/max/800/0*Qrfv2rCdnoSeYH28" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h4>How to &#8220;localize&#8221; structural models</h4><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://cdn-images-1.medium.com/max/800/0*Qrfv2rCdnoSeYH28" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://cdn-images-1.medium.com/max/800/0*Qrfv2rCdnoSeYH28 424w, https://cdn-images-1.medium.com/max/800/0*Qrfv2rCdnoSeYH28 848w, https://cdn-images-1.medium.com/max/800/0*Qrfv2rCdnoSeYH28 1272w, https://cdn-images-1.medium.com/max/800/0*Qrfv2rCdnoSeYH28 1456w" sizes="100vw"><img src="https://cdn-images-1.medium.com/max/800/0*Qrfv2rCdnoSeYH28" data-attrs="{&quot;src&quot;:&quot;https://cdn-images-1.medium.com/max/800/0*Qrfv2rCdnoSeYH28&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://cdn-images-1.medium.com/max/800/0*Qrfv2rCdnoSeYH28 424w, https://cdn-images-1.medium.com/max/800/0*Qrfv2rCdnoSeYH28 848w, https://cdn-images-1.medium.com/max/800/0*Qrfv2rCdnoSeYH28 1272w, https://cdn-images-1.medium.com/max/800/0*Qrfv2rCdnoSeYH28 1456w" sizes="100vw" fetchpriority="high"></picture><div></div></div></a><figcaption class="image-caption">Photo by <a href="https://unsplash.com/@taylorsiebert?utm_source=medium&amp;utm_medium=referral">Taylor Siebert</a> on&nbsp;<a href="https://unsplash.com?utm_source=medium&amp;utm_medium=referral">Unsplash</a></figcaption></figure></div><p>Causal inference methods focus on the &#8220;effect&#8221; on metrics and other high-level outcomes, but we need a model to translate treatment effects into a decision.</p><p>Structural econometric methods help us make decisions because they fully specify the economic nature of the decisions we&#8217;re making. This blog post shows how to combine these two approaches to make decisions grounded in both economic theory and data.</p><p>For example, if we know the causal effect of a price increase on demand for a product, that&#8217;s useful information, but it doesn&#8217;t&#8202;&#8212;&#8202;by itself&#8202;&#8212;&#8202;tell us what price we should charge. We need a model to turn that treatment effect into a decision.</p><p>If our cost of providing our products is roughly zero&#8202;&#8212;&#8202;we&#8217;re making websites, selling SaaS&#8202;&#8212;&#8202;then maybe we want to maximize revenue:</p><p>max P&#8217;Q(P)</p><p>Now we&#8217;re working in the space of structural parameters, the economic primitives. The next step is to link these to treatment effects.</p><p>The revenue-maximizing price solves:</p><p>DQ(P) P + Q(P) = 0</p><p>DQ(P) is the derivative of demand with respect to price, which maps onto the more causal inference problem of getting the treatment effect of shifting price on quantity, allowing us to translate treatment effects into pricing decisions.</p><p>We always put treatment effects through a model to make decisions. Whether we use an explicit economic model or not, we have some model in mind when we say that it&#8217;s a &#8220;good thing&#8221; to increase this metric and hurt that other metric. What structural methods do is make those assumptions explicit and ground those assumptions in economic theory.</p><p>But there is a downside to structural methods as they&#8217;re frequently used in the academic literature.</p><p>A common approach you&#8217;ll see:</p><ol><li><p>Estimate a demand function Q(P) that we can evaluate at any price, given some functional form assumption.</p></li><li><p>Then, solve the first-order conditions DQ(P)P + Q(P) = 0 explicitly, which involves evaluating the demand function globally, at prices far from those in the data.</p></li></ol><p>Hot take: this analysis is not credible enough for making business decisions at the accuracy level we need. The further we move from prices we have seen in the data, the less we&#8217;re using data to inform pricing (or other) decisions, and the more we&#8217;re relying on arbitrary functional form assumptions.</p><p>Anyone who&#8217;s tried the above approach in the wild has seen the model suggest wild prices that end up (rightly) ignored by stakeholders as unreasonable.</p><p>The trick to marrying more credible causal inference methods and structural methods is to use structural methods that can make use of local results&#8202;&#8212;&#8202;use methods that don&#8217;t rely on identifying the structural function globally.</p><p>Instead of trying to solve DQ(P)P + Q(P) = 0, instead recognize that DQ(P)P + Q(P) gives the marginal change in revenue for a small price change for each product. So we can &#8220;localize&#8221; the revenue maximization problem by doing something like the following:</p><ol><li><p>Estimate the demand function at <em>current prices </em>Q(P) by using various causal inference methods&#8202;&#8212;&#8202;or experimentation, if feasible. This is more credible because we don&#8217;t need to try to map out the full demand function. We just need to measure the impact of increasing prices a little relative to current prices, i.e., estimate treatment effects.</p></li><li><p>Then, compute F = DQ(P) P + Q(P) at current prices.</p></li><li><p>If F(j) &gt; 0, increase the price P(j) a little bit. If F(j) &lt; 0, decrease the price P(j) a little bit. In practice, because F is estimated, it makes sense to add other restrictions, like: &#8220;we&#8217;ll only change prices if |F(j)| &gt; e&#8221;.</p></li><li><p>Periodically re-run the analysis to update the demand function now evaluated at the new prices, and then we march towards the optimal prices.</p></li></ol><p>So, we can combine more credible causal inference methods with economic models to help us make decisions that are both informed by economic theory and don&#8217;t overly rely on arbitrary functional form or other modeling decisions.</p><p>The key is to <em>localize</em> the structural model, using either the first-order method above or constraining decisions to lie within a tight neighborhood around the status quo.</p><p>Over time, we&#8217;ll move further and further from the initial status quo as we gather more evidence about other parts of the decision space.</p><p>And that&#8217;s it. A pragmatic way to use structural economic models and causal inference methods together.</p><div><hr></div><p>Thanks for reading!</p><p>Zach</p><p>Connect at: <a href="https://linkedin.com/in/zlflynn">https://linkedin.com/in/zlflynn</a></p><p>Take my little Udemy course (on causal inference methods) at: <a href="https://www.udemy.com/course/identifying-causal-effects-for-data-scientists/?couponCode=CHEAPCAUSALINF3">https://www.udemy.com/course/identifying-causal-effects-for-data-scientists/?couponCode=CHEAPCAUSALINF3</a></p><p>If you want my help with any Experimentation, Analytics, etc. problem, click <a href="https://zflynn.com/consulting.html">here</a>.</p>]]></content:encoded></item></channel></rss>