이진 결과와 연속 예측 변수를 어떻게 시각화합니까?


10

시각화해야 할 데이터가 있으며 최선의 방법을 모릅니다. 각 주파수 및 결과 인 기본 항목 가 있습니다 . 이제 저의 방법이 저주파 항목을 얼마나 잘 찾아내는 지 (즉, 1 개 결과) 플롯해야합니다. 나는 초기에 주파수의 x 축과 0-1의 점 축이있는 y 축을 가졌지 만 끔찍한 것처럼 보였습니다 (특히 두 방법의 데이터를 비교할 때). 즉, 각 항목 는 결과 (0/1)를 가지며 그 빈도에 따라 순서가 정해집니다.F = { f 1 , , f n } O { 0 , 1 } n q QQ={q1,,qn}F={f1,,fn}O{0,1}nqQ

다음은 단일 방법의 결과를 보여주는 예입니다.

여기에 이미지 설명을 입력하십시오

다음 아이디어는 데이터를 구간으로 나누고 구간에 대한 로컬 감도를 계산하는 것이었지만 그 아이디어의 문제는 주파수 분포가 반드시 균일하지는 않다는 것입니다. 그렇다면 구간을 어떻게 가장 잘 선택해야합니까?

누구나 이런 종류의 데이터를 시각화하여 더 드물고 (빈도가 낮은) 항목을 찾는 효과를 나타내는 더 좋고 유용한 방법을 알고 있습니까?

편집 : 좀 더 구체적으로, 특정 집단의 생물학적 서열을 재구성하는 방법의 능력을 보여주고 있습니다. 시뮬레이트 된 데이터를 사용한 유효성 검사를 위해서는 풍부 성 (빈도)에 관계없이 변형을 재구성하는 기능을 보여 주어야합니다. 따라서이 경우 누락 된 항목과 발견 된 항목을 빈도별로 정렬하여 시각화합니다. 이 플롯에는 없는 재구성 된 변형이 포함되지 않습니다 .Q


1
나는 완전히 이해하지 못한다. "성과"가 무언가를 찾고 있습니까? "희귀 품목"이란 무엇입니까?
Peter Flom

1
IMO에는 끔찍한 것으로 보이는 그래프를 포함시켜야합니다. 표시하려는 데이터에 대한 모든 사람들에게 더 나은 아이디어를 제공 할 것입니다.
Andy W

@PeterFlom, 더 명확하게 편집했습니다. 각 항목의 0-1 결과는 "찾을 수 없음"및 "찾은 것"을 나타냅니다. 희귀 품목은 단순하지만 매우 낮은 빈도의 품목입니다.
Nicholas Mancuso

@AndyW, 이미지를 포함하도록 편집되었습니다. y 축의 값이 실제로 발견되고 발견되지 않은 개념을 반영하지는 않지만 적어도 내가 제시 하고자 하는 것을 전달 하기 위해 (이 질문의 목적을 위해), 당신은 아이디어를 얻습니다 ...
Nicholas Mancuso

1
y 값이 0 또는 1 일 수있는 데이터에 대해 산점도를 시도한 것처럼 보입니다. 맞습니까? 그리고 같은 점에서 여러 방법으로 이러한 종류의 플롯을 비교하고 싶습니까? 그러나 각 방법이 한두 가지 방법으로 옳고 그른 것일 수 있습니까? 즉, 각 포인트는 (무엇이든) 또는 그렇지 않습니다. 그래서 방법은 요점은 (무엇이든) 그렇지 않다 (무엇이든)라고 말할 수 있으며 선택은 옳거나 틀릴 수 있습니까?
Peter Flom

답변:


10

내가 과거에 한 일은 기본적으로 당신이 황토를 추가하여 한 것입니다 . 점의 밀도에 따라 아래 그림과 같이 반투명 점 (α) 및 / 또는 파이프 기호 ( "|")를 사용하여 겹침을 최소화합니다.

library(ggplot2) # plotting package for R

N=100
data=data.frame(Q=seq(N), Freq=runif(N,0,1), Success=sample(seq(0,1), 
size=N, replace=TRUE))

ggplot(data, aes(x=Freq, y=Success))+geom_point(size=2, alpha=0.4)+
  stat_smooth(method="loess", colour="blue", size=1.5)+
  xlab("Frequency")+
  ylab("Probability of Detection")+
  theme_bw()

여기에 이미지 설명을 입력하십시오

(오류 막대가 여기에서 넓어 져야한다고 생각하지 않지만 ggplot의 내부 stat_smooth 함수를 사용하여 쉽게 수행 할 수있는 방법은 없습니다.이 방법을 R의 실수에 사용하면 우리가 할 수 있습니다 플로팅하기 전에 황토와 오류 막대를 추정하여.)

( 편집 : 데이터 밀도가 유용하고 Mimshot에서 적절한 신뢰 구간에 대해 수직 지터를 사용하는 것에 대한 Andy W.의 의견에 대한 플러스-하나.)


3
+1-나는 도트에 지터를 사용하는 것이 좋습니다 (투명성 외에도). 이 예에서는로 교체 geom_point(size=2, alpha=0.4)합니다 geom_jitter(size=2, alpha=0.4, position = position_jitter(height = .02)).
Andy W

