R nls2 函数 - 结果 [[which.min(ss)]] 错误:尝试 select 少于 get1index 中的一个元素
R nls2 function - Error in result[[which.min(ss)]] : attempt to select less than one element in get1index
我花了 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")
结果是
Error in numericDeriv(form[[3L]], names(ind), env) :
Missing value or an infinity produced when evaluating the model
Error in result[[which.min(ss)]] :
attempt to select less than one element in get1index
我试过
st2<- data.frame(a = c(0,1000), b = c(0, 800))
o<-nls2(f1,
start = st2,
algorithm = "brute-force")```
得到
Error in result[[which.min(ss)]] :
attempt to select less than one element in get1index
我不知道 a 的值是多少,这也使得很难给出起始值。我必须将等式应用于多个数据集(这里我只举较小的一个为例)。
关于如何完成此操作的任何提示?
也许使用不同的包进行多元回归而不是 nls2?
任何帮助将不胜感激!
无法识别模型。外括号没有区别,因此我们可以将您的模型等效地写为:
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")
已添加
根据评论,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
)并求解 A = a * b / (a + b)
得到 b
(或 a
),注意如果我们取两边的倒数,我们有 1/A = 1/a + 1/b
,即 A
是 a
和 b
.
的调和平均值的一半
如果您确实想使用 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")
我花了 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")
结果是
Error in numericDeriv(form[[3L]], names(ind), env) : Missing value or an infinity produced when evaluating the model Error in result[[which.min(ss)]] : attempt to select less than one element in get1index
我试过
st2<- data.frame(a = c(0,1000), b = c(0, 800))
o<-nls2(f1,
start = st2,
algorithm = "brute-force")```
得到
Error in result[[which.min(ss)]] : attempt to select less than one element in get1index
我不知道 a 的值是多少,这也使得很难给出起始值。我必须将等式应用于多个数据集(这里我只举较小的一个为例)。
关于如何完成此操作的任何提示? 也许使用不同的包进行多元回归而不是 nls2?
任何帮助将不胜感激!
无法识别模型。外括号没有区别,因此我们可以将您的模型等效地写为:
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")
已添加
根据评论,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
)并求解 A = a * b / (a + b)
得到 b
(或 a
),注意如果我们取两边的倒数,我们有 1/A = 1/a + 1/b
,即 A
是 a
和 b
.
如果您确实想使用 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")