所以我刚刚回答了一个问题,一旦得到回答(我认为正确),提问者就删除了它。所以这又是:
我是R的新手,需要帮助才能使此功能正常工作。我需要创建一个函数,可以找到任何函数的mgf日志,并返回指定t的值。我已经做了很多研究,我发现很多东西告诉我使用Vectorize()并确保我正确地定义我的参数但我似乎仍然无法让它工作。如果有人可以帮助我,我会很高兴!
我需要编写一个返回mgf自然对数的数字向量的函数
# I'm using the expression 2*x as an example
# You can use any integrand as long as it is a function of x
logmgf <- function(integrand, upper, lower, t) {
expression <- function(x, t) {
integrand * exp(x * t)
}
integrate <- integrate(expression(x, t), upper, lower)
logmgf <- log(Vectorize(integrate[1]))
return(logmgf)
}
logmgf(2 * x, upper = Inf, lower = 0, t = 0)
2小时前问过
熊璐
答案 0 :(得分:2)
让我们尝试更具统计性或数学意义的东西,例如非规范化的正态分布,即表达式:exp(-x ^ 2)
您正在尝试创建一个新表达式(实际上是一个R&#34;调用&#34;),它将被解析为该表达式乘以exp(x * t)的乘积,因此您需要a)传递函数是一个真正的R语言对象,b)使用不会破坏它的函数来处理它。 quote
- 函数将构造一个substitute
可以在&#34;语言级别操作的表达式&#34;。不幸的是,function
- 函数将评估&#34; body&#34;参数以不符合您的符号意图的方式,因此您需要使用body<-
(函数),该函数需要赋值运算符右侧的表达式。我将在一些调试print(.)
调用中离开,我曾经在之前的工作中了解我出错的地方:
logmgf <- function(integrand, upper, lower, t) {
expr <- substitute( integrand *exp(x*t), list(integrand=integrand) )
print(expr)
func <- function(x ){} # builds an empty function in x
body(func)<- expr # could have also set an environment
# but in this case using envir=parent.frame() is not appropriate
print(func)
integral <- integrate( func, upper=upper,
# notice need to name the parameters
lower=lower
# else they would be positionally matched
# (and therefore reversed in this case)
)$value
# the integrate fn returns a loist and the numeric part is in $value
logmgf <- log(integral)
}
res <- logmgf(quote(exp(-x^2)), upper = Inf, lower = -Inf, t = 0)
> res
[1] 0.5723649
MGF从-Inf集成到Inf(或仅限于具有已定义值的x的受限域的函数)。
我想检查一下我是否会从已知参数中得到正确的答案,所以我为正态分布添加了正确的归一化常量:
mgf <- function(integrand, upper, lower, t) {
expr <- substitute( integrand *exp(x*t), list(integrand=integrand) )
func <- function(x ){}; body(func)<- expr
integral <- integrate( func, upper=upper, lower=lower)$value
}
res <- mgf(quote((1/sqrt(2*pi))*exp(-x^2/2)), upper = Inf, lower = -Inf, t = 0)
res
#[1] 1