【因果推断python】54_效应异质性和非线性带来的挑战2

目录

Continues Treatment and Non Linearity

Key Concepts


Continues Treatment and Non Linearity

我们只是深入探讨了二元结果增加异质性治疗效果分析难度的一个例子。但这种现象并不局限于市场营销中的转换问题。例如,2021 年,全球成功向公众提供了第一批获批的 COVID19 疫苗。当时,一个关键问题是谁应该先接种疫苗。毫不奇怪,这是一个 "异质性治疗效果"(Heterogeneous Treatment Effect)问题。政策制定者希望让那些受益最大的人先接种疫苗。在这种情况下,治疗效果就是避免死亡或住院。那么,谁的死亡或住院人数在接种疫苗后减少最多呢?在大多数国家,他们都是老年人和有健康问题(合并症)的人。现在,这些人在注射 COVID19 后更容易死亡。值得庆幸的是,COVID 的死亡率远低于 50%,这使我们处于 Logistic 函数的左侧。在这一区域,根据我们为市场营销所做的相同论证,治疗那些在感染 COVID19 后死亡概率较高的人群是有意义的,而这些人群正是我们之前提到的群体。这是巧合吗?也许吧。请记住,我不是健康专家,所以我可能错得离谱。但我觉得这个逻辑很有道理。

在这两种情况下,即市场推广和 COVID19 疫苗,治疗效果异质性的关键复杂因素是结果函数 Y 的非线性。这种非线性使我们在从 Y0 到 Y1 的过程中,结果的增加主要是由于结果函数的弯曲。我们已经看到二元结果是如何发生的,在二元结果中,E[Y|X] 呈对数形状。但这种情况更为普遍。事实上,这是一个在商业中不断出现的问题,尤其是在治疗是连续变量的情况下。让我们通过最后一个例子来更清楚地说明这一观点。

让我们考虑一下经典的定价问题。你在一家流媒体公司工作,比如 Netflix 或 HBO。公司希望回答的一个关键问题是向客户收取多少价格。为了回答这个问题,他们做了一个实验,随机将客户分配到不同价格的交易中: 5巴西雷亚尔/月、10巴西雷亚尔/月、15巴西雷亚尔/月或20巴西雷亚尔/月。通过这种方法,他们希望不仅能回答客户对价格上涨的敏感程度,还能回答某些类型的客户是否比其他客户更敏感。在下图中,您可以看到按两个客户群细分的实验结果: A,估计收入较高的客户;B,估计收入较低的客户。

data = pd.DataFrame(dict(
    segment= ["b", "b", "b", "b",  "a", "a", "a", "a",],
    price=[5, 10, 15, 20, ] * 2,
    sales=[5100, 5000, 4500, 3000,  5350, 5300, 5000, 4500]
))

plt.figure(figsize=(8,4))
sns.lineplot(data=data, x="price", y="sales", hue="segment")
plt.title("Avg. Sales by Price (%) by Customer Segment");

公司希望通过这些数据回答以下问题:谁对折扣更敏感?换句话说,如何根据客户对价格的敏感度(销售价格弹性)对他们进行排序?通过观察曲线,我们可以感觉到,A 市场虽然收入较高,但总体上对折扣的敏感度较低。不过,我们也可以看到曲线存在一定的弯曲。事实上,如果我们考虑到这种曲率,那么处理效果的排序就不再只是 A 和 B 客户之间的排序了。治疗效果还取决于他们在治疗曲线中所处的位置。例如,对 A 组客户来说,从 15 BRL 降至 10 BRL 的治疗效果要高于对 B 组客户来说,从 5 BRL 降至 10 BRL 的治疗效果:

E[Y(10)-Y(5)|Seg=B]<E[Y(15)-Y(10)|Seg=A]

如果我们对该实验的治疗效果进行排序,结果会是这样的:

plt.figure(figsize=(8,4))
sns.lineplot(data=data, x="price", y="sales", hue="segment")

plt.annotate("1", (8, 5350), bbox=dict(boxstyle="round", fc="1"))
plt.annotate("2", (8, 5000), bbox=dict(boxstyle="round", fc="1"))
plt.annotate("3", (13, 5100), bbox=dict(boxstyle="round", fc="1"))
plt.annotate("4", (13, 4700), bbox=dict(boxstyle="round", fc="1"))
plt.annotate("4", (17, 4800), bbox=dict(boxstyle="round", fc="1"))
plt.annotate("5", (17, 3900), bbox=dict(boxstyle="round", fc="1"))

plt.title("Ordering of the Effect of Increasing Price");

现在,如果你天真地将治疗效果的结果汇总起来,看起来 A 部分比 B 部分对价格上涨的弹性要大得多(绝对治疗效果更高)。

那么,当治疗效果因治疗方法和治疗结果的不同而发生变化时,该怎么办呢?老实说,这仍是一个活跃的研究领域。在实践中,你能做的最好的事情就是在试图回答哪类客户对治疗更敏感时非常小心。确保所比较的客户类型都有相同的待遇分布。如果不是,则要对推断治疗效果持怀疑态度。例如,在上面的例子中,尽管客户 B 看起来对价格上涨不那么敏感,但你不知道如果你给这个细分市场分配超过 10BRL 的更高价格,情况是否还会如此。

另一种方法是将响应曲线线性化。这里的想法是通过转换治疗方法或结果(或两者)来消除曲率,使它们之间的关系看起来像一条线。由于直线具有恒定的导数,因此可以解决治疗效果随曲线所处位置而变化的问题。举例来说,如果我们将价格变量转化为负数,再将其指数化为 4,然后反转符号,我们就会得到某种线性关系。在这种转换后的数据中,"A 对价格上涨的敏感度低于 B "的说法就更有意义了,因为它现在不取决于我们在曲线上所处的位置。

plt.figure(figsize=(8,4))
sns.lineplot(data=data.assign(price = lambda d: -1*(-d["price"]**4)),
             x="price", y="sales", hue="segment")
plt.title("Avg. Sales by -(-price^4)");

然而,这种方法有许多缺点。首先,它并不总能使曲线线性化。在我们的例子中,你可以清楚地看到这种线性化并不完美。但更重要的是,有时舍弃曲线并没有商业意义。在我们的定价示例中,我们很可能认为价格为 15 的客户 A 比价格为 5 的客户 B 更敏感。这将使我们做出一个正确的决定,即把客户 A 的价格从 15 降到 10,但不对客户 B 的价格做任何调整。

Key Concepts

我意识到我带来的问题可能比答案更多,但有时我们能做的最好的事情就是非常清楚地意识到这个问题。在本章中,我希望能让大家看到,当我们关心的结果是非线性的时候,会出现哪些复杂情况。

这是二元结果中常见的问题,也是研究较多的问题。在这种情况下,治疗效果往往越接近平均结果 0.5 就越高。由于结果在 0 和 1 之间是有界限的,如果我们过于接近 0 或 1,效果往往会非常小。

在结果连续的情况下,非线性因素的影响会变得更加复杂。在这种情况下,您所能做的就是仔细思考问题。试着回答你是否更关心治疗效果而不考虑治疗基线,或者基线是否重要。只有这一点才是有价值的指导原则。

  • 15
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

水木流年追梦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值