У меня есть некоторые базовые вычисления, которые я хочу применить к остаткам модели plm, но я зациклился на том, как автоматизировать шаги для большого количества данных.Автоматизация базовых вычислений с остатками в R
Давайте предположим, что вход является data.frame (df
) со следующими данными:
Id Year Population Y X1 X2 X3
country A 2009 977612 212451.009 19482.7995 0.346657979 0.001023221
country A 2010 985332 221431.632 18989.3 0.345142551 0.001015205
country A 2011 998211 219939.296 18277.79286 0.344020453 0.001002106
country A 2012 1010001 218487.503 17916.2765 0.342434314 0.000990409
country B 2009 150291 177665.268 18444.04522 0.330864789 0.001940218
country B 2010 150841 183819.407 18042 0.327563461 0.001933143
country B 2011 152210 183761.566 17817.3515 0.32539255 0.001915756
country B 2012 153105 182825.112 17626.62261 0.321315437 0.001904557
country c 2009 83129 132328.034 17113.64268 0.359525557 0.005862866
country c 2010 83752 137413.878 16872.5 0.357854141 0.005819254
country c 2011 84493 136002.537 16576.17856 0.356479235 0.005768219
country c 2012 84958 133064.911 16443.3057 0.355246122 0.005736648
модель была применена и остатки сохраняются:
fixed <- plm(Y ~ Y1 + X2 + X3,
data=df, drop.unused.levels = TRUE, index=c("Id", "Year"), model="within")
residuals <- resid(fixed)
На мой следующий шаг, Я хочу рассчитать «средневзвешенные значения» моих остатков с:
с nit, стоящим для населения в стране i в момент времени t и nt, являющейся общей численностью населения в t.
Мой подход до сих пор:
Сначала я вычислить общую нть населения за каждый год:
year_range <- seq(from=2009,to=2012,by=1)
tot_pop = NULL
for (n in year_range)
{
tot_pop[n] = with(df, sum(Population[Year == n]))
}
Перед взятием сумму «взвешенных» невязок, мой следующий шаг должен был бы автоматизировать расчет моих «новых» невязок:
res1 <- df$Population[1]/tot_pop[2009] * residuals[1]
res2 <- df$Population[2]/tot_pop[2010] * residuals[2]
res3 <- df$Population[3]/tot_pop[2011] * residuals[3]
...
res12 <- df$Population[12]/tot_pop[2011] * residuals[12]
Edit: Применяя решение JTT к моей проблеме, последний шаг будет затем:
year_range1 <- rep(year_range, 3)
df_res <- data.frame(year = year_range1, res=as.vector(res))
aggr_res <- aggregate(df_res$res, list(df_res$year), sum)
colnames(aggr_res) <- c("Year", "Aggregated residual")
Это правильно?
Я пробовал функцию lapply и двойной «for-loop» без успеха. Я не знаю, как это сделать. Ваша помощь будет оценена по достоинству. Если мой вопрос неясен, прокомментируйте, и я постараюсь его улучшить.
В вашей первоначальной формуле вы указали, что я страна, а затем суммирование происходит по странам. Здесь вы агрегированы в течение многих лет, но разве вы не должны быть агрегированы для стран? Если это так, то просто используя, например, 'df_res <- data.frame (country = df $ Id, res = as.vector (res)); aggr_res <- aggregate (df_res $ res, list (df_res $ country), sum) 'должен работать. –
@JTT Хмм, я думаю, что мое суммирование верное. Результат должен быть одним значением за каждый год. Каждое значение представляет собой сумму всех стран за этот конкретный год. –
Да, сегодня я не очень проницателен ... В таком случае это должно быть так. Это решило вашу проблему? –