Почему имена столбцов объединяются в выходные данные строки линейной модели? - PullRequest
2 голосов
/ 14 августа 2011

Я никогда раньше не замечал такого поведения, но меня удивляют соглашения об именовании выходных данных для сводок по линейной модели.По сути, мой вопрос заключается в том, почему имена строк в сводной линейной модели всегда содержат название столбца, из которого они получены.

Пример

Предположим, у вас есть данные для 300 зрителей фильмаучастники из трех разных городов:

  • Чикаго
  • Милуоки
  • Дейтон

И предположим, что все они были подвергнуты вонючей кучеиз запутанных, загрязненных отходов, которые были Человек-паук 3 .Выдержав всю эту кинематографическую мерзость, их попросили оценить фильм по 100-балльной шкале.

Поскольку все зрители были разумными людьми, все оценки были ниже нуля.(Естественно. Любой, кто видел фильм, согласится.)

Вот как это может выглядеть в R:

> score <- rnorm(n = 300, mean = -50, sd = 10)
> city  <- rep(c("Chicago", "Milwaukee", "Dayton"), times = 100)
> spider.man.3.sucked <- data.frame(score, city)
> head(spider.man.3.sucked)
      score      city
1 -64.57515   Chicago
2 -50.51050 Milwaukee
3 -56.51409    Dayton
4 -45.55133   Chicago
5 -47.88686 Milwaukee
6 -51.22812    Dayton

Отлично.Итак, давайте запустим быструю линейную модель, присвоим ей lm1 и получим ее итоговый вывод:

> lm1 <- lm(score ~ city, data = spider.man.3.sucked)
> summary(lm1)

Call:
lm(formula = score ~ city, data = spider.man.3.sucked)

Residuals:
     Min       1Q   Median       3Q      Max 
-29.8515  -6.1090  -0.4745   6.0340  26.2616 

Coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept)   -51.3621     0.9630 -53.337   <2e-16 ***
cityDayton      1.1892     1.3619   0.873    0.383    
cityMilwaukee   0.8288     1.3619   0.609    0.543    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 

Residual standard error: 9.63 on 297 degrees of freedom
Multiple R-squared: 0.002693,   Adjusted R-squared: -0.004023 
F-statistic: 0.4009 on 2 and 297 DF,  p-value: 0.6701

Что меня беспокоит

Часть, которую я хочу выделить, такова:

cityDayton      1.1892     1.3619   0.873    0.383    
cityMilwaukee   0.8288     1.3619   0.609    0.543    

Похоже, что R разумно сцепил имя столбца (city, если вы помните сверху) с отличным значением (в данном случае Dayton или Milwaukee).Если я не хочу, чтобы R выводил в этом формате, есть ли способ переопределить его?Например, в моем случае все, что мне нужно, это просто:

Dayton      1.1892     1.3619   0.873    0.383    
Milwaukee   0.8288     1.3619   0.609    0.543    

Два вопроса в одном

Итак,

  1. Что контролирует форматвывод для строк итоговой линейной модели и
  2. Можно / нужно изменить?

Ответы [ 3 ]

3 голосов
/ 14 августа 2011

Функция извлечения для этого компонента объекта сводки - coef. Предоставляет ли это средство для приемлемого контроля вашей продукции:

summ <- summary(lm1)
csumm <- coef(summ)
rownames(csumm) <- sub("^city", "", rownames(csumm))
print(csumm[-1,], digits=4)
#           Estimate Std. Error t value Pr(>|t|)
# Dayton      0.8133      1.485  0.5478   0.5842
# Milwaukee   0.3891      1.485  0.2621   0.7934

(Случайное начальное число не задано, поэтому не может соответствовать вашим значениям.)

3 голосов
/ 14 августа 2011

Для 1) это происходит внутри model.matrix.default() и внутри внутреннего R-скомпилированного кода.

Может быть трудно изменить это легко - очевидный способ - написать свой собственный model.matrix.default(), который вызывает model.matrix.default() и впоследствии обновляет имена. Но это не проверено и не проверено.

1 голос
/ 14 августа 2011

Вот хак

# RUN REGRESSION
require(ggplot2)
lm1 = lm(tip ~ total_bill + sex + day, data = tips)

# FUNCTION TO REMOVE FACTOR NAMES FROM MODEL SUMMARY
remove_factors = function(mod){
   mydf = mod$model    
   # PREPARE VECTOR OF VARIABLES WITH REPETITIONS = UNIQUE FACTOR LEVELS
   vars  = names(mod$model)[-1]
   eachlen = sapply(mydf[,vars,drop=F], function(x) 
     ifelse(is.numeric(x), 1, length(unique(x)) - 1))        
   vars = rep(vars, eachlen)

   # REPLACE COEF NAMES WITH VARIABLE NAME WHEN APPROPRIATE
   coefs = names(lm1$coefficients)[-1]
   coefs2 = stringr::str_replace(coefs, vars, "")
   names(mod$coefficients)[-1] = ifelse(coefs2 == "", coefs, coefs2)

   return(mod)
}

summary(remove_factors(lm1))

Это дает

              Estimate Std. Error t value Pr(>|t|)    
(Intercept)  0.95588    0.27579    3.47  0.00063 ***
total_bill   0.10489    0.00758   13.84  < 2e-16 ***
Male        -0.03844    0.14215   -0.27  0.78706    
Sat         -0.08088    0.26226   -0.31  0.75806    
Sun          0.08282    0.26741    0.31  0.75706    
Thur        -0.02063    0.26975   -0.08  0.93910 

Однако это не всегда рекомендуется делать, как вы можете видеть из одного и того же хака для другогорегрессия.Не ясно, что означает переменная Yes в фамилии.R по умолчанию записывает это как smokerYes, чтобы прояснить его значение.Так что используйте с осторожностью.

lm2 = lm(tip ~ total_bill + sex + day + smoker, data = tips)
summary(remove_factors(lm2))

              Estimate Std. Error t value Pr(>|t|)    
(Intercept)  1.05182    0.29315    3.59  0.00040 ***
total_bill   0.10569    0.00763   13.86  < 2e-16 ***
Male        -0.03769    0.14217   -0.27  0.79114    
Sat         -0.12636    0.26648   -0.47  0.63582    
Sun          0.00407    0.27959    0.01  0.98841    
Thur        -0.09283    0.27994   -0.33  0.74048    
Yes         -0.13935    0.14422   -0.97  0.33489
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...