Петля для обнаружения выбросов в R, данные панели - PullRequest
0 голосов
/ 06 мая 2018

Я работаю с фреймом данных панели, который выглядит примерно так:

        date    w    x    y    z    Country
1    2009 01    21   43   12    3   AT
2    2009 02    32   54   21   16   AT
3    2009 03    14   32   65   32   AT
4    2009 04    65   33   75   21   AT
:        :      :    :    :    :       :
:        :      :    :    :    :       :
55   2009 01    32   58   53   17   BE
56   2009 02    12   47   43   23   BE
57   2009 03    87   43   21   76   BE
:        :      :    :    :    :       :
85   2009 01    12   46   84   29    CZ
86   2009 02    85   29   90   12    CZ
:        :      :    :    :    :       :
:        :      :    :    :    :       :

for total of 28 countries

Я хотел бы запустить цикл для обнаружения возможных регионов выбросов путем оценки одной и той же модели plm для разных подмножеств (за исключением одной страны за раз). Создание подмножества может выглядеть примерно так:

uniq <- unique(unlist(full_panel$Country))
for (i in 1:length(uniq)){
data_1 <- subset(full_panel, Country!=uniq[i])
}

и модель для оценки:

plm(data_1, y~x+lag(x)......,
  model="within", effect="individual")

После этого я хотел бы, чтобы код генерировал фрейм данных, печатая одну конкретную статистику (скажем, прил. R-sq) из результатов, чтобы позже сравнить различные подмножества.

Пока что я только пытался создавать разные части кода, и, поскольку я новичок, у меня возникают проблемы при написании последней части и объединении их всех.

Любая помощь будет принята с благодарностью.

Спасибо.

1 Ответ

0 голосов
/ 06 мая 2018

Рассмотрим by для выполнения операций над подмножествами фрейма данных, возвращающими список (равный количеству отдельных групп), содержащий возвращаемые элементы из функции, в данном случае это фрейм данных для результатов plm модели каждого поднабора данных.

model_results_list <- by(full_panel, full_panel$Country, FUN=function(sub_df){

            fit <- plm(sub_df, y~x+lag(x)......,
                       model="within", effect="individual")

            data.frame(country = max(sub_df$Country),
                       f_stat = summary(fit)$fstatistic$statistic,
                       r_sq = summary(fit)$r.squared['rsq'],
                       adj_rsq = summary(fit)$r.squared['adjrsq'],
                       rss = sum(resid(fit)^2)
            )    
})

# BIND ALL DFS TO ONE SINGULAR DF
country_models_df <- do.call(rbind, model_results_list)
...