각 처리 된 관측치에 가장 가까운 값을 찾으려고합니다. (1.2M OBS에서 부분 데이터)는 다음과 같이 데이터를 보면 각 처리 관측data.table에서 가장 가까운 값을 찾으십시오.
> dta
id treatment score
1: 5 0 0.02381024
2: 10 0 0.05428605
3: 22 0 0.02118124
4: 27 0 0.01495214
5: 45 0 0.01877916
6: 50 0 0.02120360
7: 58 0 0.02207263
8: 60 0 0.02807019
9: 61 0 0.05432927
10: 65 1 0.59612077
11: 68 0 0.02482168
12: 72 1 0.14582400
13: 73 0 0.02371670
14: 77 0 0.02608826
15: 87 0 0.06852409
16: 88 0 0.07473471
17: 94 0 0.07160314
18: 97 0 0.02040747
19: 104 1 0.09878789
20: 108 0 0.02421807
(즉, 치료 = 1) 내가 치료 관찰을 좀하고 싶습니다 (즉, 치료 = 0)와 가장 가까운 스코어 및 다른 관측 된 관측치와 비교할 수없는 것으로 선택된 관측치를 표시합니다.
예를 들어 첫 번째 처리 된 관찰 (행 10)은 id = 88 (행 16), 12 행에서 17 행 등과 일치합니다. 현재 floowing 루프를 실행 중입니다.
smpl_treated = dta[treatment == 1]
smpl_untreated = dta[treatment == 0]
n_tmp = nrow(smpl_treated)
matched_id = matrix(0, n_tmp, 1)
smpl_tmp = smpl_untreated
for (i in 1:nrow(smpl_treated)) {
x = smpl_treated[i]$score
setkey(smpl_tmp, score)
tmp = smpl_tmp[J(x), roll = "nearest"]
matched_id[i] = tmp[[1]]
smpl_tmp = smpl_tmp[id != tmp[[1]]]
}
matched_smpl = smpl_untreated[id %in% matched_id]
> matched_smpl
id treatment score
1: 87 0 0.06852409
2: 94 0 0.07160314
3: 88 0 0.07473471
이 문제를 data.table 내에서 발생 시키거나 루프를 빠르게하려면 어떤 제안이 필요합니까? 원래 1.2M의 obs 루프 2 시간 이상 걸립니다. 미리 도움을 주셔서 감사합니다!
다음과 같은 5 개 샘플을 가지고 가정 : {(ID = 1, 치료 = 0, 점수 = 0), (ID = 2 , 치료 = 1, 점수 = 0.1), (ID = 3, 치료 = 1, 점수 = 0.2), (ID = 4, 치료 = 1, 점수 = 0.3))}. 다른 말로하면 두 개의 치료되지 않은 관찰 사이에 3 개의 치료 된 관찰이 있습니다. 이 경우 무엇이 무엇에 매핑됩니까? – Ben
내 맥락에서, 그것은 일어나지 않을 것입니다. 그러나 그것이 일어난다면, 아마도 나는 그 반대를 해봐야합니다 - 이것의 주요 목적은 치료되고 치료되지 않은 관찰의 균형 잡힌 표본을 얻는 것입니다. – jayc