Настраиваемые коэффициенты печати / контрасты для пленки

#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) . Переменные с одинаковым именем детали будут разбиты.