GAM не соответствует средним данным - PullRequest
0 голосов
/ 06 мая 2020

Я работаю над экспериментальными данными, в которых я применял различные факторы стресса с течением времени (день эксперимента) к морским звездам. Я измерял вес в разные моменты времени, а также время их восстановления (активность). Я использовал GAM для моделирования данных с течением времени. При построении модели и средних значений для каждого момента времени для веса модель недооценивает фактический измеренный средний вес. И на время исправления модель показывает синусоидальный узор, но данные не поддерживают такой узор. Было бы замечательно, если бы кто-нибудь мог объяснить мне, почему это так и есть ли возможность лучше подогнать модель к моим данным. Большое спасибо за вашу помощь.

Мои данные для веса выглядят так:

Day.in.experiment  Treatment  Individual  Weight.sea.star..g.
numeric            factor     factor      numeric

И вот так для времени восстановления:

Day.in.experiment  Treatment  Individual  Time..sec.
numeric            factor     factor      numeric

Это мой код для модели веса:

model_weight <- bam (Weight.sea.star..g. ~ Treatment + 
                       s (Day.in.experiment, k = 3) +
                       s (Day.in.experiment, by = Treatment, k = 3) +
                       s (Individual, bs = "re"), 
                     family = gaussian, data = data_subset)

r1 <- start_value_rho (model_weight, plot = TRUE, lag = 2)

model_weight_autocorrelation <- bam (Weight.sea.star..g. ~ Treatment + 
                                   s (Day.in.experiment, k = 3) +
                                   s (Day.in.experiment, by = Treatment, k = 3) +
                                   s (Individual, bs = "re"), 
                                 family = gaussian, data = data_subset,
                                 rho = r1, AR.start = data_subset$start.event)

И это код для модели активности:

model_righting <- bam (Time..sec. ~ Treatment + 
                         s (Day.in.experiment, k = 7) +
                         s (Day.in.experiment, by = Treatment, k = 7) +
                         s (Individual, bs = "re") +
                         s (Individual, Day.in.experiment, bs = "re"), 
                       family = gaussian, data = data_subset)

r1 <- start_value_rho (model_righting, plot = TRUE, lag = 2)

model_righting_autocorrelation <- bam (Time..sec. ~ Treatment + 
                                         s (Day.in.experiment, k = 7) +
                                         s (Day.in.experiment, by = Treatment, k = 7) +
                                         s (Individual, bs = "re")+
                                         s (Individual, Day.in.experiment, bs = "re"),
                                       family = gaussian, data = data_subset,
                                       rho = r1, AR.start = data_subset$start.event)

Чтобы построить модель, я сначала извлек соответствующие данные, а затем построил его с помощью ggplot (). Я привожу здесь код веса, но я поступил точно так же, чтобы поправить время. Для построения средних значений фактических данных я использовал другой файл с именем data_weight_mean.

data_model_weight_autocorrelation <- visreg (model_weight_autocorrelation, "Day.in.experiment", by = "Treatment",
                                             breaks = c ("NoHW", "THW", "TEHW"),
                                             gg = TRUE, overlay = TRUE, jitter = TRUE, lwd = 0.5,  
                                             rug = FALSE, partial = FALSE, plot = FALSE)

ggplot () +
  scale_fill_manual (breaks = c ("NoHW", "THW", "TEHW"),
                     values = c ("cadetblue3", "aquamarine3","goldenrod3"),
                     labels = c ("No Heatwave", "Ambient Heatwave", "Extended Heatwave")) +
  scale_color_manual (breaks = c ("NoHW", "THW", "TEHW"),
                      values = c ("cadetblue3", "aquamarine3","goldenrod3"),
                      labels = c ("No Heatwave", "Ambient Heatwave", "Extended Heatwave")) +
  geom_ribbon (data = data_model_weight_autocorrelation$fit, aes (x = Day.in.experiment,
                                                                  ymin = visregLwr, ymax = visregUpr, 
                                                                  fill = Treatment), alpha = 0.4, colour = "grey", size = 0.2) +
  geom_line (data = data_model_weight_autocorrelation$fit, aes (x = Day.in.experiment, y = visregFit, 
                                                                colour = Treatment),
             size = 1.1) +
  geom_point (data = data_weight_mean, aes (x = Day.in.experiment, y = Weight.sea.star..g., colour = Treatment),
              size = 1) +
  scale_y_continuous (limits = c (-2, 12),
                      breaks = c (0, 4, 8, 12),
                      labels = c (0, 4, 8, 12)) +
  labs (x = "\nDay of Experiment", y = expression (atop ("Weight [g]")),
        colour = "Treatment", fill = "Treatment") +
  theme_bw () +
  theme (panel.grid.major.x = element_blank (),
         panel.grid.minor.x = element_blank (),
         panel.grid.major.y = element_blank (),
         panel.grid.minor.y = element_blank (),
         legend.position = c (0.15, 0.85),
         legend.direction = "vertical",
         legend.title = element_text (colour = "black", size = 18),
         legend.text = element_text (colour = "black", size = 16),
         axis.line = element_line (),
         axis.title = element_text (colour = "black", size = 24),
         axis.text = element_text (colour = "black", size = 18))

Weight over experimental period Righting time over experimental period

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