"Perfect separation" 使用 pymatch 中的匹配器时出错(倾向得分匹配)

"Perfect separation" error when using Matcher from pymatch (Propensity score matching)

我正在尝试使用 pymatch 包,但我一直收到错误 Error: Perfect separation detected, results not available。我检查了多次,我的数据集不相等。它包含 260k 行用于控制和 50k 用于处理,并且具有不同的平均值。我只有 5 个变量,所有 integersFloats 四舍五入到两位小数。

我的目标是将一些接受过治疗的客户与未接受过治疗的客户进行匹配,以便根据倾向得分匹配进行进一步分析。

我已经删除了异常值,因为它显然无法很好地处理这些异常值。我还将逗号后的小数四舍五入到 2 个位置。我尝试只使用整个数据集的 2 个变量。什么都没用。

d = {'Customer': ['A','B','C','D'], 'Basket_Size': [30, 40,25,30], 'Miles_away': [5.2, 15.4,16.3,7.2], 'was_treated': [1, 0,0,1]}
df = pd.DataFrame(data=d)
df

test = df[df.was_treated== 1]
control = df[df.was_treated== 0]

m = Matcher(test, control, yvar="was_treated", exclude=['Customer'])
## until here it runs perfectly fine

# output:

#Formula:
#was_treated~ Basket_Size+Miles_away
#n majority: 2
#n minority: 2


## this now throws the error
np.random.seed(20170925)
m.fit_scores(balance=True, nmodels=20)

# output: 
# Error: Perfect separation detected, results not available
# Fitting Models on Balanced Samples: 1

我希望输出像 Average Accuracy: 78% 但我得到 Average Accuracy: nan% 和错误 Error: Perfect separation detected, results not available

我自己解决了这个问题。根据数据的性质,一个 variable 受到治疗的影响。这意味着 was_treated== 1 中没有数据点可以有 Miles_away >10,反之亦然,was_treated== 0 中没有数据点可以有 Miles_away <10。这是完美的分离。从倾向评分中排除这个 variable 解决了这个问题。


    m = Matcher(test, control, yvar="fast_delivery", exclude=['CUSTOMER_NUMBER','Miles_away'])