2013-02-22 22 views
14

Utworzono wykres rozrzutu (wiele grup GRP) z IV=time, DV=concentration. Chciałem dodać krzywe regresji kwantylowej (0.025,0.05,0.5,0.95,0.975) do mojego wykresu.Nieparametryczne krzywe regresji kwantylowej do wykresu rozrzutu

A tak przy okazji, to co zrobiłem, aby stworzyć rozproszoną-działki:

attach(E) ## E is the name I gave to my data 
## Change Group to factor so that may work with levels in the legend 
Group<-as.character(Group) 
Group<-as.factor(Group) 

## Make the colored scatter-plot 
mycolors = c('red','orange','green','cornflowerblue') 
plot(Time,Concentration,main="Template",xlab="Time",ylab="Concentration",pch=18,col=mycolors[Group]) 

## This also works identically 
## with(E,plot(Time,Concentration,col=mycolors[Group],main="Template",xlab="Time",ylab="Concentration",pch=18)) 

## Use identify to identify each point by group number (to check) 
## identify(Time,Concentration,col=mycolors[Group],labels=Group) 
## Press Esc or press Stop to stop identify function 

## Create legend 
## Use locator(n=1,type="o") to find the point to align top left of legend box 
legend('topright',legend=levels(Group),col=mycolors,pch=18,title='Group') 

Ponieważ dane, które stworzyłem tutaj jest pewna niewielka część z moich większych danych, może wyglądać to możliwe być przybliżone jako hiperbola prostokątna. Ale nie chcę jeszcze nazywać matematycznego związku między moimi zmiennymi niezależnymi i zależnymi.

Myślę, że nlrq z pakietu quantreg może być odpowiedź, ale nie rozumiem, jak korzystać z funkcji, gdy nie wiem relacji między moich zmiennych.

znajdę ten wykres z artykułu naukowego, i chcę zrobić dokładnie ten sam rodzaj wykresu: Goal

znowu, dzięki za pomoc!

Aktualizacja

Test.csv byłem wskazał, że moje dane próbka nie jest powtarzalna. Oto próbka moich danych.

library(evd) 
qcbvnonpar(p=c(0.025,0.05,0.5,0.95,0.975),cbind(TAD,DV),epmar=T,plot=F,add=T) 

Próbowałem również qcbvnonpar :: evd, ale krzywa nie wydaje się bardzo gładka.

+8

Jeśli nie jesteś w stanie dostarczyć własne dane, spróbuj utworzyć zbiór danych liczb losowych i zademonstruj swój problem. Pokaż nam, co próbujesz. Daje nam coś do pracy, a także jest oznaką dobrej wiary. –

+0

Oh. Przepraszam - zrobię kilka liczb. Może być dość duży. – shirleywu

+0

Może to pomóc w generowaniu danych. http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example –

Odpowiedz

5

mam w przeszłości często zmagał się z rqss i moje problemy są niemal zawsze związane z zamawiania punktów.

Masz wiele pomiarów w różnych punktach czasowych, dlatego uzyskujesz różne długości. Działa to dla mnie:

dat <- read.csv("~/Downloads/Test.csv") 

library(quantreg) 
dat <- plyr::arrange(dat,Time) 
fit<-rqss(Concentration~qss(Time,constraint="N"),tau=0.5,data = dat) 
with(dat,plot(Time,Concentration)) 
lines(unique(dat$Time)[-1],fit$coef[1] + fit$coef[-1]) 

enter image description here

Sortowanie ramki danych przed założeniem modelu wydaje się konieczne.

+0

To działa! Dziękuję bardzo. Nie wiedziałem, że zamawianie może być problemem. – shirleywu

8

Może zajrzyj do quantreg ::: rqss, aby wygładzić splajny i regresję kwantyli. Przepraszam za niezbyt dobry przykład danych:

set.seed(1234) 
period <- 100 
x <- 1:100 
y <- sin(2*pi*x/period) + runif(length(x),-1,1) 


require(quantreg) 
mod <- rqss(y ~ qss(x)) 
mod2 <- rqss(y ~ qss(x), tau=0.75) 
mod3 <- rqss(y ~ qss(x), tau=0.25) 
plot(x, y) 
lines(x[-1], mod$coef[1] + mod$coef[-1], col = 'red') 
lines(x[-1], mod2$coef[1] + mod2$coef[-1], col = 'green') 
lines(x[-1], mod3$coef[1] + mod3$coef[-1], col = 'green') 

enter image description here

+0

+1 dla 'rqss()' - jeśli nieparametryczny jest to, co jest wymagane, a przykładowy obrazek sugeruje, że jest dopasowany na podstawie splajnu, to 'rqss()' jest z pewnością pierwszym miejscem, w którym chciałbym wyglądać. –

+1

Działa tak pięknie na twoim przykładzie, ale nie jestem pewien dlaczego, ciągle otrzymuję komunikat "Błąd w xy.coords (x, y): ostrzeżenie" x "i" y "różnią się od siebie dla mojego zestawu danych, mimo że sprawdzam to moje xiy mają to samo n. Wciąż pracuję nad debugowaniem błędów: P – shirleywu

+1

Czy możesz podać trochę więcej swoich danych? Twoje przykładowe dane z góry są oczywiście nieodpowiednie. – EDi

2

W przypadku, gdy chcesz ggplot2 grafikę ...

I oparty na ten przykład, że od @EDi. Zwiększyłem liczbę x i y, aby linie kwantylowe były mniej skręcone. Z powodu tego wzrostu potrzebuję użyć unique(x) zamiast x w niektórych połączeniach.

Oto zmodyfikowany set-up:

set.seed(1234) 
period <- 100 
x <- rep(1:100,each=100) 
y <- 1*sin(2*pi*x/period) + runif(length(x),-1,1) 


require(quantreg) 
mod <- rqss(y ~ qss(x)) 
mod2 <- rqss(y ~ qss(x), tau=0.75) 
mod3 <- rqss(y ~ qss(x), tau=0.25) 

Oto dwie działki:

# @EDi's base graphics example 
plot(x, y) 
lines(unique(x)[-1], mod$coef[1] + mod$coef[-1], col = 'red') 
lines(unique(x)[-1], mod2$coef[1] + mod2$coef[-1], col = 'green') 
lines(unique(x)[-1], mod3$coef[1] + mod3$coef[-1], col = 'green') 

enter image description here

# @swihart's ggplot2 example: 
## get into dataset so that ggplot2 can have some fun: 
qrdf <- data.table(x  = unique(x)[-1], 
        median = mod$coef[1] + mod$coef[-1], 
        qupp = mod2$coef[1] + mod2$coef[-1], 
        qlow = mod3$coef[1] + mod3$coef[-1] 
) 

line_size = 2 
ggplot() + 
    geom_point(aes(x=x, y=y), 
      color="black", alpha=0.5) + 
    ## quantiles: 
    geom_line(data=qrdf,aes(x=x, y=median), 
      color="red", alpha=0.7, size=line_size) + 
    geom_line(data=qrdf,aes(x=x, y=qupp), 
      color="blue", alpha=0.7, size=line_size, lty=1) + 
    geom_line(data=qrdf,aes(x=x, y=qlow), 
      color="blue", alpha=0.7, size=line_size, lty=1) 

enter image description here