Я использую пакет Synth () (см. ftp: //cran.r-project.org/pub/R/web/packages/Synth/Synth.pdf) в R.
Это подмножество моего фрейма данных:
all_data_uk <- structure(list(countryno = c(1, 1, 1, 2, 2, 2, 3, 3, 3, 16, 16,
16), country = c("Australia", "Australia", "Australia", "Canada",
"Canada", "Canada", "Denmark", "Denmark", "Denmark", "United Kingdom",
"United Kingdom", "United Kingdom"), year = c(1971, 1972, 1973,
1971, 1972, 1973, 1971, 1972, 1973, 1971, 1972, 1973), top10_income_share = c(0.2657,
0.2627, 0.2546, 0.37833, 0.37807, 0.37271, 0.323069660453, 0.322700285165,
0.320162826601, 0.2929, 0.289, 0.2831), top5_income_share = c(0.1655,
0.1654, 0.1593, 0.24075, 0.24106, 0.23917, 0.211599113574, 0.21160700537,
0.209096813051, 0.1881, 0.1848, 0.1818), top1_income_share = c(0.0557,
0.0573, 0.054, 0.08866, 0.08916, 0.08982, 0.082392548404, 0.0824267594074,
0.07776546085945, 0.0702, 0.0694, 0.0699), gdp_growth = structure(c(4.00330835508684,
3.91178191457604, 2.59931282534502, 4.11765761702448, 5.44585557970514,
6.96420291945871, 3.00503299618597, 3.92934382503836, 4.09292523611968,
3.48436803631409, 4.30194591910262, 6.50872079327365), label = "(annual %)", class = c("labelled",
"numeric")), capital_quinn = structure(c(50, 37.5, 37.5, 87.5, 87.5, 75, 75, 75, 75, 50, 50, 50), label = "(financial openness - capital account)", class = c("labelled",
"numeric"))), class = "data.frame", .Names = c("countryno", "country",
"year", "top10_income_share", "top5_income_share", "top1_income_share",
"gdp_growth", "capital_quinn"), row.names = c(NA, -12L))
В моем воспроизводимом примере у меня есть три разные переменные результата: "top10_income_share", "top5_income_share", "top1_income_share" (в моей реальной проблеме у меня гораздо больше), с которыми я хочу провести анализ. «gdp_growth» и «capital_quinn» - мои контрольные переменные.
Для одной переменной результата, здесь "top10_income_share", у меня есть следующий код (который отлично работает):
# Define treated and control units
control_units_top10 <- c(1,2)
treated_unit <- 16
# Run dataprep() which returns a list of matrices
dataprep.out_top10 <- dataprep(
foo = all_data_uk,
predictors = c("gdp_growth", "capital_quinn"),
predictors.op = "mean",
time.predictors.prior = 1971:1972,
special.predictors = list(
list("top10_income_share", 1971, "mean"),
list("top10_income_share", 1972, "mean")),
dependent = "top10_income_share",
unit.variable = "countryno",
unit.names.variable = "country",
time.variable = "year",
treatment.identifier = treated_unit,
controls.identifier = control_units_top10,
time.optimize.ssr = 1971:1972,
time.plot = 1971:1973)
# Run synth() command
synth.out_top10 <- synth(data.prep.obj = dataprep.out_top10, optimxmethod = "BFGS")
# Annual discrepancies in the top 10 income share trend between unit 4 (United Kingdom) and its synthetic counterpart:
gaps_top10 <- dataprep.out_top10$Y1plot - (dataprep.out_top10$Y0plot %*% synth.out_top10$solution.w)
Я хотел бы зациклить эти команды и сделать один и тот же анализ для всех трех выходных переменных. Моя проблема в том, что каждый раз мне приходится настраивать treatment.identifier
, special.predictors
и dependent
. Кроме того, я хотел бы сохранить выходные данные (dataprep.out_top10, dataprep.out_top5 ...; synth.out_top10, synth.out_top5 ... и т. Д.) Для всех трех выходных переменных.
Я нашел похожий вопрос ( Сохранить каждую R для итерации цикла в новом списке ), однако они имели одинаковые исходные и управляющие переменные в каждом цикле и хотели только перебрать блоки управления и I не удалось применить их решение к моей проблеме.
Вот что я придумал в следующем:
control_units_top10 <- c(1,2)
control_units_top5 <- c(1,2,3)
control_units_top1 <- c(1,3)
treated_unit <- 16
for(top in c("top10", "top5", "top1"))
{
paste0("dataprep.out_", top) <- dataprep(
foo = all_data_uk,
predictors = c("gdp_growth", "capital_quinn"),
predictors.op = "mean",
time.predictors.prior = 1971:1972,
special.predictors = list(
list(paste0(top, "_income_share"), 1971, "mean"),
list(paste0(top, "_income_share"), 1972, "mean")),
dependent = paste0(top, "_income_share"),
unit.variable = "countryno",
unit.names.variable = "country",
time.variable = "year",
treatment.identifier = treated_unit,
controls.identifier = get(paste0("control_units_", top)),
time.optimize.ssr = 1971:1972,
time.plot = 1971:1973)
paste0("synth.out_", top) <- synth(data.prep.obj = dataprep.out, optimxmethod = "BFGS")
paste0("gaps_", top) <- paste0("dataprep.out_", top)$Y1plot - (paste0("dataprep.out_", top)$Y0plot %*% paste0("synth.out_", top)$solution.w)
}
Я получаю сообщение об ошибке: Error in paste0("synth.out_", top) <- synth(data.prep.obj = dataprep.out, : target of assignment expands to non-language object
, поэтому я полагаю, что мой подход paste0 () не работает, но я не смог найти никакого другого решения о том, как "проиндексировать" переменные результата и мои новые объекты.
Я новичок в R и stockoverflow и был бы очень рад любым советам по настройке цикла.
Заранее спасибо!