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

Posted

技术标签:

【中文标题】R nls2 函数 - 结果 [[which.min(ss)]] 中的错误:尝试在 get1index 中选择少于一个元素【英文标题】:R nls2 function - Error in result[[which.min(ss)]] : attempt to select less than one element in get1index 【发布时间】:2020-06-19 03:20:50 【问题描述】:

我有 2 天的时间在努力进行多元回归。 这是我目前所拥有的:

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]], names(ind), env) 中的错误: 评估模型时产生的缺失值或无穷大 结果错误[[which.min(ss)]]: 尝试在 get1index 中选择少于一个元素

我试过了

st2<- data.frame(a = c(0,1000), b = c(0, 800))
o<-nls2(f1,
        start = st2,
        algorithm = "brute-force")```

得到

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

我不知道 a 的值是多少,这也使得给出一个起始值变得困难。我必须将方程应用于多个数据集(这里我只给出较小的一个)。

关于如何完成这项工作的任何提示? 也许使用不同的包进行多元回归而不是 nls2?

任何帮助将不胜感激!

【问题讨论】:

【参考方案1】:

模型无法识别。外括号没有区别,因此我们可以将您的模型等效地编写为:

y ~ (a*b)/(a+b) + x

第一项只是一些常数,因此不能是两个参数的函数。

另请注意,如果 a=b=0,则右侧为 NaN。

也许您打算使用如下所示的f2。也将下限中的 0 改为 1 以避免出现 NaN 情况。

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")

添加

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

 f3 <- y ~ A + x
 nls(f3, start = list(A = 1))

这个模型非常简单,我们可以直接交替计算A的最优值mean(y - x, na.rm = TRUE)。现在任意选择a(或b)并为b(或a)求解A = a * b / (a + b),注意如果我们取两边的倒数,我们有1/A = 1/a + 1/b,即A是谐波的一半ab 的平均值。

如果您确实想使用 nls(即使不使用它也很容易),这样您就不必求解 a 或 b,那么试试这个:

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")

【讨论】:

G.格洛腾迪克我的等式是正确的,尽管有额外的 ()。 y ~ (a*b)/(a+b) + x。到目前为止,我尝试了不同的起始值组合,但没有成功。 见添加部分。 谢谢 G. Grothendieck。我给了一个任意的 b=800 ,结果对我来说没有意义。在这一点上,我可能不再直截了当。非线性回归模型模型:y - x ~ (a * 800)/(a + 800) 数据: a -0.1431 残差平方和:102.9 迭代收敛次数:2 实现收敛容差:1.501e- 09 如前所述,这很简单,您甚至不需要nls,平均值足以计算A,然后您可以手动求解;但是,如果您希望让 nls 完成工作,我在最后添加了一些代码。 确实!非常感谢您的帮助,非常感谢。我只是随机划分数据集进行交叉验证,它正在工作。

以上是关于R nls2 函数 - 结果 [[which.min(ss)]] 中的错误:尝试在 get1index 中选择少于一个元素的主要内容,如果未能解决你的问题,请参考以下文章

r语言optim函数给不同的初值为啥结果不同

ugarchforecast函数结果代表啥 r语言

R语言 数据处理的常用函数

如何解释 R kmeans 函数的结果?

如何在 R 中保存函数的结果而不返回它?

R - 添加新分组列时聚合函数不同的结果