3
+1이지만 가우스 노이즈가 아니라 이항 분포의 역으로부터 신뢰 한계를 사용해야합니다.
Mimshot

@Mimshot 신뢰 구간을 올바르게 계산하는 방법을 보여줄 수 있습니까?
꿀벌 남자

1
@Mimshot ggplot2올바른 CI를 제공 할 수있는 방법을 알고 있습니까? CI가 아닌 다른 [0,1]계산에서 분명히 나온 CI가있는 줄거리가 있습니다.
MichaelChirico

이것은 정답 (+1)이지만 플롯 범위 (및 CI)는 반드시 간격으로 제한되어야합니다 . 그것은 플롯의 모양을 향상시키고 허용 가능한 확률 값의지지를 존중합니다. [0,1]
벤-복원 모니카

2

또한 사용 사례에 가장 적합한 스케일을 고려하십시오. 로지스틱 회귀 모델링의 목적으로 육안 검사를 수행하고 연속 예측 변수를 시각화하여 스플라인 또는 다항식을 모형에 추가해야하는지 여부를 결정하려고한다고 가정합니다. 이 경우 확률 / 비율 대신 로그 홀드로 스케일을 원할 수 있습니다.

아래 요점의 함수는 일부 제한된 휴리스틱을 사용하여 연속 예측 변수를 구간으로 나누고, 평균 비율을 계산하고, 로그 홀수로 변환 한 다음 geom_smooth이러한 집계 지점 을 플로팅 합니다.

공변량에 이진 목표의 로그 홀수와 2 차 관계 (+ 소음)가있는 경우이 차트의 예는 다음과 같습니다.

devtools::source_gist("https://gist.github.com/brshallo/3ccb8e12a3519b05ec41ca93500aa4b3")

# simulated dataset with quadratic relationship between x and y
set.seed(12)
samp_size <- 1000
simulated_df <- tibble(x = rlogis(samp_size), 
                       y_odds = 0.2*x^2,
                       y_probs = exp(y_odds)/(1 + exp(y_odds))) %>% 
  mutate(y = rbinom(samp_size, 1, prob = y_probs)) 

# looking at on balanced dataset
simulated_df_balanced <- simulated_df %>% 
  group_by(y) %>% 
  sample_n(table(simulated_df$y) %>% min())


ggplot_continuous_binary(df = simulated_df,
                         covariate = x, 
                         response = y,
                         snip_scales = TRUE)
#> [1] "bin size: 18"
#> `geom_smooth()` using method = 'loess' and formula 'y ~ x'

reprex 패키지 (v0.2.1)로 2019-02-06에 작성

비교를 위해 1/0을 플로팅하고 다음을 추가하면 이차 관계는 다음과 같습니다 geom_smooth.

simulated_df %>% 
  ggplot(aes(x, y))+
  geom_smooth()+
  geom_jitter(height = 0.01, width = 0)+
  coord_cartesian(ylim = c(0, 1), xlim = c(-3.76, 3.59))
# set xlim to be generally consistent with prior chart
#> `geom_smooth()` using method = 'gam' and formula 'y ~ s(x, bs = "cs")'

reprex 패키지 (v0.2.1) 에서 2019-02-25에 작성

로짓과의 관계가 명확하지 않으며 사용 geom_smooth에 문제가 있습니다.


0

몇 줄의 샘플 데이터를 게시하면 먼 길을 갈 것이라는 데 동의합니다. 질문을 이해하면 발견 된 비율로 빈도를 그리는 것이 가장 간단하다고 생각합니다.

먼저 R로 샘플 데이터를 생성합니다. 내가 당신을 올바르게 이해하지 못하면 저를 정정하십시오.

# Create some sample data
data=data.frame(Q=1:20,F=seq(5,100,by=5))
set.seed(1)
data$found<-round(sapply(data$F,function(x) runif(1,1,x)))
data$prop<-data$found/data$F
# Looks like:
Q   F found      prop
1   1   5     2 0.4000000
2   2  10     4 0.4000000
3   3  15     9 0.6000000
4   4  20    18 0.9000000
5   5  25     6 0.2400000
6   6  30    27 0.9000000
7   7  35    33 0.9428571
8   8  40    27 0.6750000
9   9  45    29 0.6444444
10 10  50     4 0.0800000
11 11  55    12 0.2181818
12 12  60    11 0.1833333
13 13  65    45 0.6923077
14 14  70    28 0.4000000
15 15  75    58 0.7733333
16 16  80    40 0.5000000
17 17  85    61 0.7176471
18 18  90    89 0.9888889
19 19  95    37 0.3894737
20 20 100    78 0.7800000

이제 단순히 주파수 (플롯 F에 의해을) proportion:

# Plot frequency by proportion found.
plot(data$F,data$prop,xlab='Frequency',ylab='Proportion Found',type='l',col='red',lwd=2)

여기에 이미지 설명을 입력하십시오


4
그 음모는 끔찍하다! 이전 답변에서와 같이 일부 평활화가 필요합니다.
kjetil b halvorsen
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.