【问题标题】:Why do column names get concatenated into the row output of a linear model summary?为什么列名会连接到线性模型摘要的行输出中?
【发布时间】:2011-08-13 22:49:50
【问题描述】:

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

一个例子

假设您有来自三个不同城市的 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. 我可以/应该改变它吗?

【问题讨论】:

  • 您可能会发现生成模型预测更容易

标签: r


【解决方案1】:

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

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

【讨论】:

  • 对不起!我几乎总是设置一个随机种子。这次忘了:-(
  • 嘿。没关系;我只是注意到我忘了输入提取器函数调用。 (固定)
  • coef 绝对有帮助,我已经忘记了。是的,这完全可以作为一种解决方案。如果人们试图生成一份精美的报告,他们通常会做什么?无论如何,这个摘要是否会被转换为精美的 TeX/Sweave 表,从而使命名点变得毫无意义?
  • 漂亮的打印机制有很多种。但是,它们不会自动发生。 Hmisc 有latex 等格式化函数。查看 xtable::xtable 以获取 html 或 Latex 输出。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    这是一个技巧

    # 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 
    

    但是,这样做并不总是可取的,正如您可以从针对不同回归运行相同的 hack 中看到的那样。目前尚不清楚姓氏中的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
    

    【讨论】:

      猜你喜欢
      • 2021-12-19
      • 2021-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多