之前我从未注意过这种行为,但我对线性模型摘要的输出命名约定感到惊讶。基本上,我的问题是为什么线性模型摘要中的行名称似乎总是带有它们来自的列的名称。
假设您有来自三个不同城市的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
所以,
答案 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