Próbuję znaleźć najbliższą wartość dla każdej traktowanej obserwacji. Dane wyglądać następująco (dane z częściowym 1.2M OB):Znajdowanie najbliższej wartości w 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
dla każdej poddanych obserwacji (tj leczenie = 1) chciałbym uzyskać nieleczoną obserwacji (tj leczenie = 0) z najbliższy wynik i oznaczyć wybraną obserwację jako nieosiągalną dla innych poddanych obserwacji obserwacji.
Na przykład pierwsza traktowana obserwacja (wiersz 10) zostanie dopasowana do id = 88 (wiersz 16), wiersz 12 do wiersza 17 i tak dalej. Obecnie używam pętlę 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
Wszelkie sugestie, aby to nastąpić w przeciągu data.table lub zrobić pętlę szybciej? Z oryginalnym 1.2M obs pętla trwa ponad 2 godziny. Dzięki za pomoc z góry!
Załóżmy, że 5 następujących próbek: {(id = 1, leczenia = 0, wynik = 0), (id = 2 leczenie = 1, wynik = 0,1), (id = 3, leczenie = 1, wynik = 0,2), (id = 4, leczenie = 1, wynik = 0,3), (id = 5, leczenie = 0, wynik = 0,4)}. Innymi słowy, masz 3 traktowane obserwacje zaklinowane pomiędzy dwoma nieleczonymi obserwacjami. W tym przypadku, co mapuje do czego? – Ben
W moim kontekście tak się nie stanie. Jeśli tak się jednak stanie, prawdopodobnie powinienem postąpić odwrotnie - głównym celem jest uzyskanie zrównoważonej próbki traktowanych i nieleczonych obserwacji. – jayc