我一直在探索 R 中的 MatchIt() 包,想知道如何在這個包中計算 eCDF 均值。我使用了這個包中的資料 lalonde,并運行了 matchit 包
library("MatchIt")
data("lalonde")
m.out1 <- matchit(treat ~ age educ race married
nodegree re74 re75, data = lalonde,
method = "nearest", distance = "glm")
matchit 的摘要輸出是
Call:
matchit(formula = treat ~ age educ race married nodegree
re74 re75, data = lalonde, method = "nearest", distance = "glm")
Summary of Balance for All Data:
Means Treated Means Control Std. Mean Diff. Var. Ratio eCDF Mean eCDF Max
distance 0.5774 0.1822 1.7941 0.9211 0.3774 0.6444
age 25.8162 28.0303 -0.3094 0.4400 0.0813 0.1577
educ 10.3459 10.2354 0.0550 0.4959 0.0347 0.1114
raceblack 0.8432 0.2028 1.7615 . 0.6404 0.6404
racehispan 0.0595 0.1422 -0.3498 . 0.0827 0.0827
racewhite 0.0973 0.6550 -1.8819 . 0.5577 0.5577
married 0.1892 0.5128 -0.8263 . 0.3236 0.3236
nodegree 0.7081 0.5967 0.2450 . 0.1114 0.1114
re74 2095.5737 5619.2365 -0.7211 0.5181 0.2248 0.4470
re75 1532.0553 2466.4844 -0.2903 0.9563 0.1342 0.2876
從小插圖(“評估平衡”),跨組協變數的 eCDF 之間的平均距離是 eCDF 平均值。所以,我一直在嘗試手動計算 eCDF 平均值。例如對于年齡協變數。
首先,我將 2 個資料分開,“people1”表示處理的資料,“people2”表示未處理的資料。然后我為治療年齡 (A) 和未治療年齡 (B) 創建 eCDF
#AGE
people1$age
people=na.omit(people1$age)
age1=ecdf(as.numeric(people))
people2$age
people2=na.omit(people2$age)
age2=ecdf(as.numeric(people2))
as.list(environment(age1))
A=as.data.frame(cbind(as.list(environment(age1))$x, as.list(environment(age1))$y));A
as.list(environment(age2))
B=as.data.frame(cbind(as.list(environment(age2))$x, as.list(environment(age2))$y));B
下面的 C 矩陣是處理 (A) 和未處理 (B) 的 eCDF。
C=merge(A,B,by="V1",all=TRUE);C
C=na.omit(C) #for delete the row with NA value
D=abs(C$V2.x-C$V2.y);summary(D)
而 D 是 eCDF 處理(treat=1)和未處理(treat=0)之間的差異,但均值的結果是:
Min. 1st Qu. Median Mean 3rd Qu. Max.
0.01850 0.06193 0.08809 0.09113 0.11888 0.15773
如您所見,最大差值 eCDF 與 MatchIt() 的輸出相同,但差值均值 eCDF不相同。任何人都可以解決問題嗎?或者知道如何計算 eCDF 平均值?謝謝!
uj5u.com熱心網友回復:
這是我見過的最復雜的代碼。我將簡化事情并向您展示如何計算統計資料。也就是說,這個統計資料沒有得到很好的研究,主要是由于歷史原因,它是輸出的一部分。請改用 eCDF Max(Kolmogorov-Smirnov 統計量)。
第 1 步:從處理單元和控制單元中獲取 eCDF(它們是函式,而不是向量)
ecdf1 <- ecdf(lalonde$age[lalonde$treat == 1])
ecdf0 <- ecdf(lalonde$age[lalonde$treat == 0])
這些函式的作用是取變數 ( age)的值并回傳每個值的累積密度。
步驟 2:評估 eCDF 的每個唯一值age
我們必須使用唯一值的原因是 eCDF 已經通過在函式中創建一個步驟來考慮重復值。
cum.dens1 <- ecdf1(unique(lalonde$age))
cum.dens0 <- ecdf0(unique(lalonde$age))
第 3 步:計算絕對差的平均值和最大值
ecdf.diffs <- abs(cum.dens1 - cum.dens0)
mean(ecdf.diffs)
# [1] 0.08133907
max(ecdf.diffs)
# [1] 0.157727
我們可以看到我們得到了正確的答案。
實際MatchIt使用的代碼不太透明,但它使它運行得更快。
uj5u.com熱心網友回復:
這不是問題的答案,但它太大而不能發表評論。
問題中的問題來自似乎是MatchIt計算平均值的打包方式,它們是加權平均值。
下面的代碼與問題的代碼具有相同的輸出,但我將其發布在這里是因為我認為它更符合習慣。這肯定更簡單。
library("MatchIt")
data("lalonde")
m.out1 <- matchit(treat ~ age educ race married
nodegree re74 re75, data = lalonde,
method = "nearest", distance = "glm")
summary(m.out1)
sp_lalonde <- split(lalonde, lalonde$treat)
tmp <- lapply(sp_lalonde, \(x){
e <- ecdf(x$age)
out <- as.list(environment(e))[c("x", "y")]
as.data.frame(out)
})
C <- Reduce(function(x, y) merge(x, y, by = "x", all = TRUE), tmp) |> na.omit()
D <- abs(C[[2]] - C[[3]])
summary(D)
# Min. 1st Qu. Median Mean 3rd Qu. Max.
#0.01850 0.06193 0.08809 0.09113 0.11888 0.15773
mean(apply(C[-1], 1, dist))
#[1] 0.09112509
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/351308.html
