r - 有没有办法在映射回归期间忽略一级因素(对于某些子集)?
问题描述
我想对数据框的子集(大约 100 个职业的子集)进行一系列线性回归。解释变量之一是因子。对于某些子集(即职业),这个因素只有一个级别,但我尽可能包括在内是非常重要的。当我拆分数据并映射回归时,我得到一个关于对比的错误。我知道为什么会发生这种情况,但是有没有办法尝试在公式中使用解释性分类变量,但如果它们只有一个级别,则将其删除?
我看过有关调试此错误的帖子,但这并不能说明我正在尝试的映射组件。
library(tidyverse)
# Create reprex data
# Here, there are only male plumbers, which will cause a problem later
df <- tibble(wage = rnorm(10, 100, 15),
occupation = c(rep("Plumber", 5),
rep("Electrician", 5)),
hours = rnorm(10, 40, 5),
sex = c(rep("Male", 5),
rep("Male", 2),
rep("Female", 3)))
glimpse(df)
#> Observations: 10
#> Variables: 4
#> $ wage <dbl> 107.69546, 117.79401, 102.75925, 108.66250, 100.716...
#> $ occupation <chr> "Plumber", "Plumber", "Plumber", "Plumber", "Plumbe...
#> $ hours <dbl> 51.73202, 37.13047, 38.20627, 41.00303, 39.14806, 3...
#> $ sex <chr> "Male", "Male", "Male", "Male", "Male", "Male", "Ma...
# Split the df by occupation and run a regression to explain wages
df %>%
split(.$occupation) %>%
map(~lm(wage ~ hours + sex,
data = .))
#> Error in `contrasts<-`(`*tmp*`, value = contr.funs[1 + isOF[nn]]): contrasts can be applied only to factors with 2 or more levels
由reprex 包(v0.3.0)于 2019 年 8 月 23 日创建
我知道为什么会发生对比错误(因为水管工分裂中只有男性),但是有没有办法将“性”包裹在某种东西中,以便在可以使用的情况下使用它,如果不能使用则丢弃?或者除了split
&之外还有什么语法map
可以用来做我想做的事吗?
谢谢。
解决方案
你可以做什么:
by(df[-2],df[2],function(x){
y<-x[sapply(x,function(i)length(unique(i)))>1]
lm(wage~.,y)
})
occupation: Electrician
Call:
lm(formula = wage ~ ., data = y)
Coefficients:
(Intercept) hours sexMale
101.5222 -0.2763 9.0678
----------------------------------------------------------------
occupation: Plumber
Call:
lm(formula = wage ~ ., data = y)
Coefficients:
(Intercept) hours
128.9323 -0.7343