2

不是第一次,我想答案很简单。但是寻找 R 解决方案通常是一项艰苦的工作,两小时后可能是时候问某人了……

我正在使用一个非线性公式(这只是第一个工作,它实际上很快就会变成非线性的)并且为了测试我的初始值,我想简单地计算一系列 x 值的值。

这是一些代码:

x <- c(1,2,3,4,5,6,7,8,9,10,11,12) #etc
y <- c(NA,332,248,234,84,56,26,24,27,33,37,25) #etc
# This is my formula I shall soon expand
fEst <- y ~ 1 / (x / a + 1) * b
# Initial value
a <- 800
# Initial value based on inverted formula and second measure
b <- y[2] * (x[2] / a + 1)

# Can i use my formula fEst to do this step?
p <- 1 / (x / a + 1) * b

关键是我正在研究这个公式 - 每次更改两次似乎很奇怪......

我发现的是一个包 nls2 ,其中可能有这样的事情和一个函数 apply.a.formula ,它似乎是另一个包中的一个元素 - 但由于这是一个非常基本的函数使用,我猜 R 基础包已经具备相应的功能。只是……在哪里?

谢谢!

4

1 回答 1

3

我在查找您尝试过的途径和 Gabor 发布的解决方案时遇到了这个线程。请注意,这apply.a.formula()是一个虚构的函数名称,线程中的 OP 正在寻找一个真正的函数。

使用 Gabor 在线程中提供的示例,这是使用nls2包的解决方案:

## your data
x <- c(1,2,3,4,5,6,7,8,9,10,11,12) #etc
y <- c(NA,332,248,234,84,56,26,24,27,33,37,25) #etc
# This is my formula I shall soon expand
fEst <- y ~ 1 / (x / a + 1) * b
# Initial value
a <- 800
# Initial value based on inverted formula and second measure
b <- y[2] * (x[2] / a + 1)

## install.packages("nls2", depend = TRUE) if not installed
require(nls2)
fitted(nls2(fEst, start = c(a = a, b = b), alg = "brute"))

最后一行给出:

R> fitted(nls2(fEst, start = c(a = a, b = b), alg = "brute"))
 [1] 332.4145 332.0000 331.5866 331.1741 330.7627 330.3524 329.9430 329.5347
 [9] 329.1273 328.7210 328.3157 327.9113
attr(,"label")
[1] "Fitted values"

这与给出的基本相同1 / (x / a + 1) * b

R> 1 / (x / a + 1) * b
 [1] 332.4145 332.0000 331.5866 331.1741 330.7627 330.3524 329.9430 329.5347
 [9] 329.1273 328.7210 328.3157 327.9113

从评论中,Carl Witthoft 指出,如果您想概括这样的方程,1 / (x / a + 1) * b那么函数可能是一种封装运算的有用方法,而无需1 / (x / a + 1) * b每次都输入。例如

myeqn <- function(a, b, x) { 1 / (x / a + 1) * b }

R> myeqn(a, b, x)
[1] 332.4145 332.0000 331.5866 331.1741 330.7627 330.3524 329.9430 329.5347
[9] 329.1273 328.7210 328.3157 327.9113
于 2012-05-09T11:49:47.557 回答