Ошибка GAM: ошибка в model.frame.default - длина переменной отличается (найдено для 'day_num') - PullRequest
1 голос
/ 30 марта 2020

Я пытаюсь сгенерировать прогнозы для скрытых случаев, используя модель GAM. Следующий код работает и производит прогноз случаев США.

  US_data = covid_cases %>% select(United.States, day_num)

  head(US_data)
  United.States day_num
1             0       1
2             0       2
3             0       3
4             0       4
5             0       5
6             0       6

  end_date = nrow(US_data)+28
  new_data = data.frame(seq(1:end_date))
  colnames(new_data) = "day_num"

  US_gam <- gam(United.States~s(day_num,k=45), data=US_data)

#generate predictions

  US_predictions = data.frame(predict(US_gam, new_data))
  US_predictions$day_num <- as.numeric(new_data$day_num)
  names(US_predictions)[1] <- "United.States"

Я хочу применить один и тот же код к любой стране, которую выберу, и поэтому считаю, что простая функция будет проще всего. Эта функция в основном берет весь код выше и упаковывает его в функцию.

get_df <- function(df,location, day_num){
  data = df %>% select(location, day_num)
  return(data)
}

projection <- function(df,location,day_num){
  data = get_df(df,location, day_num)
  end_date = nrow(data)+28
  new_data = as.data.frame(seq(1:end_date))
  colnames(new_data) = "day_num"
  country_gam <- gam(location~ s(day_num,k=45), data=data)
  country_predictions = data.frame(predict(country_gam, new_data))
  country_predictions$day_num <- as.numeric(new_data$day_num)
  names(country_predictions)[1] <- location
  return (country_predictions)
}

Однако - изначально это не удалось в строке поднабора данных, поэтому я поместил get_df в качестве вспомогательной функции. Теперь он терпит неудачу при анализе игры:

US_data <- projection(covid_cases, "United.States", "day_num")
         Show Traceback

Error in model.frame.default(formula = location ~ 1 + day_num, data = data,  : 
      variable lengths differ (found for 'day_num') 
    6. model.frame.default(formula = location ~ 1 + day_num, data = data, 
        drop.unused.levels = TRUE) 
    5. stats::model.frame(formula = location ~ 1 + day_num, data = data, 
        drop.unused.levels = TRUE) 
    4. eval(mf, parent.frame()) 
    3. eval(mf, parent.frame()) 
    2. gam(location ~ s(day_num, k = 45), data = data) 
    1. projection(covid_cases, "United.States") 

Ошибка, кажется, предполагает, что данные $ day_num не равны длине местоположения данных $, но я не могу понять, почему это произойдет, потому что они одинаковой длины

Я прочитал различные ответы о переполнении стека и не могу найти никаких ответов, и охота вокруг inte rnet также вызвала что-нибудь. Я был бы очень признателен за любую помощь!

Чтобы получить ковидные данные для полностью воспроизводимого примера:

covid_cases <- read.csv(url("https://covid.ourworldindata.org/data/ecdc/total_cases.csv"))
covid_cases[is.na(covid_cases)] = 0
covid_cases$day_num = as.numeric(covid_cases[,1])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...