【问题标题】:apply using values of each line in a data.frame as parameters in R使用 data.frame 中每一行的值作为 R 中的参数应用
【发布时间】:2016-04-15 20:04:13
【问题描述】:

我有 1 个 data.frame 如下,每一行都是不同的 Stock 数据:

Teste=data.frame(matrix(runif(25), nrow=5, ncol=5))
colnames(Teste) <- c("AVG_VOLUME","AVG_RETURN","VOL","PRICE","AVG_XX")

    AVG_VOLUME AVG_RETURN   VOL       PRICE      AVG_XX
 1  0.7028197  0.9264265    0.2169411 0.80897110 0.3047671
 2  0.7154557  0.3314615    0.4839466 0.63529520 0.5633933
 3  0.4038030  0.4347487    0.3441471 0.07028743 0.7704912  
 4  0.5392530  0.6414982    0.4482528 0.11087518 0.3512511
 5  0.8720084  0.9615865    0.8081017 0.45781973 0.0137508

我想要做的是使用 cols AVG_RETURN、VOL、PRICE 作为 data.frame 中所有行的参数,从包 sde (https://cran.r-project.org/web/packages/sde/sde.pdf) 应用函数 GBM。 像这样:

Result <- apply(Teste,1,function(x) {
    GBM(x[,"PRICE"],x[,"AVG_RETURN"],x[,"VOL"],1,252)
})

所以我希望 Result 是一个 data.frame,它为 Teste data.frame 中的每个 Stock 运行 GBM。

我怎样才能得到这个结果?

【问题讨论】:

  • 目前还不清楚为什么可以为每行数据求解单独的几何随机微分方程。 apply 函数用于一次运行一行或一列函数。 SDE 通常会被赋予向量参数。我认为您需要找到一个可以帮助您解决家庭作业问题的面向统计数据的网站。
  • 我不认为这个问题断章取义,如果一个投资组合中所有股票的模拟未来路径来做我需要的任何分析。我有在 data.frame 中运行几何布朗运动所需的所有数据,我想以最有效的方式为每只股票运行它。这不是家庭作业,它适用于风险经理的日常工作
  • 您可以“运行 GBM”的想法似乎非常简单。 GBM() 会根据输入给出一个向量。但是每次运行的结果会有所不同,您需要对每只股票进行数千次运行才能执行任何类型的风险分析。我相信你不明白目标应该是什么,我建议你需要先明确目标。当可以明确具体目标时,您将准备好接受编码建议。
  • 无论我的目标是什么,或者我是否需要为每只股票生成 N 次模拟,使用 GBM 都无关紧要,因为问题的重点不是我想具体完成,重点是笼统的多。如果您忽略 GBM 和其余部分,那么问题很简单:如果我有一个带有 N 个参数的函数,并且我有一个 data.frame,其中的列包含我想在这个函数中输入的变量,那么什么是最有效的逐行方式,将列上的值作为参数输入并在每一行中获取结果
  • 为了学习,您可能需要查看 ?mapply

标签: r dataframe apply


【解决方案1】:

关于为什么会出错的狭隘问题的答案是,当apply 函数传递值时,它只是作为向量而不是数据帧,因此删除"[" 参数中的逗号会让你得到结果。

Result <- apply(Teste,1,function(x) {
    GBM(x[,"PRICE"],x[,"AVG_RETURN"],x[,"VOL"],1,252)
})

如果您需要它是一个数据框,其中每只股票都是一列,并且输入数据结构具有有意义的股票名称,那么我建议使用:

dfRes <- setNames( data.frame(Result), rownames(Teste) )

我认为这在风险分析上下文中可能有意义的唯一方法是,如果在更高级别的上下文中组装比这些单个实例更多的模拟运行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-09
    • 1970-01-01
    相关资源
    最近更新 更多