R 为什么列名会连接到线性模型摘要的行输出中?
我以前从未注意到这种行为,但我对线性模型摘要的输出命名约定感到惊讶。从本质上讲,我的问题是为什么线性模型摘要中的行名称似乎总是带有它们来自的列的名称 一个例子 假设您有来自三个不同城市的300名电影观众的数据:R 为什么列名会连接到线性模型摘要的行输出中?,r,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
两个问题合一
所以
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