Attaching package: 'dplyr'
The following objects are masked from 'package:stats':
filter, lag
The following objects are masked from 'package:base':
intersect, setdiff, setequal, union
Loading required package: lme4
Loading required package: Matrix
Attaching package: 'lmerTest'
The following object is masked from 'package:lme4':
lmer
The following object is masked from 'package:stats':
step
── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
✔ forcats 1.0.0 ✔ readr 2.1.5
✔ ggplot2 3.5.1 ✔ stringr 1.5.1
✔ lubridate 1.9.3 ✔ tibble 3.2.1
✔ purrr 1.0.2 ✔ tidyr 1.3.1
── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
✖ tidyr::expand() masks Matrix::expand()
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag() masks stats::lag()
✖ tidyr::pack() masks Matrix::pack()
✖ tidyr::unpack() masks Matrix::unpack()
ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(modelr)
library(purrr)
library(emmeans)
Welcome to emmeans.
Caution: You lose important information if you filter this package's results.
See '? untidy'
Attaching package: 'gridExtra'
The following object is masked from 'package:dplyr':
combine
library(writexl)
library(gt)
library(webshot2)
library(broom.mixed)
library(ggplot2)
library(isotree)
library(tidyr)
library(ggforce)
# Need to create a new wide df
features_to_use_mean <- c("Rightmost.X", "Width")
df_subset_mean <- df_10min_raw %>%
select(sow, ttf, feature, mean_value)
df_wide_mean <- df_subset_mean %>%
filter(feature %in% features_to_use_mean) %>%
pivot_wider(
names_from = feature,
values_from = mean_value,
names_glue = "{feature}_mean"
) %>%
select(sow,ttf,Width_mean,Rightmost.X_mean)
features_to_use_var <- c("Centroid.X", "Height","Major.Axis.Length","Rightmost.X","Width")
df_subset_var <- df_10min_raw %>%
select(sow, ttf, feature, var_value)
df_wide_var <- df_subset_var %>%
filter(feature %in% features_to_use_var) %>%
pivot_wider(
names_from = feature,
values_from = var_value,
names_glue = "{feature}_var"
) %>%
select(sow,ttf,Centroid.X_var, Height_var,Major.Axis.Length_var,Rightmost.X_var,Width_var)
df_wide_10 <- df_wide_mean %>%
left_join(df_wide_var,by=c("sow","ttf"))
colnames((df_wide_10))
[1] "sow" "ttf" "Width_mean"
[4] "Rightmost.X_mean" "Centroid.X_var" "Height_var"
[7] "Major.Axis.Length_var" "Rightmost.X_var" "Width_var"
find_max<-function(x,y){
min_pos<-x[which.max(y)]
return(min_pos)
}
sowid <- c(4,6,8,10,12,18,22,24,26)
for (i in sowid){
sow12 <- df_wide_10 %>%
filter(sow == i)
# Baseline
baseline12 <- sow12 %>%
filter(between(ttf, -120, -50)) %>%
ungroup()
# Isolation Forest
model12 <- isolation.forest(
data = baseline12 %>% select(-sow, -ttf),
ntrees = 500
)
# Predict
newdata12 <- sow12
newdata12$anomaly_score <- predict(
model12,
newdata = newdata12 %>% select(-sow, -ttf)
)
# LOESS (simplified)
lo <- loess(anomaly_score ~ ttf, data = newdata12,span=0.75)
newdata12$fitted <- lo$fitted
# Hour binning
df_fitted <- newdata12 %>%
mutate(ttf_hour = floor(ttf)) %>%
filter(ttf_hour >= -120 & ttf_hour <= 0)
# Hourly summary
hourly_summary <- df_fitted %>%
group_by(ttf_hour) %>%
summarise(mean_fitted = mean(fitted, na.rm = TRUE)) %>%
arrange(ttf_hour) %>%
mutate(
change_from_prev = mean_fitted - lag(mean_fitted),
trend = case_when(
change_from_prev > 0 ~ "higher",
change_from_prev < 0 ~ "lower",
TRUE ~ "same"
)
)
# Max anomaly location
mns <- df_fitted %>%
summarise(mx_loc = ttf[which.max(fitted)])
# Plot
print(
ggplot(newdata12, aes(ttf, fitted)) +
geom_point() +
#geom_smooth() +
geom_vline(xintercept = -50)+
geom_vline(xintercept = mns$mx_loc, color="red")+
ggtitle(paste("sow",i,"peak at",mns$mx_loc))
)
cat("\nLast 27 hourly rows for Sow", i, "\n")
print(tail(hourly_summary,27))
print(tail(hourly_summary,17))
}
Last 27 hourly rows for Sow 4
# A tibble: 27 × 4
ttf_hour mean_fitted change_from_prev trend
<dbl> <dbl> <dbl> <chr>
1 -26 0.474 0.000552 higher
2 -25 0.474 0.000398 higher
3 -24 0.474 0.000230 higher
4 -23 0.474 0.0000498 higher
5 -22 0.474 -0.000116 lower
6 -21 0.474 -0.000259 lower
7 -20 0.474 -0.000391 lower
8 -19 0.473 -0.000514 lower
9 -18 0.473 -0.000627 lower
10 -17 0.472 -0.000730 lower
# ℹ 17 more rows
# A tibble: 17 × 4
ttf_hour mean_fitted change_from_prev trend
<dbl> <dbl> <dbl> <chr>
1 -16 0.471 -0.000824 lower
2 -15 0.470 -0.000908 lower
3 -14 0.469 -0.000982 lower
4 -13 0.468 -0.00105 lower
5 -12 0.467 -0.00110 lower
6 -11 0.466 -0.00115 lower
7 -10 0.465 -0.00118 lower
8 -9 0.463 -0.00121 lower
9 -8 0.462 -0.00122 lower
10 -7 0.461 -0.00123 lower
11 -6 0.460 -0.00123 lower
12 -5 0.458 -0.00122 lower
13 -4 0.457 -0.00119 lower
14 -3 0.456 -0.00116 lower
15 -2 0.455 -0.00112 lower
16 -1 0.454 -0.00107 lower
17 0 0.453 -0.00104 lower
Last 27 hourly rows for Sow 6
# A tibble: 27 × 4
ttf_hour mean_fitted change_from_prev trend
<dbl> <dbl> <dbl> <chr>
1 -26 0.473 0.00177 higher
2 -25 0.474 0.00171 higher
3 -24 0.476 0.00164 higher
4 -23 0.477 0.00154 higher
5 -22 0.479 0.00143 higher
6 -21 0.480 0.00130 higher
7 -20 0.481 0.00116 higher
8 -19 0.482 0.000991 higher
9 -18 0.483 0.000809 higher
10 -17 0.484 0.000609 higher
# ℹ 17 more rows
# A tibble: 17 × 4
ttf_hour mean_fitted change_from_prev trend
<dbl> <dbl> <dbl> <chr>
1 -16 0.484 0.000391 higher
2 -15 0.484 0.000177 higher
3 -14 0.484 -0.000000488 lower
4 -13 0.484 -0.000163 lower
5 -12 0.484 -0.000315 lower
6 -11 0.483 -0.000456 lower
7 -10 0.483 -0.000585 lower
8 -9 0.482 -0.000704 lower
9 -8 0.481 -0.000811 lower
10 -7 0.480 -0.000908 lower
11 -6 0.479 -0.000993 lower
12 -5 0.478 -0.00107 lower
13 -4 0.477 -0.00113 lower
14 -3 0.476 -0.00118 lower
15 -2 0.475 -0.00122 lower
16 -1 0.474 -0.00125 lower
17 0 0.472 -0.00127 lower
Last 27 hourly rows for Sow 8
# A tibble: 27 × 4
ttf_hour mean_fitted change_from_prev trend
<dbl> <dbl> <dbl> <chr>
1 -26 0.509 0.00231 higher
2 -25 0.511 0.00195 higher
3 -24 0.512 0.00155 higher
4 -23 0.513 0.00119 higher
5 -22 0.514 0.00103 higher
6 -21 0.515 0.000919 higher
7 -20 0.516 0.000809 higher
8 -19 0.517 0.000702 higher
9 -18 0.517 0.000599 higher
10 -17 0.518 0.000499 higher
# ℹ 17 more rows
# A tibble: 17 × 4
ttf_hour mean_fitted change_from_prev trend
<dbl> <dbl> <dbl> <chr>
1 -16 0.518 0.000402 higher
2 -15 0.519 0.000309 higher
3 -14 0.519 0.000219 higher
4 -13 0.519 0.000133 higher
5 -12 0.519 0.0000497 higher
6 -11 0.519 -0.0000299 lower
7 -10 0.519 -0.000106 lower
8 -9 0.519 -0.000179 lower
9 -8 0.518 -0.000248 lower
10 -7 0.518 -0.000315 lower
11 -6 0.518 -0.000377 lower
12 -5 0.517 -0.000436 lower
13 -4 0.517 -0.000492 lower
14 -3 0.516 -0.000545 lower
15 -2 0.516 -0.000594 lower
16 -1 0.515 -0.000644 lower
17 0 0.514 -0.000763 lower
Last 27 hourly rows for Sow 10
# A tibble: 27 × 4
ttf_hour mean_fitted change_from_prev trend
<dbl> <dbl> <dbl> <chr>
1 -26 0.483 0.00168 higher
2 -25 0.485 0.00164 higher
3 -24 0.486 0.00159 higher
4 -23 0.488 0.00152 higher
5 -22 0.489 0.00144 higher
6 -21 0.490 0.00135 higher
7 -20 0.492 0.00125 higher
8 -19 0.493 0.00113 higher
9 -18 0.494 0.00100 higher
10 -17 0.495 0.000863 higher
# ℹ 17 more rows
# A tibble: 17 × 4
ttf_hour mean_fitted change_from_prev trend
<dbl> <dbl> <dbl> <chr>
1 -16 0.495 0.000709 higher
2 -15 0.496 0.000542 higher
3 -14 0.496 0.000359 higher
4 -13 0.497 0.000161 higher
5 -12 0.496 -0.0000256 lower
6 -11 0.496 -0.000198 lower
7 -10 0.496 -0.000355 lower
8 -9 0.495 -0.000497 lower
9 -8 0.495 -0.000624 lower
10 -7 0.494 -0.000736 lower
11 -6 0.493 -0.000834 lower
12 -5 0.492 -0.000916 lower
13 -4 0.491 -0.000983 lower
14 -3 0.490 -0.00104 lower
15 -2 0.489 -0.00107 lower
16 -1 0.488 -0.00110 lower
17 0 0.487 -0.00110 lower
Last 27 hourly rows for Sow 12
# A tibble: 27 × 4
ttf_hour mean_fitted change_from_prev trend
<dbl> <dbl> <dbl> <chr>
1 -26 0.481 0.0000143 higher
2 -25 0.481 -0.000188 lower
3 -24 0.481 -0.000376 lower
4 -23 0.480 -0.000549 lower
5 -22 0.480 -0.000708 lower
6 -21 0.479 -0.000851 lower
7 -20 0.478 -0.000980 lower
8 -19 0.477 -0.00109 lower
9 -18 0.476 -0.00119 lower
10 -17 0.474 -0.00128 lower
# ℹ 17 more rows
# A tibble: 17 × 4
ttf_hour mean_fitted change_from_prev trend
<dbl> <dbl> <dbl> <chr>
1 -16 0.473 -0.00135 lower
2 -15 0.472 -0.00140 lower
3 -14 0.470 -0.00144 lower
4 -13 0.469 -0.00147 lower
5 -12 0.467 -0.00148 lower
6 -11 0.466 -0.00148 lower
7 -10 0.464 -0.00146 lower
8 -9 0.463 -0.00142 lower
9 -8 0.461 -0.00138 lower
10 -7 0.460 -0.00131 lower
11 -6 0.459 -0.00124 lower
12 -5 0.458 -0.00115 lower
13 -4 0.457 -0.00116 lower
14 -3 0.455 -0.00129 lower
15 -2 0.454 -0.00142 lower
16 -1 0.452 -0.00153 lower
17 0 0.451 -0.00163 lower
Last 27 hourly rows for Sow 18
# A tibble: 27 × 4
ttf_hour mean_fitted change_from_prev trend
<dbl> <dbl> <dbl> <chr>
1 -26 0.453 0.00137 higher
2 -25 0.454 0.00117 higher
3 -24 0.456 0.00117 higher
4 -23 0.457 0.00121 higher
5 -22 0.458 0.00124 higher
6 -21 0.459 0.00125 higher
7 -20 0.460 0.00126 higher
8 -19 0.462 0.00126 higher
9 -18 0.463 0.00125 higher
10 -17 0.464 0.00123 higher
# ℹ 17 more rows
# A tibble: 17 × 4
ttf_hour mean_fitted change_from_prev trend
<dbl> <dbl> <dbl> <chr>
1 -16 0.465 0.00121 higher
2 -15 0.467 0.00117 higher
3 -14 0.468 0.00112 higher
4 -13 0.469 0.00107 higher
5 -12 0.470 0.00100 higher
6 -11 0.471 0.000926 higher
7 -10 0.472 0.000843 higher
8 -9 0.472 0.000751 higher
9 -8 0.473 0.000649 higher
10 -7 0.473 0.000538 higher
11 -6 0.474 0.000418 higher
12 -5 0.474 0.000288 higher
13 -4 0.474 0.000150 higher
14 -3 0.474 0.00000242 higher
15 -2 0.474 -0.000147 lower
16 -1 0.474 -0.000287 lower
17 0 0.473 -0.000416 lower
Last 27 hourly rows for Sow 22
# A tibble: 27 × 4
ttf_hour mean_fitted change_from_prev trend
<dbl> <dbl> <dbl> <chr>
1 -26 0.484 0.00102 higher
2 -25 0.485 0.000612 higher
3 -24 0.485 0.000184 higher
4 -23 0.485 -0.000160 lower
5 -22 0.485 -0.000439 lower
6 -21 0.484 -0.000698 lower
7 -20 0.483 -0.000938 lower
8 -19 0.482 -0.00116 lower
9 -18 0.480 -0.00136 lower
10 -17 0.479 -0.00154 lower
# ℹ 17 more rows
# A tibble: 17 × 4
ttf_hour mean_fitted change_from_prev trend
<dbl> <dbl> <dbl> <chr>
1 -16 0.477 -0.00171 lower
2 -15 0.475 -0.00185 lower
3 -14 0.473 -0.00197 lower
4 -13 0.471 -0.00208 lower
5 -12 0.469 -0.00217 lower
6 -11 0.467 -0.00223 lower
7 -10 0.465 -0.00228 lower
8 -9 0.462 -0.00231 lower
9 -8 0.460 -0.00232 lower
10 -7 0.458 -0.00231 lower
11 -6 0.455 -0.00228 lower
12 -5 0.453 -0.00223 lower
13 -4 0.451 -0.00217 lower
14 -3 0.449 -0.00208 lower
15 -2 0.447 -0.00198 lower
16 -1 0.445 -0.00193 lower
17 0 0.443 -0.00210 lower
Last 27 hourly rows for Sow 24
# A tibble: 27 × 4
ttf_hour mean_fitted change_from_prev trend
<dbl> <dbl> <dbl> <chr>
1 -26 0.467 0.00289 higher
2 -25 0.470 0.00276 higher
3 -24 0.472 0.00259 higher
4 -23 0.475 0.00239 higher
5 -22 0.477 0.00215 higher
6 -21 0.479 0.00187 higher
7 -20 0.480 0.00156 higher
8 -19 0.482 0.00122 higher
9 -18 0.482 0.000838 higher
10 -17 0.483 0.000422 higher
# ℹ 17 more rows
# A tibble: 17 × 4
ttf_hour mean_fitted change_from_prev trend
<dbl> <dbl> <dbl> <chr>
1 -16 0.483 0.0000303 higher
2 -15 0.483 -0.000258 lower
3 -14 0.482 -0.000516 lower
4 -13 0.481 -0.000756 lower
5 -12 0.480 -0.000978 lower
6 -11 0.479 -0.00118 lower
7 -10 0.478 -0.00137 lower
8 -9 0.476 -0.00153 lower
9 -8 0.475 -0.00168 lower
10 -7 0.473 -0.00181 lower
11 -6 0.471 -0.00192 lower
12 -5 0.469 -0.00202 lower
13 -4 0.467 -0.00209 lower
14 -3 0.465 -0.00215 lower
15 -2 0.462 -0.00219 lower
16 -1 0.460 -0.00220 lower
17 0 0.458 -0.00221 lower
Last 27 hourly rows for Sow 26
# A tibble: 27 × 4
ttf_hour mean_fitted change_from_prev trend
<dbl> <dbl> <dbl> <chr>
1 -26 0.474 0.00132 higher
2 -25 0.475 0.00132 higher
3 -24 0.477 0.00134 higher
4 -23 0.478 0.00135 higher
5 -22 0.479 0.00135 higher
6 -21 0.481 0.00133 higher
7 -20 0.482 0.00131 higher
8 -19 0.483 0.00128 higher
9 -18 0.485 0.00123 higher
10 -17 0.486 0.00118 higher
# ℹ 17 more rows
# A tibble: 17 × 4
ttf_hour mean_fitted change_from_prev trend
<dbl> <dbl> <dbl> <chr>
1 -16 0.487 0.00111 higher
2 -15 0.488 0.00104 higher
3 -14 0.489 0.000947 higher
4 -13 0.490 0.000849 higher
5 -12 0.491 0.000739 higher
6 -11 0.491 0.000619 higher
7 -10 0.492 0.000488 higher
8 -9 0.492 0.000346 higher
9 -8 0.492 0.000193 higher
10 -7 0.492 0.0000294 higher
11 -6 0.492 -0.000145 lower
12 -5 0.492 -0.000330 lower
13 -4 0.491 -0.000535 lower
14 -3 0.490 -0.000888 lower
15 -2 0.489 -0.00133 lower
16 -1 0.487 -0.00173 lower
17 0 0.485 -0.00210 lower