首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R nls2函数-结果[[which.min(Ss)]中的错误:尝试在get1index中选择少于一个元素

R nls2函数-结果[[which.min(Ss)]中的错误:尝试在get1index中选择少于一个元素
EN

Stack Overflow用户
提问于 2020-03-06 11:31:07
回答 1查看 263关注 0票数 1

两天来,我一直在努力做一个多元回归。现在我要说的是:

代码语言:javascript
复制
y<- c(-0.3902,  0.5277,  0.4357, -0.1888, -6.7422,  0.3797, -0.5141,      NA, -1.2423,  5.6756, -0.5352,
-0.2379,      NA,  0.4270,      NA,      NA,      NA,      NA,      NA,      NA, -1.1185,  0.0594,
 0.8280,      NA,  1.8387, -3.1469,-1.6212, -0.8400,      NA ,     NA,      NA, -0.7291,  2.0888)
x<- c( 0.07712829, 0.07038519, 0.08875312, 0.08235028, 0.10874493, 0.09713412, 0.11821937, 0.12796526,
0.12159038, 0.08520884, 0.07046089, 0.07417249, 0.07507544, 0.11416440, 0.09955467, 0.06688244,
0.06871298, 0.06187514, 0.12293434, 0.07864503, 0.12417404, 0.08600490, 0.10745128, 0.12277381,
0.12952106, 0.09144677, 0.09034708, 0.08039892, 0.07856194, 0.07864304, 0.10883127, 0.10690687,
0.11617899)

f1<- y ~ ((a*b)/(a+b)+x)

st1 <- expand.grid(a = seq(0, 1000, len = 10),
                   b = seq(0, 800, len = 10))

o<-nls2(f1,
        start = st1,
        algorithm = "brute-force")

结果是

numericDeriv中的错误(form[3L],name(Ind),env):在计算结果[which.min(Ss)]中的模型错误时产生的缺失值或无穷大:尝试在get1index中选择少于一个元素

我试过了

代码语言:javascript
复制
st2<- data.frame(a = c(0,1000), b = c(0, 800))
o<-nls2(f1,
        start = st2,
        algorithm = "brute-force")```

获取

结果中的

错误[which.min(Ss)]:尝试在get1index中选择少于一个元素

我不知道一个人的价值是什么,这也让我很难给出一个开始的价值。我必须将这个方程应用于多个数据集(这里我只给出一个较小的数据集)。

有什么关于如何完成这件事的建议吗?也许使用不同的包进行多元回归,而不是使用nls2?

任何帮助都将不胜感激!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-03-06 14:20:34

模型是不可识别的。外括号没有什么区别,因此我们可以将您的模型等效地写成:

代码语言:javascript
复制
y ~ (a*b)/(a+b) + x

第一个项只是一个常数,所以不能是两个参数的函数。

还请注意,右边是NaN if a=b=0。

也许您打算使用下面所示的f2。在较低的限值中也将0改为1,以避免NaN情况。

代码语言:javascript
复制
st2 <- data.frame(a = c(1, 1000), b = c(1, 800))
f2 <- y ~ (a*b) / (a+b+x)
nls2(f2, start = st2, algorithm = "brute-force")

已添加

从注释中可以看出,y ~ (a*b)/(a+b) + x实际上是您的意图,因此在这种情况下,我们可以使用以下方法使其可识别并可修改为建模:

代码语言:javascript
复制
 f3 <- y ~ A + x
 nls(f3, start = list(A = 1))

该模型简单,可以作为mean(y - x, na.rm = TRUE)直接计算A的最优值。现在任意选择a (或b),求解b (或a)的A = a * b / (a + b) (或a),指出如果采用双方累加,则存在1/A = 1/a + 1/b,即Aab的调和均值的一半。

如果您确实想使用nls (尽管没有它很容易),这样就不必为a或b求解,然后尝试如下:

代码语言:javascript
复制
o <- order(x)
dd <- na.omit(data.frame(x, y)[o, ])
b <- 800
f1 <- y ~ (a*b)/(a+b) + x
fm <- nls(f1, dd, start = list(a = 1))
plot(y ~ x, dd)
lines(fitted(fm) ~ x, dd, col = "red")
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60563224

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档