programing

ggplot2 상자 그림에서 특이치 무시

powerit 2023. 6. 7. 23:19
반응형

ggplot2 상자 그림에서 특이치 무시

ggplot2 상자 그림에서 특이치를 무시하는 방법은 무엇입니까?단순히 사라지기만 하는 것이 아니라(예: outlier.size=0) y축이 1/3번째 백분위수를 나타내도록 크기가 조정되도록 무시했으면 합니다.특이치 때문에 "상자"가 너무 작게 축소되어 사실상 선이 됩니다.이것을 다룰 수 있는 기술이 있습니까?

편집 예는 다음과 같습니다.

y = c(.01, .02, .03, .04, .05, .06, .07, .08, .09, .5, -.6)
qplot(1, y, geom="boxplot")

여기에 이미지 설명 입력

특이치를 표시하지 않고 축 한계를 변경합니다.

예를 들면.

n <- 1e4L
dfr <- data.frame(
  y = exp(rlnorm(n)),  #really right-skewed variable
  f = gl(2, n / 2)
)

p <- ggplot(dfr, aes(f, y)) + 
  geom_boxplot()
p   # big outlier causes quartiles to look too slim

p2 <- ggplot(dfr, aes(f, y)) + 
  geom_boxplot(outlier.shape = NA) +
  scale_y_continuous(limits = quantile(dfr$y, c(0.1, 0.9)))
p2  # no outliers plotted, range shifted

사실, Ramnath가 그의 답변에서 보여주었듯이 (그리고 Andrie도 댓글에서) 통계를 계산한 후에 를 통해 척도를 자르는 것이 더 이치에 맞습니다.

coord_cartesian(ylim = quantile(dfr$y, c(0.1, 0.9)))

(아마도 여전히 사용해야 할 것입니다.scale_y_continuous(축 파단을 고정합니다.)

다음은 boxplot.stats를 사용한 솔루션입니다.

# create a dummy data frame with outliers
df = data.frame(y = c(-100, rnorm(100), 100))

# create boxplot that includes outliers
p0 = ggplot(df, aes(y = y)) + geom_boxplot(aes(x = factor(1)))


# compute lower and upper whiskers
ylim1 = boxplot.stats(df$y)$stats[c(1, 5)]

# scale y limits based on ylim1
p1 = p0 + coord_cartesian(ylim = ylim1*1.05)

나도 같은 문제를 가지고 있었고 Q1, Q2, 중위수, ymin, ymax에 대한 값을 미리 계산했습니다.boxplot.stats:

# Load package and generate data
library(ggplot2)
data <- rnorm(100)

# Compute boxplot statistics
stats <- boxplot.stats(data)$stats
df <- data.frame(x="label1", ymin=stats[1], lower=stats[2], middle=stats[3], 
                 upper=stats[4], ymax=stats[5])

# Create plot
p <- ggplot(df, aes(x=x, lower=lower, upper=upper, middle=middle, ymin=ymin, 
                    ymax=ymax)) + 
    geom_boxplot(stat="identity")
p

결과는 특이치가 없는 상자 그림입니다.여기에 이미지 설명 입력

한 가지 아이디어는 데이터를 2-패스 절차로 윈저라이징하는 것입니다.

  1. 첫 번째 패스를 실행하여 한계가 무엇인지 학습합니다(예: 주어진 백분위수에서의 절단 또는 평균 위의 N 표준 편차).

  2. 두 번째 패스에서, 주어진 경계를 넘어 그 경계의 값을 설정합니다.

저는 이것이 좀 더 현대적인 강력한 기술이 지배해야 하는 구식 방법이라는 것을 강조해야 하지만 여전히 그것을 많이 접하게 됩니다.

gg.layers::geom_boxplot2당신이 원하는 것입니다.

# remotes::install_github('rpkgs/gg.layers')
library(gg.layers)
library(ggplot2)
p <- ggplot(mpg, aes(class, hwy))
p + geom_boxplot2(width = 0.8, width.errorbar = 0.5)

https://rpkgs.github.io/gg.layers/reference/geom_boxplot2.html 여기에 이미지 설명 입력

수염이 최대 및 최소 값으로 확장되도록 하려면 다음과 같이 조정할 수 있습니다.coef논쟁.기본값:coef는 1.5입니다(즉, 수염의 기본 길이는 IQR의 1.5배).

# Load package and create a dummy data frame with outliers 
#(using example from Ramnath's answer above)
library(ggplot2)
df = data.frame(y = c(-100, rnorm(100), 100))

# create boxplot that includes outliers
p0 = ggplot(df, aes(y = y)) + geom_boxplot(aes(x = factor(1)))

# create boxplot where whiskers extend to max and min values
p1 = ggplot(df, aes(y = y)) + geom_boxplot(aes(x = factor(1)), coef = 500)

p0의 이미지

p1의 이미지

간단하고, 더럽고, 효과적입니다.gem_boxplot(특이값.알파 = 0)

gem_boxplot 함수의 "coef" 옵션을 사용하면 사분위간 범위의 관점에서 특이치 컷오프를 변경할 수 있습니다.이 옵션은 stat_box 그림 함수에 대해 설명되어 있습니다.특이치를 비활성화하려면(즉, 일반 데이터로 처리됨) 기본값 1.5를 사용하는 대신 매우 높은 컷오프 값을 지정할 수 있습니다.

library(ggplot2)
# generate data with outliers:
df = data.frame(x=1, y = c(-10, rnorm(100), 10)) 
# generate plot with increased cutoff for outliers:
ggplot(df, aes(x, y)) + geom_boxplot(coef=1e30)

언급URL : https://stackoverflow.com/questions/5677885/ignore-outliers-in-ggplot2-boxplot

반응형