散点图的非参数分位数回归曲线
Posted
技术标签:
【中文标题】散点图的非参数分位数回归曲线【英文标题】:Nonparametric quantile regression curves to scatterplot 【发布时间】:2013-02-07 13:29:03 【问题描述】:我用IV=time
、DV=concentration
创建了一个散点图(多组 GRP)。我想将分位数回归曲线(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')
由于我在此处创建的数据是我的较大数据的一小部分,因此它可能看起来可以近似为矩形双曲线。但我还不想称我的自变量和因变量之间存在数学关系。
我认为quantreg
包中的nlrq
可能是答案,但是当我不知道我的变量之间的关系时,我不明白如何使用该函数。
我从一篇科学文章中找到了这张图,我想做完全相同的图:
再次感谢您的帮助!
更新
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,但曲线似乎不是很平滑。
【问题讨论】:
如果您无法提供自己的数据,请尝试创建一个随机数数据集并演示您的问题。向我们展示您的尝试。它为我们提供了一些可以合作的东西,同时也是我们诚信的标志。 哦。对不起——我会编一些数字。它可能相当大。 这可以帮助您生成数据。 ***.com/questions/5963269/… 几位cmets:您显示的数字似乎来自works.bepress.com/phil_reiss/16?那篇论文似乎有一个相关的 R 包(还没有看过......)要获得完全非参数的平滑分位数将相当困难(我认为)。两种可能的解决方案是(1)拟合广义加法模型(例如library(splines); rq(y~s(x,5),tau=0.9)
); (2) 使用分位数的运行估计。
也许 quantreg 的 rqss() 也适合你?
【参考方案1】:
也许看看 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')
【讨论】:
+1 forrqss()
- 如果非参数是必需的,并且示例图像表明它是基于样条的拟合,那么 rqss()
肯定是我首先要看的地方。跨度>
它与您的示例配合得非常好,但我不知道为什么,即使我检查我的 x 和 y 具有相同的 n,我仍然会收到 Error in xy.coords(x, y) : 'x' and 'y' lengths differ
警告我的数据集。仍在进行错误调试:P
你能多使用一点你的数据吗?您上面的示例数据显然不合适。【参考方案2】:
我过去经常与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])
似乎有必要在拟合模型之前对数据框进行排序。
【讨论】:
这行得通!太感谢了。我不知道订购可能是个问题。【参考方案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'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')
# @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)
【讨论】:
以上是关于散点图的非参数分位数回归曲线的主要内容,如果未能解决你的问题,请参考以下文章
数据挖掘&机器学习招聘网站的职位招聘数据的分位数图分位数-分位数图以及散点图使用线性回归算法拟合散点图处理详解
R语言ggplot2可视化:ggplot2可视化分组散点图并使用geom_smooth函数在散点图图中为不同的散点簇添加对应的回归曲线并使用se参数设置拟合回归线的置信区间
Python使用matplotlib可视化散点图使用seaborn中的lmplot函数使用多子图可视化不同分组的散点图最优拟合线性回归曲线
R语言ggplot2可视化:ggplot2可视化分组散点图并使用geom_smooth函数在散点图图中为不同的散点簇添加对应的回归曲线