首页 > 解决方案 > 有没有办法在映射回归期间忽略一级因素(对于某些子集)?

问题描述

我想对数据框的子集(大约 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可以用来做我想做的事吗?

谢谢。

标签: rregressionpurrrlm

解决方案


你可以做什么:

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  

推荐阅读