扫帚包装-lm.fit(x,y,offset = offset,singular.ok = singular.ok,…):0(非NA)情况下的错误

问题描述 投票:1回答:2

我有一个学生属性和考试成绩的数据框,我正在尝试为每个年级(1至12)拟合线性模型。我正在使用扫帚包装为每个年级水平有效地创建一个模型。下面是一个简化的示例数据集和我正在使用的代码。

#start df creation 

grade <- rep(1:12, each = 40)
attendance_rate <- round(runif(480, min=25, max=100), 1)
test_growth <- round(runif(480, min = -12, max = 38))
binary_flag <- round(runif(480, min = 0, max = 1))
score <- round(runif(480, min = 92, max = 370))
survey_response <- round(runif(480, min = 1, max = 4))

df <- data.frame(grade, attendance_rate, test_growth, binary_flag, score, survey_response) 

df$survey_response[df$grade == 1] <- NA

# end df creation

#create train test split for each grade level
set.seed(123)

df_train <- lapply(split(seq(1:nrow(df)), df$grade), function(x) sample(x, floor(.6*length(x))))
df_test <- mapply(function(x,y) setdiff(x,y), x = split(seq(1:nrow(df)), df$grade), y = df_train)

df_train <- df[unlist(df_train),]

df_test <- df[unlist(df_test),]



#create models
models_nested <- df_train %>%
  group_by(grade) %>% nest() %>% 
  mutate(
    fit = map(data, ~ lm(score ~ attendance_rate + test_growth + binary_flag + survey_response, data = .x)),
    tidied = map(fit, tidy),
    augmented = map(fit, augment),
    glanced = map(fit, glance)
  )

不幸的是,当我尝试运行以models_nested开头的代码块时,收到以下错误:

Error in lm.fit(x, y, offset = offset, singular.ok = singular.ok, ...) : 
  0 (non-NA) cases

我知道这是因为所有一年级的学生在survey_response列中都具有NA值。我不知道如何解决此问题,而无需对1年级运行单独的回归分析,而该回归分析会完全降低调查答复列/变量。如果该特定的年级子集仅包含空值,是否可以告诉lm函数简单地忽略变量?我显然想在其他年级模型的回归中保留该变量。

我已尽力将这个问题弄清楚,但如有必要,我很乐意在评论中进行澄清。

我希望有人可以提供帮助!

r linear-regression broom
2个回答
0
投票

您可以使用tryCatch或类似方法捕获错误,并在发生错误时返回一些错误值(例如NA)。在后续步骤中检查该错误值,并相应执行功能。

library(broom)
library(dplyr)
library(tidyr)
library(purrr)

df_train %>%
  group_by(grade) %>% 
  nest() %>% 
  mutate(fit = map(data, ~tryCatch(lm(score ~ attendance_rate + test_growth + 
             binary_flag + survey_response, data = .x), error = function(e) NA)),
         tidied = map(fit, ~if(any(is.na(.x))) NA else tidy(.x)),
         augmented = map(fit, ~if(any(is.na(.x))) NA else augment(.x)),
         glanced = map(fit, ~if(any(is.na(.x))) NA else glance(.x)))

0
投票

我们可以使用possibly中的purrr

library(broom)
library(dplyr)
library(tidyr)
library(purrr)

poslm <- possibly(lm, otherwise = NA)
df_train %>%
   group_by(grade) %>% 
   nest() %>% 
   mutate(fit = map(data, ~ poslm(score ~ attendance_rate + test_growth + 
              binary_flag + survey_response, data = .x)), 
         tidied = map(fit, possibly(tidy, otherwise = NA)),
            augmented = map(fit, possibly(augment, otherwise = NA)),
          glanced = map(fit, possibly(glance, otherwise = NA)))
# A tibble: 12 x 6
# Groups:   grade [12]
#   grade data              fit       tidied           augmented          glanced          
#   <int> <list>            <list>    <list>           <list>             <list>           
# 1     1 <tibble [24 × 5]> <lgl [1]> <lgl [1]>        <lgl [1]>          <lgl [1]>        
# 2     2 <tibble [24 × 5]> <lm>      <tibble [5 × 5]> <tibble [24 × 12]> <tibble [1 × 11]>
# 3     3 <tibble [24 × 5]> <lm>      <tibble [5 × 5]> <tibble [24 × 12]> <tibble [1 × 11]>
# 4     4 <tibble [24 × 5]> <lm>      <tibble [5 × 5]> <tibble [24 × 12]> <tibble [1 × 11]>
# 5     5 <tibble [24 × 5]> <lm>      <tibble [5 × 5]> <tibble [24 × 12]> <tibble [1 × 11]>
# 6     6 <tibble [24 × 5]> <lm>      <tibble [5 × 5]> <tibble [24 × 12]> <tibble [1 × 11]>
# 7     7 <tibble [24 × 5]> <lm>      <tibble [5 × 5]> <tibble [24 × 12]> <tibble [1 × 11]>
# 8     8 <tibble [24 × 5]> <lm>      <tibble [5 × 5]> <tibble [24 × 12]> <tibble [1 × 11]>
# 9     9 <tibble [24 × 5]> <lm>      <tibble [5 × 5]> <tibble [24 × 12]> <tibble [1 × 11]>
#10    10 <tibble [24 × 5]> <lm>      <tibble [5 × 5]> <tibble [24 × 12]> <tibble [1 × 11]>
#11    11 <tibble [24 × 5]> <lm>      <tibble [5 × 5]> <tibble [24 × 12]> <tibble [1 × 11]>
#12    12 <tibble [24 × 5]> <lm>      <tibble [5 × 5]> <tibble [24 × 12]> <tibble [1 × 11]>
© www.soinside.com 2019 - 2024. All rights reserved.