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

R 为什么列名会连接到线性模型摘要的行输出中?,r,R,我以前从未注意到这种行为,但我对线性模型摘要的输出命名约定感到惊讶。从本质上讲,我的问题是为什么线性模型摘要中的行名称似乎总是带有它们来自的列的名称 一个例子 假设您有来自三个不同城市的300名电影观众的数据: 芝加哥 密尔沃基 代顿 假设他们都受到了一堆臭烘烘的、令人困惑的、被污染的废物的影响,那就是《蜘蛛侠3》。在忍受了这部令人厌恶的电影之后,他们被要求对这部电影进行100分评分 因为所有的观众都是通情达理的人,所以收视率都低于零。(当然,看过这部电影的人都会同意。) 下面是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
什么事让我心烦 我想强调的是:

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)它似乎发生在
    model.matrix.default()
    和内部R编译代码中


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

    摘要对象的该组件的提取器函数是
    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
    
    summ这里有一个黑客

    # 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 
    

    您可能会发现生成模型预测更容易对不起!我几乎总是随机设定一个种子。这次忘了:-(嘿,没关系;我刚刚注意到我忘了输入提取器函数调用。(已修复)
    coef
    肯定很有帮助,我已经忘记了。是的,这完全是一个解决方案。如果人们试图生成一个精巧的报告,通常会做什么?这个摘要会转换成一个漂亮的TeX/swave表吗,从而使命名点变得毫无意义?有各种漂亮的打印机制但是,y不会自动发生。Hmisc具有
    latex
    和其他格式化函数。查看
    xtable::xtable
    以获取html或latex输出。
                  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 
    
    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