用R中的数据表求解方程

Posted

技术标签:

【中文标题】用R中的数据表求解方程【英文标题】:Solve equation with datatable in R 【发布时间】:2022-01-22 17:22:42 【问题描述】:

我正在使用数据表在 R 中处理一个大型数据集。我需要解一个方程并在表达式中找到 x 的值:

data[,mean(pnorm(qnorm(var1)+x))]= 0.07

我尝试使用以下代码使用函数 optimx:

library(optimx)
fnToFindRoot = function(x)   
data[,mean(pnorm(qnorm(var1)+x))]

rootSearch = optimx(0.07, fnToFindRoot)
str(rootSearch)
fnToFindRoot(rootSearch$par)

但是产生的结果不正确。有人可以帮我解决这个等式吗?

【问题讨论】:

你能分享一些示例数据吗? 如果您的数据远离预期的均值=0、sd=1 分布,qnorm 会给出 NaN 值,例如qnorm(5). 啊,别理我,清晨的大脑冻结时刻。 qnorm 期望值介于 0 和 1 之间 【参考方案1】:

由于它只对一个变量进行优化,optimize 应该可以正常工作,例如

fnToFindRoot = function(x, a=0.07)   
  y <- data[,(mean(pnorm(qnorm(var1)+x)) - a)^2]
  print(sprintf("x: %s, y:%s", x, y))
  y

rootSearch = optimize(fnToFindRoot, interval=c(-5, 5), a=0.07)
fnToFindRoot(rootSearch$minimum)

设置方式的问题在于 optim 函数总是试图最小化目标。按照您的编写方式,它试图以0.07 作为x 的起始值来最小化mean(pnorm(qnorm(var1)+x))。相反,您希望目标尽可能接近 0.07,因此请最小化 (mean(pnorm(qnorm(var1)+x)) - a)^2

interval控制优化可以使用的x的范围

编辑:我使用的是虚构的数据,因此请检查 rootSearch$minimum 是否适合您。我编造的数据:

set.seed(1)
data <- data.table()
data[, var1 := runif(100, 0.04, 0.45)]
> fnToFindRoot(rootSearch$minimum)
[1] "x: -0.857685927870974, y:4.1043516952502e-13"
[1] 4.104352e-13

【讨论】:

以上是关于用R中的数据表求解方程的主要内容,如果未能解决你的问题,请参考以下文章

AX=0 在matlab中是用null函数求解吗?null怎么用

解微分方程+ode求解器

如何用matlab求解常微分方程?matlab解常微分方程之符号解法介绍

R语言solve函数求解方程实战

使用`Ryacas`包或替代方案在R中象征性地求解非线性方程

在 PL/SQL 中求解多项式方程