R: грешки при вземане на общи суми?

Симулирах (нормално разпределени) произволни данни за всеки ден за период от януари-1-2014 до януари-1-2016. След това се опитах да взема сумите от тези данни на редовни периоди от 8 дни. Ето моят код (добавих семена за възпроизводимост):

library(xts)
library(ggplot2)

set.seed(123)
    
#simulate data
    property_damages_in_dollars <- rnorm(731,100,10)

date_decision_made = seq(as.Date("2014/1/1"), as.Date("2016/1/1"),by="day")
    
    date_decision_made <- format(as.Date(date_decision_made), "%Y/%m/%d")
    
final_data <- data.frame(date_decision_made, property_damages_in_dollars)

#convert to xts object
dat <- xts(final_data$property_damages_in_dollars, 
           as.Date(final_data$date_decision_made, '%Y/%m/%d'))

#aggregate by 8 day period
ep <- endpoints(dat,'days',k=8)

#final aggregated file
a = period.apply(x=dat,ep,FUN=sum )

#plot
a_df <- fortify(a)
 ggplot(a_df, aes(x = Index, y = a)) + geom_line()

Изглежда обаче, че има значителни неравномерни пикове, когато данните са сумирани на периоди от 8 дни, което предполага, че може да има някои грешки при сумирането на данните:

въведете описание на изображението тук

  1. Към края на графиката изглежда, че има спад към края. Това изглежда подозрително - но донякъде разбираемо.

  2. В средата на графиката има много забележим рязък спад - това наистина изглежда като грешка в изчислението. Този спад се случва, когато годината преминава от 2015 (декември) към 2016, съответните (обобщени) числа, свързани с това време, също изглеждат ниски.

Може ли някой да обясни тези капки и да предложи как могат да бъдат коригирани? Благодаря


person stats555    schedule 06.12.2020    source източник
comment
Гледайки датите, които сте маркирали, имате 5-дневен период вместо 8-дневен, съответстващ на спада в средата на графиката. Не съм запознат с xts - можете ли да принудите endpoints да игнорира края на годината?   -  person Hobo    schedule 06.12.2020
comment
Благодаря ви за отговора! Знаете ли защо се създава 5-дневен период, когато е посочен 8-дневен период? Знаете ли как да поправите този проблем? Благодаря отново!   -  person stats555    schedule 06.12.2020
comment
Съжалявам, исках да кажа можеш ли, а не можеш. Разглеждайки помощта за функцията, няма очевидно решение с endpoints. Може да можете да използвате seq вместо това - вижте моя отговор   -  person Hobo    schedule 06.12.2020


Отговори (1)


Изглежда, че функцията endpoints взема предвид края на годината по някаква причина. Но също така изглежда, че просто създава цифров вектор, съдържащ броя на дните във всеки период. Така че замяната му с нещо подобно

total_days <- 731
period_length <- 8

ep <- seq(0, total_days, period_length)
if (ep[length(ep)] < total_days) {
  ep[length(ep) + 1] <- total_days
}

изглежда работи. Използвах if, защото seq изглежда прекъсва, ако total_days не е кратно на period_length. Вероятно има по-изчистен начин: вижте този въпрос за възможни решения, ако интересуваш се.

Това изглежда коригира средното потапяне; последното е, защото няма цели 8 дни данни за този период (мисля).

person Hobo    schedule 06.12.2020
comment
Благодаря ти! това изглежда се е погрижило за шипа в средата. Но възможно ли е да се коригира скокът към края на графиката? благодаря ви за цялата ви помощ! - person stats555; 06.12.2020
comment
Съжалявам, току що видях това. Пикът в края е, защото 731 не е кратно на 8. Ако вместо това използвате 736, трябва да работи. Нещо като date_decision_made <- seq(as.Date("2014/1/1"), ,by="day", length.out = 736) - person Hobo; 06.12.2020
comment
Благодаря ви за отговора - това има смисъл, става въпрос за това кои числа се делят без остатък. Просто бях изненадан, че това разделение може да направи такава видима разлика в графиката - особено в средата. Има ли по-добър начин за агрегиране на данни, така че компютърът сам да се грижи за тези проблеми? Има ли и начин да се нанасят само цели периоди - напр. ако има 740 наблюдения и 8-дневни периоди, наблюдения 737, 738, 739, 740 не са нанесени? благодаря ви за цялата ви помощ! - person stats555; 07.12.2020
comment
С оригиналния ep средният период е 5 дни, а последният 1 ден, така че височините са приблизително това, което бих очаквал (съответно 5/8 и 1/8 от височината на другите периоди). Мисля, че най-лесният начин да гарантирате, че са начертани само пълни периоди, е да закръглите надолу броя на дните в горната част на скрипта: whole_periods <- floor(days / days_per_period); days <- whole_periods * days_per_period. Въпреки че, когато използвате реални данни, ще трябва да направите изчислението въз основа на броя редове в рамката с данни, след което вземете горните n реда - person Hobo; 08.12.2020