为什么列名称会连接到线性模型摘要的行输出中?

时间:2011-08-13 22:49:50

标签: r

之前我从未注意过这种行为,但我对线性模型摘要的输出命名约定感到惊讶。基本上,我的问题是为什么线性模型摘要中的行名称似乎总是带有它们来自的列的名称。

一个例子

假设您有来自三个不同城市的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,如果您从上面记得的话)与不同的值(在这种情况下为DaytonMilwaukee)连接起来。如果我不希望R以该格式输出,有没有办法覆盖它?例如,就我而言,我所需要的只是:

Dayton      1.1892     1.3619   0.873    0.383    
Milwaukee   0.8288     1.3619   0.609    0.543    

一个

中的两个问题

所以,

  1. 什么控制线性模型摘要行的输出格式,
  2. 可以/我应该更改吗?

3 个答案:

答案 0 :(得分:3)

对于1)它似乎发生在model.matrix.default()内部和内部R编译代码中。

可能很难轻易改变 - 显而易见的方法是编写自己的model.matrix.default()来调用model.matrix.default()并在之后更新名称。但这没有经过测试或尝试过。

答案 1 :(得分:3)

摘要对象的该组件的提取器函数是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

(未设置随机种子,因此无法与您的值匹配。)

答案 2 :(得分:1)

这是一个黑客

# 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