#r #regression #panel-data
Вопрос:
Поэтому я работаю со следующим набором данных:
# A tibble: 1,136 x 17
ccode year vanhdemo pcgnp left ainew sdnew milctr2 britinfl lpop iwar cwar popinc pcginc polrtnew lag_ainew lag_sdnew
<dbl> <int> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 2 1980 18.7 11.3 0 1 1 0 1 19.2 0 0 1.01 7.51 7 NA NA
2 2 1981 18.7 12.3 0 1 1 0 1 19.3 0 0 1.01 7.99 7 1 1
3 2 1982 18.7 13.2 0 1 1 0 1 19.3 0 0 1.01 7.39 7 1 1
4 2 1983 18.7 14.2 0 1 1 0 1 19.3 0 0 1.01 7.69 7 1 1
5 2 1984 16.1 15.5 0 1 1 0 1 19.3 0 0 1.01 9.66 7 1 1
6 2 1985 16.1 16.5 0 1 1 0 1 19.3 0 0 1.01 6.24 7 1 1
7 2 1986 16.1 17.5 0 1 1 0 1 19.3 0 0 1.01 5.86 7 1 1
8 2 1987 16.1 18.6 0 2 2 0 1 19.3 0 0 1.01 6.39 7 1 1
9 20 1980 25.6 10.2 0 1 1 0 1 17.0 0 0 1.08 9.01 7 NA NA
10 20 1981 25.6 10.7 0 1 1 0 1 17.0 0 0 1.08 5.77 7 1 1
# ... with 1,126 more rows
Как вы можете видеть, R распознает переменную year
как целое число. Первоначально значения столбцов были числовыми, но я преобразовал их в целочисленные. Однако, когда я запускаю следующий код (используя пакет panelAR), у меня возникают проблемы:
panelAR(vanhdemo ~ pcgnp left lpop iwar milctr2 britinfl, data = dat,
panelVar = "ccode", timeVar = "year", autoCorr = "psar1", panelCorrMethod = "pcse",
rho.na.rm = TRUE, panel.weight = "t-1", bound.rho = TRUE)
Я получаю это сообщение об ошибке:
Error: The time variable must be defined as an integer.
Я не могу понять, что я здесь делаю не так. Если я воссоздам часть набора данных (как показано ниже), модель будет работать нормально. Итак, коренится ли проблема в наборе данных (первоначально в файле .dta)? Я определенно могу загрузить его, если кому-то интересно посмотреть на него.
Вот небольшой пример тех же данных:
ccode <- c(rep(2,8), rep(20, 2))
year <- c(1980:1987, 1980, 1981)
vanhdemo <- c(rep(18.7, 4), rep(16.1, 4), rep(25.6, 2))
pcgnp <- c(11.3, 12.3 , 13.2, 14.2, 15.5, 16.5, 17.5, 18.6, 10.2, 10.7)
dat <- data.frame(ccode, year, vanhdemo, pcgnp)
Комментарии:
1. Возможно, если класс year from
dat
числовой, а не целочисленный иpanelAR
работает, попробуйте изменить класс year в ваших данных обратно на числовой.2. @sm0k313 Я попробовал второе предложение, но, к сожалению, оно не сработало.
3. Не знаю, будет ли это иметь значение для panelAR (), но ваш первый объект-это tibble, а » dat » — это data.frame. Может быть, попробовать преобразовать реальные данные в фрейм данных?
4. @xilliam у тебя глаза как у ястреба. В этом-то и была проблема!
Ответ №1:
Ошибка связана с различным поведением data.frames
и tibbles
. Тибблы-это особый вид данных.фрейм, который «предотвращает падение размеров». Если вы попытаетесь подмножествовать тиббл с именем одного столбца, вы получите обратно тиббл с одним столбцом. Тем не менее, в зависимости от того, как вы подмножествуете фрейм данных, вы можете получить обратно вектор или фрейм данных. Ошибка, которую вы видите, является результатом этого различия. Внутреннее panelAR()
подмножество объекта данных для переменной времени:
time.vec <- data[, timeVar]
Итак, если «данные» -это тиббл, «time.vec» будет тибблом с одним столбцом, тогда
как если «данные»-это фрейм данных, «time.vec» будет вектором. panelAR()
затем
проверяет, является ли «time.vec» целочисленным вектором, и выдает ошибку в тех случаях, когда объектом данных является tibble.
Вы можете увидеть это поведение в своих образцах данных следующим образом:
# make a tibble
dat_tib <- tibble::as_tibble(dat)
# returns a vector
dat[, "year"]
# returns a data.frame
dat["year"]
# returns a tibble
dat_tib[, "year"]
# returns a tibble
dat_tib["year"]
Ответ №2:
Ответьте в комментарии @xilliam. Решением было преобразовать таблицу из tibble в фрейм данных.