2013-06-19 14 views
8

Oto niektóre dane i wykres:geom_smooth na podzbiorze danych

set.seed(18) 
data = data.frame(y=c(rep(0:1,3),rnorm(18,mean=0.5,sd=0.1)),colour=rep(1:2,12),x=rep(1:4,each=6)) 

ggplot(data,aes(x=x,y=y,colour=factor(colour)))+geom_point()+ geom_smooth(method='lm',formula=y~x,se=F) 

enter image description here

Jak widać regresja liniowa jest pod silnym wpływem wartości, gdzie x = 1. Czy można uzyskać regresje liniowe obliczone dla x> = 2, ale wyświetlają wartości dla x = 1 (y równa się 0 lub 1). Wynikowy wykres będzie dokładnie taki sam, z wyjątkiem regresji liniowych. Nie będą "cierpieć" z powodu wpływu wartości na abscisse = 1

Odpowiedz

10

To tak proste, jak geom_smooth(data=subset(data, x >= 2), ...). Nie ma znaczenia, czy ten wątek jest tylko dla ciebie, ale zdaj sobie sprawę, że coś takiego mogłoby wprowadzić w błąd innych, jeśli nie wspomniałeś o tym, jak została przeprowadzona regresja. Polecam zmianę przezroczystości punktów wyłączonych.

ggplot(data,aes(x=x,y=y,colour=factor(colour)))+ 
geom_point(data=subset(data, x >= 2)) + geom_point(data=subset(data, x < 2), alpha=.2) + 
geom_smooth(data=subset(data, x >= 2), method='lm',formula=y~x,se=F) 

enter image description here

+1

Aahh Uwielbiam proste rozwiązania! Wielkie dzięki. Dziękuję również za radę i sztuczkę. –

+0

Co należy zrobić, jeśli to rozwiązanie powoduje pojawienie się tego błędu "Czy estetyka musi mieć długość 1 lub taki sam jak dane" w moim zestawie danych? –

7

Regularne lm funkcja ma weights argument, który można użyć, aby przypisać wagi do konkretnej obserwacji. W ten sposób możesz wyjaśnić wpływ, jaki ma obserwacja na wynik. Myślę, że jest to ogólny sposób radzenia sobie z problemem zamiast podzbioru danych. Oczywiście przydzielanie wag ad hoc nie wróży dobrze statystycznej solidności analizy. Zawsze najlepiej jest mieć uzasadnienie wagi, np. obserwacje o niskiej masie mają większą niepewność.

Myślę, że pod maską ggplot2 używa funkcji lm, więc powinieneś być w stanie przekazać argument weights. Możesz dodać wagi poprzez estetyczne (aes), przy założeniu, że masa jest przechowywany w wektorze:

ggplot(data,aes(x=x,y=y,colour=factor(colour))) + 
    geom_point()+ stat_smooth(aes(weight = runif(nrow(data))), method='lm') 

można również umieścić wagę w kolumnie w zbiorze:

ggplot(data,aes(x=x,y=y,colour=factor(colour))) + 
    geom_point()+ stat_smooth(aes(weight = weight), method='lm') 

gdzie kolumna nazywa się weight.

Powiązane problemy