Предполагая mods
, показанное в конце заметки, и что нам нужен символьный вектор текстового представления формул с замененными коэффициентами, мы имеем следующее.
Функция fit2text
берет подобранный объект и выводит строку символов с текстовым представлением формулы.Аргумент round
дает количество цифр, до которых коэффициенты округляются в результате.Аргумент rmI
, если он равен TRUE, удаляет любое I (...) и просто оставляет ... внутри, предполагая, для простоты реализации, что выражение внутри не содержит скобок.Если FALSE, то I
не удаляется.
Другая статистика может быть извлечена из summary(mods[[1]])
или broom::glance(mods[[1]])
fit2text <- function(fit, round = 2, rmI = TRUE) {
fo <- formula(fit)
resp <- all.vars(fo)[1]
co <- round(coef(fit), round)
labs <- c(if (terms(fit, "intercept") == 1) "", labels(fit))
p <- gsub("\\+ *-", "- ", paste(resp, "~ ", paste(paste(co, labs), collapse = " + ")))
p2 <- if (rmI) gsub("I\\(([^)]+)\\)", "\\1", p) else p
gsub(" +", " ", p2)
}
sapply(mods, fit2text)
, давая:
fit1
"y ~ -0.11 - 0.05 x + 0.03 z"
fit2
"y ~ -0.07 - 0.05 x - 0.04 z^2"
fit3
"y ~ -0.11 - 0.43 poly(x, 3) - 1.05 z + 0.27 + 0.04 poly(x, 3)"
fit4
"y ~ -0.55 + 0.23 ns(x, 3) + 0.79 z - 0.25 + 0.04 ns(x, 3)"
Примечание
Код вВопрос не воспроизводился, поскольку отсутствовали вызовы библиотеки, использовались случайные числа без set.seed
и в коде были некоторые дальнейшие ошибки.Для ясности мы предоставляем следующий воспроизводимый код, который мы использовали для ввода данных для ответа выше.
library(splines)
set.seed(123)
d <- data.frame(x = rnorm(100, 0, 1),
y = rnorm(100, 0, 1),
z = rnorm(100, 0, 1))
# function to fit 5 models
func <-function(d){
fit1 <- lm( y~ x + z, data = d)
fit2 <- lm( y~x + I(z^2), data = d)
fit3 <- lm( y~poly(x,3) + z, data = d)
fit4 <- lm( y~ns(x, 3) + z, data = d)
l <- list(fit1, fit2, fit3, fit4)
names(l) <- paste0("fit", 1:4)
return(l)
}
mods <- func(d)