Непараметрические кривые регрессии квантилей для диаграммы рассеяния - программирование
Подтвердить что ты не робот

Непараметрические кривые регрессии квантилей для диаграммы рассеяния

Я создал диаграмму рассеяния (несколько групп GRP) с IV=time, DV=concentration. Я хотел бы добавить кривые регрессии квантилей (0.025,0.05,0.5,0.95,0.975) к моему сюжету.

И, кстати, это то, что я сделал для создания рассеянного графика:

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')

Поскольку данные, которые я создал здесь, являются небольшим подмножеством моих больших данных, может показаться, что он может быть аппроксимирован как прямоугольная гипербола. Но пока я не хочу называть математическую связь между моими независимыми и зависимыми переменными.

Я думаю, что nlrq из пакета quantreg может быть ответом, но я не понимаю, как использовать эту функцию, когда я не знаю отношения между моими переменными.

Я нахожу этот график из научной статьи, и я хочу сделать точно такой же график: Goal

Снова, спасибо за вашу помощь!

Обновление

Test.csv Мне было указано, что мои выборочные данные не воспроизводятся. Вот пример моих данных.

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

Я также пробовал qcbvnonpar:: evd, но кривая не кажется очень гладкой.

4b9b3361

Ответ 1

В прошлом я часто боролся с rqss, и мои проблемы почти всегда были связаны с упорядочением точек.

У вас есть несколько измерений в разные моменты времени, поэтому вы получаете разную длину. Это работает для меня:

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

Сортировка кадра данных перед установкой модели представляется необходимой.

Ответ 2

Возможно, посмотрите на quantreg: rqss для сглаживания сплайнов и квантильной регрессии. Извините за не очень приятные примеры:

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

Ответ 3

Если вы хотите ggplot2 графический...

Я основал этот пример на примере @EDi. Я увеличил x и y так, чтобы линии квантилей были менее волнистыми. Из-за этого увеличения, я должен использовать unique(x) вместо x в некоторых вызовах.

Здесь измененная настройка:

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)

Вот два графика:

# @EDi 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')

введите описание изображения здесь

# @swihart 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) 

введите описание изображения здесь