如何用lm来使用?
考虑这个简单的例子如何用lm来使用?
library(dplyr)
library(broom)
dataframe <- data_frame(id = c(1,2,3,4,5,6),
value = c(NA,NA,NA,NA,NA,NA))
dataframe
> dataframe
# A tibble: 6 x 2
id value
<dbl> <lgl>
1 1 NA
2 2 NA
3 3 NA
4 4 NA
5 5 NA
6 6 NA
我基本上使用lm
计算列的平均值在我的数据帧的功能。
get_mean <- function(data, myvar){
col_name <- as.character(substitute(myvar))
fmla <- as.formula(paste(col_name, "~ 1"))
tidy(lm(data = data, fmla, na.action = 'na.omit')) %>% pull(estimate)
}
现在
> get_mean(dataframe, id)
[1] 3.5
因为缺失值,但是,
get_mean(dataframe, value)
返回到返回NA或任意数量的可怕
Error in lm.fit(x, y, offset = offset, singular.ok = singular.ok, ...) :
0 (non-NA) cases
我想功能由我指定w如果出现全NA情况。我试图用purrr:possibly
但没有成功
get_mean <- function(data, myvar){
col_name <- as.character(substitute(myvar))
fmla <- as.formula(paste(col_name, "~ 1"))
model <- purrr::possibly(lm(data = data, fmla, na.action = 'na.omit'), NA)
if(!is.na(model)) {
tidy(model) %>% pull(estimate)
}
}
get_mean(dataframe, id)
不起作用
Error: Can't convert a list to function
我该怎么办? 谢谢!
您可以将整个函数包装在possibly
中,因此如果整个函数在任何地方失败,您都可以获得NA。
get_mean <- possibly(function(data, myvar) {
col_name <- as.character(substitute(myvar))
fmla <- as.formula(paste(col_name, "~ 1"))
model <- lm(data = data, fmla, na.action = 'na.omit')
tidy(model) %>% pull(estimate)
}, otherwise = NA)
get_mean(dataframe, id)
[1] 3.5
get_mean(dataframe, value)
[1] NA
然而,不同于tryCatch
这不是专注于代码的lm
一部分。它正在处理整个功能,如果因任何原因发生任何错误,它将返回NA。例如,如果您在运行get_mean
之前忘记加载扫帚包,即使模型正常工作,您也会收到NA
,因为R无法找到tidy
。
将参数quiet
设置为FALSE
将允许打印错误消息,这可以帮助您减轻像上面概述的错误。
您也可以使用possibly
作为safely
的文档示例,使possibly
函数专用于lm
以供使用。然后,您可以使用if else
语句或者tidy
或返回NA
。
get_mean <- function(data, myvar) {
col_name <- as.character(substitute(myvar))
fmla <- as.formula(paste(col_name, "~ 1"))
poss_lm <- possibly(lm, otherwise = NA)
model <- poss_lm(data = data, fmla, na.action = 'na.omit')
if(!is.na(model[1])) {
tidy(model) %>% pull(estimate)
}
else {
model
}
}
的好听,甚至可能更好。失败证明:D –
失败证明意味着难以检测和诊断问题,难以修复。 aosmith给出了一个很好的例子,如果不知道'扫帚'是不是加载,而不是信息性的错误信息,你只是得到所有'NA'结果... – Gregor
看起来像一个普通的tryCatch()
会做的伎俩
get_mean <- function(data, myvar){
col_name <- as.character(substitute(myvar))
fmla <- as.formula(paste(col_name, "~ 1"))
tryCatch(lm(data = data, fmla, na.action = 'na.omit') %>% tidy() %>% pull(estimate),
error=function(e) NA)
}
get_mean(dataframe, id)
# [1] 3.5
get_mean(dataframe, value)
# [1] NA
感谢您的替代解决方案! –
您确定要使用'可能是()'这里?这是一个函数,它接受一个函数并返回另一个函数 - 这些函数都不是你真正想要的。 – MrFlick
啊!那时我很困惑。我也尝试过'tryCatch',但没有成功。我很好,你看到了你的方式。谢谢! –
使用'tryCatch'。像'return(tryCatch(,error = function(e)NA))'''。 – Gregor