如何对每个数据子集进行拟合并绘制拟合曲线?

Posted

技术标签:

【中文标题】如何对每个数据子集进行拟合并绘制拟合曲线?【英文标题】:How to do fitting for each subsets of data and plot their fitting curves? 【发布时间】:2015-09-07 01:15:55 【问题描述】:

其实在我在这里问之前我已经做了很多事情并且做了很多搜索但到目前为止找不到解决方案。

我有一个数据子集,需要适合每个子集。另一方面,当我尝试绘制每个子集的回归线时,图上只显示一条回归线。这是迄今为止的主要问题。

不管怎样,让我们​​一步一步走吧; 这是data.frame

   xx <- rep(rep(seq(0,800,200),each=10),times=2)
   yy<-c(replicate(2,sort(10^runif(10,-1,0),decreasing=TRUE)),replicate(2,sort(10^runif(10,-1,0),decreasing=TRUE)), replicate(2,sort(10^runif(10,-2,0),decreasing=TRUE)),replicate(2,sort(10^runif(10,-3,0),decreasing=TRUE)), replicate(2,sort(10^runif(10,-4,0), decreasing=TRUE)))    
   V <- rep(seq(100,2500,length.out=10),times=2)
   No <- rep(1:10,each=10)
   df <- data.frame(V,xx,yy,No)

从宽格式到长格式

library(reshape2)
df_new <- melt(df,id=c("No","xx","V"))

**拟合模型

As <- 220
Ax <- 1500
 
  model <- function(data)
  nlsLM(value~ifelse(V<Vs, 1-exp(-D*(1-(xx-As)/Ax)^2*(1-V/Vs)^2),1),
        data=data, start=c(D=1.21,Vs=1951),trace=T,control = nls.lm.control(maxiter=50))




library(plyr)
library(minpack.lm)

fit<- dlply(df_new, "No", .fun = model)

预测拟合值的函数##from Adding Fitted Lines from an Existing Model

predictvals <- function(model, xvar, yvar, xrange=NULL, samples=10, ...) 
  # If xrange isn't passed in, determine xrange from the models.
  # Different ways of extracting the x range, depending on model type
  if (is.null(xrange)) 
    if (any(class(model) %in% c("nls", "glm")))
      xrange <- range(model$model[[xvar]])
    else if (any(class(model) %in% "loess"))
      xrange <- range(model$x)
  
  newdata <- data.frame(x = seq(xrange[1],xrange[2], length.out = samples))
  names(newdata) <- xvar
  newdata[[yvar]] <- predict(model, newdata = newdata, ...)
  newdata

在所有组中形成具有相同 x 范围的预测线

predvals<- ldply(fit, .fun=predictvals, xvar="V", yvar="value",xrange=range(df_new$V))
predvals$xx <- rep(rep(unique(df_new$xx),each=1),each=10)

最后用facet_wrap~xx进行绘图

ggplot(df_new,aes(y=value,x=V, col=factor(xx)))+
  geom_point(size=3,alpha=.4)+
  geom_line(data=predvals,aes(col=factor(xx)))+
  scale_y_log10(breaks=c(1e-6,1e-5,1e-4,1e-3,1e-2,1e-1,1),limits = c(1e-6,1))+
  facet_wrap(~xx,scales="free_x")

为什么只有一条拟合线。我希望有两条拟合线,因为每个 xx 值都有两个数据子集。我缺少哪一部分?任何指导将不胜感激。

【问题讨论】:

您可能需要在 aes 中进行额外分组,但您的代码不可重现。 AsAx 未定义。 【参考方案1】:

尝试在geom_line 中的aes 调用中添加另一个分组因素。

... +
geom_line(data=predvals,aes(col=factor(xx), group=interaction(xx, No))) +
...

我没有查看您的代码的详细信息,所以如果这不是您想要的,请告诉我。

【讨论】:

是的,这就是我要找的。反正我从来没有想过。非常感谢。你认为配件可以更短吗?因为代码很多.. 你的做法在我看来不错。您可以不使用 predictvals 函数来缩短它,但该函数很有用并且可以让事情井井有条。

以上是关于如何对每个数据子集进行拟合并绘制拟合曲线?的主要内容,如果未能解决你的问题,请参考以下文章

origin7.5可以对曲线上差异大的点进行过滤,能平滑三维图的数据吗?

python 拟合曲线并求参

matlab拟合正弦曲线的问题

用matlab拟合三维(空间曲线)问题!怎么拟合?

怎么在matlab中对离散点进行曲线拟合,求参数!

origin 把多个拟合的曲线放在一起