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