如何将nlsLM函数与R

时间:2015-08-23 11:51:57

标签: r apply lapply nls tapply

我需要有关如何按列进行多元回归的指南。 我有一个数据框,我想让每个列分别拟合系数。到目前为止,我只能在一列中获得这些结果。

到目前为止我尝试了什么

  1. 可能将结果分配给新变量

    (model.out1< - lm(y1~x1)) (model.out2< - lm(y2~x2))

  2. 可能会有效,但我不想写几个拟合方程,每次都要说15个和列名。这不是优雅的解决方案。

     2. using `apply` function 
    
    aa <- apply(df[4:8],2,fit_function)
    
    
        fit_function <- function(x){nlsLM(x~ifelse(df$direc=="North"&V<J1, exp((-t_pw)/f0*exp(-del1*(1-V/J1)^2)),1)*ifelse(df$direc=="South"&V>J2, exp((-t_pw)/f0*exp(-del2*(1-V/J2)^2)),1)
        ,data=df,start=c(del1=5,J1=15,del2=1,J2=-5),trace=T)}
    

    通常我们知道错误

      

    nlsModel中的错误(formula,mf,start,wts):奇异渐变   初始参数估计矩阵

    可能将这些列分开并适合它们中的每一个并组合拟合系数可能有效。但我不知道该怎么做。

    这里是您可检查有效性的可重复数据 的 DF

    direc <- rep(rep(c("North","South"),each=10),times=6)
      V <- rep(c(seq(2,40,length.out=10),seq(-2,-40,length.out=10)),times=1)
      DQ0 = c(replicate(2, sort(runif(10,0.001,1))))
      DQ1 = c(replicate(2, sort(runif(10,0.001,1))))
      DQ2 = c(replicate(2, sort(runif(10,0.001,1))))
      DQ3 = c(replicate(2, sort(runif(10,0.001,1))))
      DQ4 = c(replicate(2, sort(runif(10,0.001,1))))
      group  =  c(replicate(1,rep(letters[1:6],each=20)))  
    df <- data.frame(group,direc,V,DQ0,DQ1,DQ2,DQ3,DQ4)
    
    library(minpack.pl)
    

    因为我想对所有列DQ0,DQ1,DQ2,DQ3,DQ4进行拟合,所以我写下了这个函数。

    拟合功能

     f0<-1e-9
     t_pw<-3e-8
    
    nls_fit=nlsLM(DQ0~ifelse(df$direc=="North"&V<J1, exp((-t_pw)/f0*exp(-del1*(1-V/J1)^2)),1)*ifelse(df$direc=="South"&V>J2, exp((-t_pw)/f0*exp(-del2*(1-V/J2)^2)),1)
            ,data=df,start=c(del1=5,J1=15,del2=1,J2=-5),trace=T)
    

    并在每个组内获得拟合结果。

    df_new<- df%>%
      group_by(group)%>%
      do(data.frame(model=tidy(nls_fit)))%>%
      select_("delta"="model.term","value"= "model.estimate")
    

    如何将DQ1,DQ2,DQ3和DQ4的拟合结果作为表格。也许这样的事情更可取

        group delta  value_DQ0  value_DQ1   value_DQ2  value_DQ3 value_DQ4 
    1      a  del1   4.962564       *           *          *         * 
    2      a    J1  14.666667       *           *          *         *
    3      a  del2   3.496986       *           *          *         *
    4      a    J2 -14.468551
    5      b  del1   4.962564
    6      b    J1  14.666667
    7      b  del2   3.496986
    8      b    J2 -14.468551
    9      c  del1   4.962564
    10     c    J1  14.666667
    ..   ...   ...        ...
    

    修改 我找到了Help with lm and multiple linear regression 也许我可以通过这个来做到这一点

    dat <- data.frame(x=1:10,y=rnorm(10),z=10:1)
    lm(x~., data=dat)
    

    但是当我像上面那样用DQ0替换if else时我得到了这个错误

    可能我错过了一些部分。你能给出一个明确的答案吗?我们将不胜感激。

0 个答案:

没有答案