Почему R выдает ошибку при итеративном вычислении - PullRequest
1 голос
/ 11 апреля 2020

Я смотрю данные covid-19 для расчета оценок репродуктивного числа R0.

library(ggplot2)  
library(dplyr)    
library(tidyr)    
library(stringr)  
library(TTR)



# Get COVID cases, available from:
url <- "https://static.usafacts.org/public/data/covid-19/covid_confirmed_usafacts.csv"

DoubleCOV <- read.csv(url, stringsAsFactors = FALSE)
names(DoubleCOV)[1] <- "countyFIPS"

DoubleCovid <- pivot_longer(DoubleCOV, cols=starts_with("X"),
                            values_to="cases",
                            names_to=c("X","date_infected"),
                            names_sep="X") %>%
  mutate(infected = as.Date(date_infected, format="%m.%d.%y"),
         countyFIPS = str_pad(as.character(countyFIPS), 5, pad="0"))

#data is by county, summarise for the state of interest
stateData <- DoubleCovid %>% filter(State == "AL") %>% filter(cases != 0) %>%  
  group_by(infected) %>% summarise(sum(cases)) %>% 
  mutate(DaysSince = infected - min(infected))

names(stateData)[2] <- "cumCases"

#3 day moving average to smooth a little
stateData <- stateData %>% mutate(MA = runMean(cumCases,3))

#calculate doubling rate (DR) and then R0 infectious period/doubling rate 
for(j in 4:nrow(stateData)){
  stateData$DR[j] <- log(2)/log(stateData$MA[j]/stateData$MA[j-1])
  stateData$R0[j] <- 14/stateData$DR[j]
}

CDplot <- stateData %>%
  ggplot(mapping = aes(x = as.numeric(DaysSince), y = R0)) +
  geom_line(color = "firebrick")

print(CDplot)

Итак, в приведенном выше состоянии интерес представляет Алабама, следовательно, filter(State == "AL"), и это работает.

Но если я изменю состояние на «NY», я получу

Error in `$<-.data.frame`(`*tmp*`, "DR", value = c(NA, NA, NA, 0.733907206043719 : 
  replacement has 4 rows, data has 39

head(stateData) доходность

infected   cumCases DaysSince    MA
  <date>        <int> <drtn>    <dbl>
1 2020-03-02        1 0 days    NA   
2 2020-03-03        2 1 days    NA   
3 2020-03-04       11 2 days     4.67
4 2020-03-05       23 3 days    12   
5 2020-03-06       25 4 days    19.7 
6 2020-03-07       77 5 days    41.7 

Значения скользящей средней в строках 3 и 4 (12 и 4.67) даст коэффициент удвоения 0,734, который совпадает со значением в сообщении об ошибке value = c(NA, NA, NA, 0.733907206043719, но почему после этого возникает ошибка?

Дополнительный вопрос: я знаю, что в R. .. есть ли способ получить скользящее среднее и R0 без расчета?

1 Ответ

1 голос
/ 11 апреля 2020

Вам нужно инициализировать новые переменные, прежде чем вы сможете получить к ним доступ с помощью индекса j. Из-за повторного использования Алабама, которая имеет 28 строк (делится на 4), не возвращает ошибку, только предупреждения о неинициализированных столбцах. В Нью-Йорке, однако, 39 строк, которые не делятся на 4, поэтому переработка не удалась, а R возвращает ошибку. Вы не должны игнорировать предупреждения, иногда вы можете, но это не очень хорошая идея.

Попробуйте, чтобы увидеть, что R (вы) пытается сделать:

stateData[4]

Вы должны получить все строки 4-го столбца, а не 4-й строки.

Решение: сначала инициализируйте столбцы DR и R0.

stateData$DR <- NA
stateData$R0 <- NA

for(j in 4:nrow(stateData)){
  stateData$DR[j] <- log(2)/log(stateData$MA[j]/stateData$MA[j-1])
  stateData$R0[j] <- 14/stateData$DR[j]
}

Для вопроса о бонусе вы можете использовать lag в том же самом мутировании с МА:

stateData <- stateData %>% mutate(MA = runMean(cumCases,3),
                                  DR = log(2)/log(MA/lag(MA)),
                                  R0 = 14 / DR)
stateData

# A tibble: 28 x 6
   infected   cumCases DaysSince    MA    DR    R0
   <date>        <int> <drtn>    <dbl> <dbl> <dbl>
 1 2020-03-13        5 0 days     NA   NA    NA   
 2 2020-03-14       11 1 days     NA   NA    NA   
 3 2020-03-15       22 2 days     12.7 NA    NA   
 4 2020-03-16       29 3 days     20.7  1.42  9.89
 5 2020-03-17       39 4 days     30    1.86  7.53
 6 2020-03-18       51 5 days     39.7  2.48  5.64
 7 2020-03-19       78 6 days     56    2.01  6.96
 8 2020-03-20      106 7 days     78.3  2.07  6.78
 9 2020-03-21      131 8 days    105    2.37  5.92
10 2020-03-22      167 9 days    135.   2.79  5.03
# ... with 18 more rows

Я использую данные Алабамы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...