#r #lm
#r #lm
Вопрос:
Я ищу способ редактирования lm
и summary.lm
обработки переменных факторов перед печатью. Например, я хочу, чтобы коэффициент типа Month: 6
not Month6
— so добавлял дополнительное пространство и :
между именем переменной и уровнем фактора. Я НЕ хочу разделять факторную переменную на отдельные столбцы , подобные model.matrix
.
Лучше всего будет сделать это до оценки lm, а также после этого и раньше summary.lm
.
Пример:
> aa = airquality
> aa$Month = as.factor(aa$Month)
> # possible action
> ll = lm(Ozone~Month, aa)
> # possible action
> ss = summary(ll)
> ss
Call:
lm(formula = Ozone ~ Month, data = aa)
Residuals:
Min 1Q Median 3Q Max
-52.115 -16.823 -7.282 13.125 108.038
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 23.615 5.759 4.101 7.87e-05 ***
Month6 5.829 11.356 0.513 0.609
Month7 35.500 8.144 4.359 2.93e-05 ***
Month8 36.346 8.144 4.463 1.95e-05 ***
Month9 7.833 7.931 0.988 0.325
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 29.36 on 111 degrees of freedom
(37 observations deleted due to missingness)
Multiple R-squared: 0.2352, Adjusted R-squared: 0.2077
F-statistic: 8.536 on 4 and 111 DF, p-value: 4.827e-06
Комментарии:
1. Это больше похоже на взлом, но, возможно, вы можете попробовать
aa$Month = interaction("", as.factor(aa$Month), sep = ":"); summary(lm(Ozone~Month, aa))
Ответ №1:
Вы можете перезаписать names
атрибут coefficients
элемента ll
объекта:
names(ll$coefficients) <- gsub("^(.*)(\d)$", "\1: \2", names(ll$coefficients))
Это означает, что вы получаете:
ll
#> Call:
#> lm(formula = Ozone ~ Month, data = aa)
#>
#> Coefficients:
#> (Intercept) Month: 6 Month: 7 Month: 8 Month: 9
#> 23.615 5.829 35.500 36.346 7.833
и
summary(ll)
#> Call:
#> lm(formula = Ozone ~ Month, data = aa)
#>
#> Residuals:
#> Min 1Q Median 3Q Max
#> -52.115 -16.823 -7.282 13.125 108.038
#>
#> Coefficients:
#> Estimate Std. Error t value Pr(>|t|)
#> (Intercept) 23.615 5.759 4.101 7.87e-05 ***
#> Month: 6 5.829 11.356 0.513 0.609
#> Month: 7 35.500 8.144 4.359 2.93e-05 ***
#> Month: 8 36.346 8.144 4.463 1.95e-05 ***
#> Month: 9 7.833 7.931 0.988 0.325
#> ---
#> Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
#>
#> Residual standard error: 29.36 on 111 degrees of freedom
#> (37 observations deleted due to missingness)
#> Multiple R-squared: 0.2352, Adjusted R-squared: 0.2077
#> F-statistic: 8.536 on 4 and 111 DF, p-value: 4.827e-06
Для более общего решения мы можем gsub
использовать имена, которые мы находим в contrasts
, с именами, которые мы находим в coefficients
(с изменениями, предложенными OP):
iris2 <- iris
iris2$Species2 <- sample(unique(iris$Species), nrow(iris2), TRUE)
ll <- lm(Sepal.Length ~ Species, iris2)
for(i in names(ll$contrasts)) {
alts <- paste0(levels(iris2[[i]]), collapse = "|")
names(ll$coefficients) <- gsub(glue::glue("^({i})((?:{alts}))$"),
paste0("\1", ": ", "\2"), names(ll$coefficients))
}
summary(ll)
#>
#> Call:
#> lm(formula = Sepal.Length ~ Sepal.Width Species Species2,
#> data = iris2)
#>
#> Residuals:
#> Min 1Q Median 3Q Max
#> -1.27817 -0.25460 -0.06713 0.21136 1.44653
#>
#> Coefficients:
#> Estimate Std. Error t value Pr(>|t|)
#> (Intercept) 2.37909 0.37679 6.314 3.17e-09 ***
#> Sepal.Width 0.75297 0.11084 6.793 2.68e-10 ***
#> Species: versicolor 1.42257 0.11514 12.355 < 2e-16 ***
#> Species: virginica 1.93784 0.10043 19.296 < 2e-16 ***
#> Species2: versicolor 0.11452 0.08981 1.275 0.204
#> Species2: virginica -0.02119 0.09440 -0.224 0.823
#> ---
#> Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
#>
#> Residual standard error: 0.4368 on 144 degrees of freedom
#> Multiple R-squared: 0.7311, Adjusted R-squared: 0.7217
#> F-statistic: 78.3 on 5 and 144 DF, p-value: < 2.2e-16
Создано 2020-11-30 пакетом reprex (версия 0.3.0)
Комментарии:
1. Спасибо за хорошую попытку, это был всего лишь пример. Что делать, когда уровни факторов являются символами, а не числами. посмотри на это
library(ggplot2) ll = lm(price~color, diamonds) names(ll$coefficients) <- gsub("^(.*)(\d)$", "\1: \2", names(ll$coefficients)) ll
. Конечно, я не хочу изменять их вручную один за другим для каждой факторной переменной.2. @polkas это странный пример, потому что это упорядоченный фактор. Коэффициенты в модели не соответствуют уровням коэффициентов, с которыми они печатаются
diamonds$color
. Но смотрите Мое Обновление для более общего решения.3. Да, я думаю о персонажах для уровней, хотя упорядоченные факторы нарушают sth. Я хочу указать разницу в числах / символах для факторов.
4. Этот цикл между именами (ll $contrasts) является ключом к решению этой проблемы.
5. Я должен отменить утверждение, потому что этот метод небезопасен — регулярное выражение.
iris2 <- iris iris2$Species2 <- sample(unique(iris$Species), nrow(iris2), T) ll <- lm(Sepal.Length ~ Species Species2, iris2) for(i in names(ll$contrasts)) { names(ll$coefficients) <- gsub(i, paste0(i, ": "), names(ll$coefficients)) } summary(ll)
. Переменные с одинаковым именем детали будут разбиты.