拟合反函数

时间:2013-11-28 12:40:22

标签: r function optimization inverse

我有一个看起来像这样的功能:   g(x)= f(x) - a ^ b / f(x)^ b

g(x) - 已知函数,提供的数据向量 f(x) - 隐藏过程。
a,b - 此函数的参数。

从上面我们得到了关系:
f(x)= inverse(g(x))

我的目标是优化参数 a b ,使f(x)尽可能接近 正常分布。如果我们查看af(x)QQ正态图(附图),我的目的是通过优化参数 a 和<来最小化f(x)到表示正态分布的直线之间的距离。强> b'/ strong>即可。

我写了下面的代码:

g_fun <- function(x) {x - a^b/x^b}

inverse = function (f, lower = 0, upper = 2000) {
      function (y) uniroot((function (x) f(x) - y), lower = lower, upper = upper)[1]
}


f_func = inverse(function(x) g_fun(x))
enter code here

# let's made up an example 
# g(x) values are known 
g <- c(-0.016339, 0.029646, -0.0255258, 0.003352, -0.053258, -0.018971, 0.005172,  
       0.067114, 0.026415, 0.051062)  

# Calculate f(x) by using the inverse of g(x), when a=a0 and b=b0
for (i in 1:10) {  
  f[i] <- f_fun(g[i])  
}

我有两个问题:

  1. 如何将参数a和b传递给函数?
  2. 如何执行此优化任务,意味着找到a和b使f(x)接近正态分布。
  3. Q-Q norm plot of f(x)

1 个答案:

答案 0 :(得分:2)

由于您提供的示例不起作用,因此不确定您是如何制作Q-Q图的。您没有指定a和b的值,而是定义f_func但调用f_fun。无论如何,这是我对你的问题的回答:

  1. 如何将参数a和b传递给函数? - 把他们当作传递给他们 函数的参数。
  2. 如何执行此优化任务,意味着找到a和b使f(x)接近正态分布? - 完成任何优化任务的方式相同。定义成本函数,然后将其最小化。
  3. 这是修改后的代码:我添加了a和b作为参数,删除了反函数并将其合并到f_func中,现在可以采用向量输入,因此不需要for循环。

    g_fun <- function(x,a,b) {x - a^b/x^b}
    
    f_func = function(y,a,b,lower = 0, upper = 2000){
      sapply(y,function(z) { uniroot(function(x) g_fun(x,a,b) - z, lower = lower, upper = upper)$root})
    } 
    
    # g(x) values are known 
    g <- c(-0.016339, 0.029646, -0.0255258, 0.003352, -0.053258, -0.018971, 0.005172,  
           0.067114, 0.026415, 0.051062)  
    f <- f_func(g,1,1) # using a = 1 and b = 1
    #[1] 0.9918427 1.0149329 0.9873386 1.0016774 0.9737270 0.9905320 1.0025893
    #[8] 1.0341199 1.0132947 1.0258569
    
    f_func(g,2,10)
     [1] 1.876408 1.880554 1.875578 1.878138 1.873094 1.876170 1.878304 1.884049
     [9] 1.880256 1.882544
    

    现在对于优化部分,它取决于f(x)的近似正态分布的含义。如果需要,您可以比较qq-line的均方误差。既然你说近似,那么近距离足够好吗?您可以使用shapiro.test并继续搜索,直到您发现p值低于0.05(可能没有解决方案)

    shapiro.test(f_func(g,1,2))$p
    [1] 0.9484821
    
    cost <- function(x,y) shapiro.test(f_func(g,x,y))$p
    

    既然我们有成本函数,我们如何才能最大限度地减少它。有许多不同的方法来进行数值优化。看一下optim函数http://stat.ethz.ch/R-manual/R-patched/library/stats/html/optim.html

    optim(c(1,1),cost)
    

    这最后一行不起作用,但如果没有适当的数据和背景,这就是我可以做到的。希望这会有所帮助。