R - lm, cooks.distance & Outliers by Group



外组工作正常的代码:

url <- "https://raw.githubusercontent.com/selva86/datasets/master/ozone.csv"
ozone <- read.csv(url)
ozone <- head(ozone,20)
mod <- lm(ozone_reading ~ ., data=ozone)
cooksd <- cooks.distance(mod)
influential <- as.numeric(names(cooksd)[(cooksd > 4*mean(cooksd, na.rm=T))])  # influential row numbers
(ozone[influential, ])  # influential observations.

根据我的新要求,我必须添加一个组,并且需要找到每个组的异常值。我的代码示例如下所示。我如何按组获得厨师距离和异常值?请帮忙

url <- "https://raw.githubusercontent.com/selva86/datasets/master/ozone.csv"
ozone <- read.csv(url)
ozone <- head(ozone,20)
ozone$season <- c('summer','summer','summer','summer','summer','summer','summer','summer','summer','summer',
'winter','winter','winter','winter','winter','winter','winter','winter','winter','winter')

在这里,我需要按组计算mod,cooksd和影响力。

只需概括您的过程并使用by(面向对象的包装器到tapply(调用它,该包装器按一个或多个因子对数据框进行子集,并将子集传递到函数中以返回等于不同组数的数据框列表:

proc_cooks_outlier <- function(df) { 
mod <- lm(ozone_reading ~ ., data=transform(df, season=NULL))
cooksd <- cooks.distance(mod)
# influential row numbers
influential <- as.integer(names(cooksd)[(cooksd > 4*mean(cooksd, na.rm=TRUE))])
return(df[complete.cases(df[influential,]),])
}
outlier_df_list <- by(ozone, ozone$season, FUN=proc_cooks_outlier)
# REFERENCE INDIVIDUAL DFs
outlier_df_list$summer
outlier_df_list$winter
...
# COMBINE ALL INTO ONE DF
master_outlier_df <- do.call(rbind, unname(outlier_df_list))

最新更新