Непараметрические кривые регрессии квантилей для диаграммы рассеяния
Я создал диаграмму рассеяния (несколько групп 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, но кривая не кажется очень гладкой.
Ответы
Ответ 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)
![введите описание изображения здесь]()