Как сбалансировать несбалансированную панель в R?

У меня несбалансированные месячные панельные данные. В некоторых штатах отсутствуют некоторые периоды времени, и поэтому у меня нет этих периодов на моей панели. Я хотел бы добавить эти периоды и присвоить им значение NA.

Я попробовал функцию, которая уравновешивает панель, но она удаляет все наблюдения, которые не совпадают для всех состояний. Следовательно, если нет данных по Алабаме за 02-2008 г., то наблюдения по всем штатам за 02-2008 г. будут исключены.

balanced <- function(data, ID, TIME, VARS, required=c("all", "shared")) {
  if(is.character(ID)) {
    ID <- match(ID, names(data))
  }
  if(is.character(TIME)) {
    TIME <- match(TIME, names(data))
    if(missing(VARS)) { 
      VARS <- setdiff(1:ncol(data), c(ID,TIME))
    } else if (is.character(VARS)) {
      VARS <- match(VARS, names(data))
    }
    required <- match.arg(required)
    idf <- do.call(interaction, c(data[, ID, drop=FALSE], drop=TRUE))
    timef <- do.call(interaction, c(data[, TIME, drop=FALSE], drop=TRUE))
    complete <- complete.cases(data[, VARS])
    tbl <- table(idf[complete], timef[complete])
    if (required == "all") {
      keep <- which(rowSums(tbl == 1) == ncol(tbl))
      idx <- as.numeric(idf) %in% keep
    } else if (required == "shared") {
      keep <- which(colSums(tbl == 1) == nrow(tbl))
      idx <- as.numeric(timef) %in% keep
    }
    data[idx, ]
  }

Balanced_panel <- balanced(milk_state, "STATE", "PERIOD", "VALUE", required = "all")

Вот как это выглядит:

  STATE       PERIOD    VALUE
California    01-2018     900
California    02-2018     890
California    03-2018     780
California    05-2018     800

Вот как я хочу, чтобы это выглядело:

  STATE       PERIOD    VALUE
California    01-2018     900
California    02-2018     890
California    03-2018     780
California    04-2018      NA
California    05-2018     800

person Maria Gisbert Queral    schedule 24.01.2019    source источник
comment
?tidyr::complete. Если вы поделитесь примером ввода, мы можем помочь вам больше. (Используйте dput(), например, dput(droplevels(milk_state[1:20, ])), чтобы поделиться копируемыми/вставляемыми примерами данных.   -  person Gregor Thomas    schedule 24.01.2019
comment
Какой смысл добавлять строки, состоящие только из NA? Что ты планируешь делать?   -  person jay.sf    schedule 24.01.2019
comment
Здесь я вставляю то, что я получил от dput(): структура (список (Штат = c (АРИЗОНА, КАЛИФОРНИЯ, КОЛОРАДО, ФЛОРИДА, АЙДАХО, ИЛЛИНОЙС, ИНДИАНА, АЙОВА, КАНЗАС, МИЧИГАН), monthdate = c (01 2018, 01 2018 , 01 2018, 01 2018, 01 2018, 01 2018, 01 2018, 01 2018, 01 2018, 01 2018 ), Значение = c(2165, 2005, 2220, 1775, 2055, 1800, 1945, 1905, 1905, ), row.names = c(NA, -10L), class = c(tbl_df, tbl, data.frame))   -  person Maria Gisbert Queral    schedule 24.01.2019
comment
Что ж, эта конкретная выборка данных завершена, но я думаю, что tidyr::complete(milk_state, STATE, PERIOD) сработает.   -  person Gregor Thomas    schedule 29.01.2019


Ответы (1)


На самом деле вы не хотите создавать сбалансированную выборку из существующих данных (это то, что вы сделали с кодом выше), а хотели бы расширить свою выборку всеми возможными комбинациями STATE и PERIOD. Для этого требуется еще один шаг, а именно создание этих комбинаций. Начните с этого

library(tidyverse)
data$ID %>% unique() %>%
  expand.grid(., seq('2018-01-01', '2018-05-01', by = 'month')) %>%
  rename("ID" = 1, "PERIOD" = 2) -> df

После этого возьмите этот кадр данных всех возможных комбинаций, df, и используйте left_join, чтобы присоединиться к вашим существующим наблюдениям:

df %>%
  left_join (data, by = c("ID", "PERIOD") -> data

Результирующий кадр данных data представляет собой сбалансированную выборку, содержащую все идентификаторы и периоды. Для вычислений вы могли бы ввести среднее или нулевое вменение пропущенных значений, если ваши настройки допускают такие предположения о значениях переменных, и у вас есть сбалансированная выборка в том узком смысле, что в вашей выборке существуют только идентификаторы с наблюдениями за все периоды.

person ToWii    schedule 11.12.2020