如何去除R中cooks距离的异常值
我正在编写一个通用函数,它接受dataframe和列名,并返回干净的dataframe,而不返回R中的异常值如何去除R中cooks距离的异常值,r,R,我正在编写一个通用函数,它接受dataframe和列名,并返回干净的dataframe,而不返回R中的异常值 cooks_dist <- function(dataframe,column){ dataframe <- dataframe %>% select_if(dataframe,is.numeric) mod <- lm(column ~ ., data=dataframe) cooksd <- cooks.distance(mod) i
cooks_dist <- function(dataframe,column){
dataframe <- dataframe %>% select_if(dataframe,is.numeric)
mod <- lm(column ~ ., data=dataframe)
cooksd <- cooks.distance(mod)
influential <- as.numeric(names(cooksd)[(cooksd > 4*mean(cooksd,na.rm=T))]) # influential row numbers
final <- dataframe[-influential,]
return(final)
}
cooks\u dist错误源于dplyr::select\u if()
。我相信您需要所有数字列的子集,因此您也可以使用sapply()
创建子集。注意:由于您的lm()
行产生了错误,因此我插入了最小模型
所以我想你想要这个:
cooks_dist <- function(dataframe, column){
dataframe <- dataframe[, sapply(dataframe, is.numeric)]
mod <- lm(dataframe[, column] ~ 1, data = dataframe)
cooksd <- cooks.distance(mod)
influential <- as.numeric(names(cooksd)[(cooksd > 4 * mean(cooksd, na.rm = TRUE))])
final <- dataframe[-influential, ]
return(final)
}
df1 <- cooks_dist(df1, 4)
错误源于dplyr::select_if()
。我相信您需要所有数字列的子集,因此您也可以使用sapply()
创建子集。注意:由于您的lm()
行产生了错误,因此我插入了最小模型
所以我想你想要这个:
cooks_dist <- function(dataframe, column){
dataframe <- dataframe[, sapply(dataframe, is.numeric)]
mod <- lm(dataframe[, column] ~ 1, data = dataframe)
cooksd <- cooks.distance(mod)
influential <- as.numeric(names(cooksd)[(cooksd > 4 * mean(cooksd, na.rm = TRUE))])
final <- dataframe[-influential, ]
return(final)
}
df1 <- cooks_dist(df1, 4)
我使用此代码,cooks的阈值为4/n:
orig.mod <- lm(Outcome ~ Exposure, data=origdf)
origdf$cooksd <- cooks.distance(orig.mod)
origdf$cookyn <- ifelse(origdf$cooksd < 4/nrow(orig.dat), "keep","no")
minus.df <-subset(origdf, cookyn=="keep")
newmod.minuscooks <- lm(Outcome ~ Exposure, data=minus.df)
orig.mod我使用了这个代码,厨师的阈值为4/n:
orig.mod <- lm(Outcome ~ Exposure, data=origdf)
origdf$cooksd <- cooks.distance(orig.mod)
origdf$cookyn <- ifelse(origdf$cooksd < 4/nrow(orig.dat), "keep","no")
minus.df <-subset(origdf, cookyn=="keep")
newmod.minuscooks <- lm(Outcome ~ Exposure, data=minus.df)
lm()中的orig.mod
当我在您的答案中保留所有变量而不是仅保留1
时,它不会删除任何异常值。为什么会这样?我相信您可能会找到进一步的帮助,例如:在lm()
中,当我在您的答案中保留所有变量而不是仅保留1
时,它不会删除任何异常值。为什么会这样?我相信您可能会找到进一步的帮助,例如:删除影响因素会以某种方式“清理”数据的概念是对良好数据处理的曲解。如果这是你现在的老师的建议,你应该寻找一个更知名的教学来源,你可以看看下面链接中的一个例子。它使用R根据cooks距离去除异常值。删除影响因素会以某种方式“清理”数据的概念是对良好数据处理的曲解。如果这是你现在的老师的建议,你应该寻找一个更知名的教学来源,你可以看看下面链接中的一个例子。它使用R根据cooks距离去除异常值。orig.dat==第三行代码中的origdf吗?orig.dat==第三行代码中的origdf吗??