代码之家  ›  专栏  ›  技术社区  ›  user2602640

具有不规则时间自相关的GLMMTMB

  •  1
  • user2602640  · 技术社区  · 7 年前

    我正在组装一个GLMMTMB模型。我每年5月在一个网站收集了4年的数据。一年内的时间分辨率可以从几分钟(甚至是同一分钟)到几天不等。 这个 covariance vignette ar1() 结构需要定期的时间序列,但 ou(times + 0 | group) 结构可以处理不规则的时间。那就是说-看起来像 times 争论是一个因素——它如何在不规则的时间结构下工作??

    例如,这是否是 ou() 结构?

    df <- structure(list(DayYear = c(234, 220, 234, 231, 243, 229, 228, 
    223, 220, 218, 234, 237, 234, 231, 241, 237, 241, 241, 233, 234, 
    234, 232, 218, 227, 232, 229, 220, 223, 228, 224), DateTime =     structure(c(1495477980, 
    1399590540, 1495479780, 1495225920, 1464631980, 1495052760, 1463324460, 
    1494525780, 1494256560, 1494088440, 1495471320, 1495730940, 1495476960, 
    1495225200, 1432919940, 1495725900, 1432924200, 1432918860, 1495384020, 
    1495479900, 1463848140, 1495298820, 1399420080, 1463253000, 1463692920, 
    1495037040, 1494275160, 1494510780, 1463348220, 1494597180), class =     c("POSIXct", 
    "POSIXt"), tzone = ""), Year = c(2017, 2014, 2017, 2017, 2016, 
    2017, 2016, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2015, 2017, 
    2015, 2015, 2017, 2017, 2016, 2017, 2014, 2016, 2016, 2017, 2017, 
    2017, 2016, 2017), N = c(2, 2, 7, 2, 6, 4, 1, 4, 1, 3, 1, 6, 
    2, 2, 2, 2, 5, 5, 3, 5, 3, 2, 4, 1, 6, 2, 2, 3, 5, 2)), row.names = c(NA, 
    -30L), class = c("tbl_df", "tbl", "data.frame"))
    

    在一年内创建采样因子

    df <- df %>%
        arrange(DateTime) %>%
        group_by(Year) %>%
        mutate(times = 1:n()) %>%
        ungroup() %>%
        mutate(YearF = as.factor(Year),
                times = numFactor(times))
    
    mod1 <- glmmTMB(N ~ DayYear + YearF + 
                ou(times + 0 | YearF),
                family = nbinom2,
                data = df)
    

    这个特殊的模型运行得不太好,因为玩具数据集太小了(而且可能不显示我需要显示的内容),但是在不规则的时间序列下,这是一个正确的自相关结构规范吗?

    1 回复  |  直到 7 年前
        1
  •  1
  •   Ben Bolker    7 年前

    不,不是:你必须在 numFactor . 这样做会强制数据集具有相等的间距。我以下使用 lubridate::decimal.date(DateTime) %% 1 获取用作时间坐标的年份变量的分数。

    library(dplyr)
    library(lubridate)
    library(glmmTMB)
    df2 <- (df
        %>% arrange(DateTime)
        %>% group_by(Year)
        %>% mutate(times = lubridate::decimal_date(DateTime) %% 1)
        %>% ungroup()
    )
    
    df3 <- (df2
        %>% mutate(YearF = as.factor(Year),
                   times = glmmTMB::numFactor(times))
        %>% select(N, DayYear, YearF, times)
    )
    
    mod1 <- glmmTMB(N ~ DayYear + YearF + 
                ou(times + 0 | YearF),
                family = nbinom2,
                data = df3)
    
    推荐文章