Я работаю над экспериментальными данными, в которых я применял различные факторы стресса с течением времени (день эксперимента) к морским звездам. Я измерял вес в разные моменты времени, а также время их восстановления (активность). Я использовал 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))