使用nls2包进行非线性回归

时间:2016-06-16 12:22:51

标签: r

我处理聚集效应,我想用包nls2运行非线性回归。

我试图用R

运行这个模型
dens=runif(100)
surf=rnorm(100, 10, 2)  
zone=seq(1,100,1)  
donnees<-data.frame(dens,surf,zone)   
attach(donnees) 
donnees$salaire<-rnorm(100, 1000,3)    
mp<-rep(0,100)    
MP<-rep(0,100)
MPfonc<-function(alpha){    
for (i in 1:100){    
   for (j in 1:100){    
     if(j!=i){    
    mp[j]<- dens[j]/(surf[i]-surf[j])^alpha
     }
  }    
  MP[i]<-sum(mp)    
}    
  return(MP)    
}

fo <- salaire ~ const+ gamma1*dens+gamma2*surf+gamma3*MPfonc(alpha)

gstart <- data.frame(const = c(-100, 100), gamma1 = c(-10, 10),
       gamma2 = c(-10, 10),gamma3 = c(-10, 10), alpha=c(-10, 10))
fm <- nls2(fo, start = gstart,  alg = "plinear-random")

它没有运行,我认为这是alpha问题。 nls2函数可以接受函数(MP(alpha))作为输入吗?

以下是我的模型的说明:

nonlinear regression equations

1 个答案:

答案 0 :(得分:3)

问题是:

  • set.seed应设置为使代码可重现

  • salaire未定义 - 它在数据框donnees中定义,但之后从未使用donnees

  • sum MPfonc调用中总和的元素包含NaN或NA元素,因此总和变得同样未定义

  • 对于plinear算法,公式的RHS必须评估为线性参数的系数矩阵。

  • plinear算法仅为非线性参数提供起始值(即仅适用于alpha)。

  • 永远不会加载nls2包。需要library声明。

  • 发布到SO的
  • 代码应缩进4个空格以使其格式正确(这在问题的编辑中得到解决)

  • 问题中的数学公式并不清楚它们与问题的关系,并且缺少重要的元素,例如: alpha。这需要清理。我们假设MPfonc给出了期望的结果并简化了它。

以下内容纠正了所有要点并添加了一些小改进。

library(nls2)

set.seed(123) # for reproducibility

dens <- runif(100)
surf <- rnorm(100, 10, 2)
zone <- seq(1, 100, 1)
salaire <- rnorm(100, 1000, 3)

MPfonc <- function(alpha) {
  sapply(1:100, function(i) sum( (dens / (surf[i] - surf) ^ alpha)[-i], na.rm = TRUE ))
}

fo <- salaire ~ cbind(1, dens, surf, MPfonc(alpha))
gstart <- data.frame(alpha = c(-10, 10))

fm <- nls2(fo, start = gstart, alg = "plinear-random")

,并提供:

> fm
Nonlinear regression model
  model: salaire ~ cbind(1, dens, surf, MPfonc(alpha))
   data: parent.frame()
     alpha      .lin1  .lin.dens  .lin.surf      .lin4 
   0.90477 1001.20905   -0.50642   -0.12269    0.00681 
 residual sum-of-squares: 757.6

Number of iterations to convergence: 50 
Achieved convergence tolerance: NA

注意:现在我们有了起始值,我们可以像nls一样使用它:

nls(fo, start = coef(fm)["alpha"], alg = "plinear")

更新:一些代码改进,更正和澄清。