我处理聚集效应,我想用包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))
作为输入吗?
以下是我的模型的说明:
答案 0 :(得分:3)
问题是:
set.seed
应设置为使代码可重现
salaire
未定义 - 它在数据框donnees
中定义,但之后从未使用donnees
。
sum
MPfonc
调用中总和的元素包含NaN或NA元素,因此总和变得同样未定义
对于plinear
算法,公式的RHS必须评估为线性参数的系数矩阵。
plinear
算法仅为非线性参数提供起始值(即仅适用于alpha
)。
永远不会加载nls2包。需要library
声明。
代码应缩进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")
更新:一些代码改进,更正和澄清。