2015-03-30 4 views
1

У меня есть некоторые базовые вычисления, которые я хочу применить к остаткам модели 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) 

На мой следующий шаг, Я хочу рассчитать «средневзвешенные значения» моих остатков с:

Residuals Formula

с 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» без успеха. Я не знаю, как это сделать. Ваша помощь будет оценена по достоинству. Если мой вопрос неясен, прокомментируйте, и я постараюсь его улучшить.

+0

В вашей первоначальной формуле вы указали, что я страна, а затем суммирование происходит по странам. Здесь вы агрегированы в течение многих лет, но разве вы не должны быть агрегированы для стран? Если это так, то просто используя, например, 'df_res <- data.frame (country = df $ Id, res = as.vector (res)); aggr_res <- aggregate (df_res $ res, list (df_res $ country), sum) 'должен работать. –

+0

@JTT Хмм, я думаю, что мое суммирование верное. Результат должен быть одним значением за каждый год. Каждое значение представляет собой сумму всех стран за этот конкретный год. –

+0

Да, сегодня я не очень проницателен ... В таком случае это должно быть так. Это решило вашу проблему? –

ответ

1

Во-первых, вместо того, чтобы для цикла, вы можете рассчитать общую численность населения с использованием агрегированных Funtion и т.д .:

a<-aggregate(df$Population, list(df$Year), sum) 

Обратите внимание, что имена столбцов в (Group.1 и х).

Тогда вы можете сравнить результаты в a с данными в df с помощью функции match(). Он дает соответствующие номера строк, которые могут использоваться для подмножества данных от df до деления до умножения на остатки. Например:

res<-df$Population/a$x[match(df$Year, a$Group.1)]*residuals 

Теперь вы должны иметь вектор «новых» остатков в объекте res.

+0

Отлично! Благодарю. Агрегатная функция действительно является лучшим способом здесь. Я добавил последний шаг к моему вопросу. –

Смежные вопросы