【问题标题】:How to apply a formula to a vector in R?如何将公式应用于R中的向量?
【发布时间】:2014-03-08 22:32:54
【问题描述】:

不是第一次,我想答案很简单。但是寻找 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 基础包已经具备相应的功能。只是……在哪里?

谢谢!

【问题讨论】:

  • 只是为了澄清-您的问题是如何将公式应用为函数?

标签: r


【解决方案1】:

我在查找您尝试过的途径和 Gabor 发布的解决方案时遇到了this thread。请注意,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

从 cmets 中,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

【讨论】:

  • Arg - 很抱歉将“编造的函数名称”与解决方案混为一谈。但是,我无法相信将公式应用于数据(可能是最不言而喻的应用程序)需要额外的包......
  • @BurninLeo 了解formula 接口的动机可能会有所帮助;一种象征性地描述统计模型的方法。它使用众所周知的 Wilkinson Rogers 符号来表示 * 和 `` \ `` 等字符具有特殊含义的公式。考虑到公式接口的特殊动机,如果您需要额外的脚手架和函数来将其转换为可以用作函数的东西,这并不奇怪。 nls() 函数有特殊的代码来处理公式作为方程。 nls2 包对此进行了扩展。我看不出这里如何使用nls()
  • 嗯 - 以这种方式转动时(有些)有意义。谢谢你的解释!
  • 都一样——@BurninLeo 可能你真的只想创建一个函数 y&lt;-function(a,b,x) {stuff_goes_here} 。这取决于你的最终意图。要使用nls2或者其他适配的功能包,这里的答案很好。如果您只想调整一些值并与您原来的y 进行比较,那么您只需要编写一个函数,而不是一个公式。
  • 是的,实际上我使用的是函数而不是公式。我最近意识到 nls() 也可以与 y~function 一起使用。这使整个事情变得更容易:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-07-30
  • 2016-09-01
  • 1970-01-01
  • 2017-01-18
  • 2018-02-01
  • 2012-12-21
  • 1970-01-01
相关资源
最近更新 更多