匹配后的标准化差异分数 - 包之间的差异
Standardized Difference Scores after Matching - Discrepancy between packages
我正在使用 R 中的 MatchIt 程序包进行课程精确匹配。当我完成匹配并使用钴检查余额时,我被告知 Diff.Adj 对于我的分类变量是 0.00,对于连续变量是 -0.06。
但是,当我随后在 gtsummary 中创建一个 table 时,这些变量的标准化差异分数对于分类变量是 0.65,对于连续变量是 0.30。
谁能解释一下这两个包之间的差异?
在 gtsummary 中,我将 table 传送到 add_difference(everything() ~ "smd")
。
您观察到的差异可能有多种原因。鉴于您没有提供最小的可重现示例或任何输出,我们只能推测。我是 MatchIt
和 cobalt
的作者,所以我可以解释那里的选择(相同)以及我如何证明它们的合理性。
对于连续变量,匹配后的 SMD 是均值之差(由匹配权重加权)除以原始样本中计算的比例因子。我已经证明了在原始样本 here and elsewhere. The standardization factor depends on the chosen target population, but it can be changed by supplying an argument to s.d.denom
. By default, when matching for the ATT is used (the default in MatchIt
), the standardization factor is the standard deviation of the variable in the treated group (again, computed prior to matching). When matching for the ATE, the standardization factor is the square root of the average of the variances in the treatment groups. The defaults and allowable arguments are explained in help("col_w_smd")
.
中计算标准化因子的选择
对于分类变量,cobalt
首先将它们拆分为每个类别的虚拟变量,然后将虚拟变量视为自变量。默认情况下,cobalt::bal.tab()
为二进制和分类变量生成 un 标准化均值差(即比例的原始差异)。如果要标准化均值差,需要设置binary = "std"
。我在 documentation why I think standardized mean differences don't make sense for binary variables. cobalt
uses a special formula 中解释了二进制变量的方差(smd
也是如此),因此在尝试手动复制 cobalt
的结果时一定要考虑到这一点。
我不确定 smd
(gtsummary()
中计算的基础)到底是做什么的,因为它的文档有点稀疏而且它的代码(使用 R6 架构)很难供我阅读(不过,无可否认,cobalt
也是如此)。似乎 smd
在提供匹配权重(或仅向其提供匹配样本)时计算匹配样本中的标准化因子,并且它始终将标准化因子计算为方差平均值的平方根在治疗组中。对于分类变量,它使用 Yang & Dalton (2012) rather than splitting the variable into separate dummy variables. I explain here 为什么我认为这不是一个好主意中描述的公式计算整个变量的单个标准化均值差。
希望这能阐明这些差异。我鼓励您使用 cobalt
而不是 gtsummary()
来生成余额表,因为选择这些设置需要进行大量研究。在我看来,它们代表了最佳实践。 cobalt
还使您可以灵活地提供自己的选择(如果您不同意),但通过自己做出这些选择,您可以准确了解每个值的计算方式。我还努力确保 cobalt
被完整地记录下来,以帮助用户准确理解正在发生的事情。我描述的关于 cobalt
功能的所有内容都在文档中进行了解释。
我正在使用 R 中的 MatchIt 程序包进行课程精确匹配。当我完成匹配并使用钴检查余额时,我被告知 Diff.Adj 对于我的分类变量是 0.00,对于连续变量是 -0.06。
但是,当我随后在 gtsummary 中创建一个 table 时,这些变量的标准化差异分数对于分类变量是 0.65,对于连续变量是 0.30。
谁能解释一下这两个包之间的差异?
在 gtsummary 中,我将 table 传送到 add_difference(everything() ~ "smd")
。
您观察到的差异可能有多种原因。鉴于您没有提供最小的可重现示例或任何输出,我们只能推测。我是 MatchIt
和 cobalt
的作者,所以我可以解释那里的选择(相同)以及我如何证明它们的合理性。
对于连续变量,匹配后的 SMD 是均值之差(由匹配权重加权)除以原始样本中计算的比例因子。我已经证明了在原始样本 here and elsewhere. The standardization factor depends on the chosen target population, but it can be changed by supplying an argument to s.d.denom
. By default, when matching for the ATT is used (the default in MatchIt
), the standardization factor is the standard deviation of the variable in the treated group (again, computed prior to matching). When matching for the ATE, the standardization factor is the square root of the average of the variances in the treatment groups. The defaults and allowable arguments are explained in help("col_w_smd")
.
对于分类变量,cobalt
首先将它们拆分为每个类别的虚拟变量,然后将虚拟变量视为自变量。默认情况下,cobalt::bal.tab()
为二进制和分类变量生成 un 标准化均值差(即比例的原始差异)。如果要标准化均值差,需要设置binary = "std"
。我在 documentation why I think standardized mean differences don't make sense for binary variables. cobalt
uses a special formula 中解释了二进制变量的方差(smd
也是如此),因此在尝试手动复制 cobalt
的结果时一定要考虑到这一点。
我不确定 smd
(gtsummary()
中计算的基础)到底是做什么的,因为它的文档有点稀疏而且它的代码(使用 R6 架构)很难供我阅读(不过,无可否认,cobalt
也是如此)。似乎 smd
在提供匹配权重(或仅向其提供匹配样本)时计算匹配样本中的标准化因子,并且它始终将标准化因子计算为方差平均值的平方根在治疗组中。对于分类变量,它使用 Yang & Dalton (2012) rather than splitting the variable into separate dummy variables. I explain here 为什么我认为这不是一个好主意中描述的公式计算整个变量的单个标准化均值差。
希望这能阐明这些差异。我鼓励您使用 cobalt
而不是 gtsummary()
来生成余额表,因为选择这些设置需要进行大量研究。在我看来,它们代表了最佳实践。 cobalt
还使您可以灵活地提供自己的选择(如果您不同意),但通过自己做出这些选择,您可以准确了解每个值的计算方式。我还努力确保 cobalt
被完整地记录下来,以帮助用户准确理解正在发生的事情。我描述的关于 cobalt
功能的所有内容都在文档中进行了解释。