Я пытаюсь нарисовать GAM в R, используя приведенный ниже код. Этот код всегда работал, и я мог нарисовать частичный эффект моего сглаженного термина, но случайно он больше не работает, постоянно вызывая эту ошибку:
Error in Ops.data.frame(guide_loc, panel_loc) :
‘==’ only defined for equally-sized data frames
Мой код выглядит следующим образом:
library(mgcv)
library(gratia)
gam1 <- mgcv::gam(mpg ~ cyl +
s(disp), data = mtcars, method = "REML")
draw(gam1)
# directly drawing function from the package also triggers the error
gratia::draw(gam1)
Сообщение об ошибке, которое я получаю, не имеет для меня смысла, поскольку я не понимаю, как оно влияет на размер кадра данных (или, по крайней мере, не на несколько кадров данных, как следует из формулировки).
Эта ошибка впервые возникла, когда я попытался взять производные модели и вместо этого нарисовать их с помощью следующего кода:
derivatives1 <- derivatives(gam1,
term = "s(disp)",
order = 1L,
type = "central",
n = 250,
eps = 1,
interval = "simultaneous",
n_sim = 500000,
unconditional = TRUE)
draw(derivatives1)
который рисует ту же ошибку:
Error in Ops.data.frame(guide_loc, panel_loc) :
‘==’ only defined for equally-sized data frames
Но теперь эта ошибка возникает каждый раз, когда я пытаюсь нарисовать игру или ее производные. Я попытался перезапустить r и выгрузить пакеты, чтобы убедиться, что это не связано с конфликтом пакетов, но ошибка все равно появляется.
Как я могу устранить эту ошибку и нарисовать свои GAM и производные от сглаживаний GAM?
Обновлять
Вот информация о моей сессии:
R version 4.3.3 (2024-02-29)
Platform: aarch64-apple-darwin20 (64-bit)
Running under: macOS Sonoma 14.4
Matrix products: default
BLAS: /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libBLAS.dylib
LAPACK: /Library/Frameworks/R.framework/Versions/4.3-arm64/Resources/lib/libRlapack.dylib; LAPACK version 3.11.0
locale:
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8
time zone: America/New_York
tzcode source: internal
attached base packages:
[1] grid stats graphics grDevices utils datasets methods base
other attached packages:
[1] kableExtra_1.3.4 mediation_4.5.0 mvtnorm_1.2-4 MASS_7.3-60.0.1 sandwich_3.1-0 schoenberg_2.0.3
[7] mgcViz_0.1.11 qgam_1.3.4 viridis_0.6.5 viridisLite_0.4.2 tidymv_3.4.2 scales_1.3.0
[13] gamm4_0.2-6 mgcv_1.9-1 nlme_3.1-164 modelsummary_1.4.1 sjPlot_2.8.14 ggpubr_0.6.0
[19] gridExtra_2.3 lme4_1.1-35.2 Matrix_1.6-5 countrycode_1.5.0 labelled_2.11.0 haven_2.5.4
[25] lubridate_1.9.2 forcats_1.0.0 stringr_1.5.1 dplyr_1.1.4 purrr_1.0.2 readr_2.1.5
[31] tidyr_1.3.1 tibble_3.2.1 ggplot2_3.5.0 tidyverse_2.0.0 gratia_0.9.0
Обновление 2
Вот отслеживание ошибки из чистого сеанса, в котором загружаются только mgcv
и gratia
:
10: stop(gettextf("%s only defined for equally-sized data frames",
sQuote(.Generic)), domain = NA)
9: Ops.data.frame(guide_loc, panel_loc)
8: unlist(guide_loc == panel_loc)
7: add_guides(gt, guides == "collect")
6: plot_table.ggplot(X[[i]], ...)
5: FUN(X[[i]], ...)
4: lapply(x$plots, plot_table, guides = guides)
3: build_patchwork(plot, plot$layout$guides %||% "auto")
2: print.patchwork(x)
1: (function (x, ...)
UseMethod("print"))(x)
и вот информация о сеансе для этого чистого сеанса:
R version 4.3.3 (2024-02-29)
Platform: aarch64-apple-darwin20 (64-bit)
Running under: macOS Sonoma 14.4
Matrix products: default
BLAS: /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libBLAS.dylib
LAPACK: /Library/Frameworks/R.framework/Versions/4.3-arm64/Resources/lib/libRlapack.dylib; LAPACK version 3.11.0
locale:
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8
time zone: America/New_York
tzcode source: internal
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] gratia_0.9.0 mgcv_1.9-1 nlme_3.1-164
loaded via a namespace (and not attached):
[1] Matrix_1.6-5 mvnfast_0.2.8 gtable_0.3.4 dplyr_1.1.4 compiler_4.3.3 tidyselect_1.2.1
[7] Rcpp_1.0.12 stringr_1.5.1 tidyr_1.3.1 splines_4.3.3 scales_1.3.0 yaml_2.3.8
[13] fastmap_1.1.1 lattice_0.22-5 ggplot2_3.5.0 R6_2.5.1 labeling_0.4.3 generics_0.1.3
[19] patchwork_1.1.3 knitr_1.45 tibble_3.2.1 munsell_0.5.0 RColorBrewer_1.1-3 pillar_1.9.0
[25] rlang_1.1.3 utf8_1.2.4 stringi_1.8.3 xfun_0.43 cli_3.6.2 withr_3.0.0
[31] magrittr_2.0.3 digest_0.6.35 grid_4.3.3 rstudioapi_0.16.0 lifecycle_1.0.4 ggokabeito_0.1.0
[37] vctrs_0.6.5 evaluate_0.23 glue_1.7.0 farver_2.1.1 fansi_1.0.6 colorspace_2.1-0
[43] purrr_1.0.2 rmarkdown_2.26 tools_4.3.3 pkgconfig_2.0.3 htmltools_0.5.8.1
У вас должна быть либо старая версия {gratia} (хотя я сомневаюсь, что когда-либо видел сообщение об этой ошибке для версии пакета, выпущенной CRAN — если вы установили с GitHub, обновите свой пакет из CRAN, чтобы получить версию 0.9.0 ) или загружен какой-либо другой пакет, который маскирует или иным образом плохо взаимодействует с {gratia}.
С выпуском CRAN {gratia} я не могу воспроизвести вашу проблему.
r$> library(mgcv)
library(gratia)
gam1 <- mgcv::gam(mpg ~ cyl +
s(disp), data = mtcars, method = "REML")
draw(gam1)
# directly drawing function from the package also triggers the error
gratia::draw(gam1)
Loading required package: nlme
This is mgcv 1.9-1. For overview type 'help("mgcv-package")'.
r$> derivatives1 <- derivatives(gam1,
term = "s(disp)",
order = 1L,
type = "central",
n = 250,
eps = 1,
interval = "simultaneous",
n_sim = 500000,
unconditional = TRUE)
draw(derivatives1)
Warning message:
The `term` argument of `derivatives()` is deprecated as of gratia 0.8.9.9.
ℹ Please use the `select` argument of `derivativess()` instead.
This warning is displayed once every 8 hours.
Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
generated.
(Вы можете игнорировать предупреждение; если оно вас беспокоит, измените term = "s(disp)"
на select = "s(disp)"
.
Можете ли вы разместить свой sessionInfo()
в своем вопросе, пожалуйста: было бы хорошо знать, используете ли вы последнюю версию R, а если нет, это может ограничить версию Gratia, до которой вы можете установить/обновить.
Я обновил вопрос информацией о сеансе. Я действительно использовал немного более старую версию, но, к сожалению, после обновления ошибка все еще возникает.
@flâneur, можешь попробовать запустить чистую сессию; у вас загружено довольно много пакетов, которые не предназначены для благодарности. В чистом сеансе просто загрузите mgcv и gratia и запустите свою модель. Если ошибка не исчезнет, значит, что-то не так, но я подозреваю, что вы обнаружите, что ошибка исчезла, и если это так, это означает, что один из других загруженных вами пакетов является причиной проблемы. Сузить это было бы полезно (поскольку я мог бы что-то с этим сделать), но вы, возможно, не захотите тратить все это время на загрузку комбинаций пакетов, чтобы определить источник ошибки.
@flâneur Еще одним полезным выводом будет отслеживание момента, когда вы получили ошибку. Сразу после того, как вы получите сообщение об ошибке, запустите traceback()
и опубликуйте результат в своем вопросе, и я посмотрю, выделится ли что-нибудь.
Спасибо за ваше постоянное терпение и преданность этому делу. Я обновил вопрос, добавив информацию о трассировке и сеансе для чистого сеанса (в данном случае также совершенно новый проект r и файл .rmd).
Вероятно, это проблема с ggplot и/или патчворком. Обязательно обновите все свои пакеты; ваш ggplot устарел, например, текущая версия 3.5.1. В общем, R, начните новый чистый сеанс, запустите update.packages(ask = FALSE, checkBuilt = TRUE, Ncpus = 3)
настройку Ncpus
для любого количества ядер ЦП, которое вы хотите использовать параллельно, и дайте ему поработать. Почти наверняка это проблема из-за несовместимости пакетов, поскольку не все из них обновлены.
Это сработало! Огромное вам спасибо за то, что нашли время разобраться в этой простой ошибке с моей стороны. Я действительно ценю это. Кроме того, я должен сказать, что, помимо всего прочего, ваш gratia
пакет просто звездный!
Спасибо @flâneur и рад, что мы это выяснили
Спасибо за ответ и объяснение. Как ни странно, я попытался перезапустить R, загрузить из CRAN, чтобы убедиться, что я обновился до 0.9.0, и не загружено никаких других пакетов, кроме базового r, но я все равно получаю ту же ошибку:
Error in Ops.data.frame(guide_loc, panel_loc) : ‘==’ only defined for equally-sized data frames