2010-12-10 31 views
3

我有一個相當簡單的問題,但不幸的是只是不能得出結果: 我想將GBSVolatility函數應用於我的data.frame的每一行。對每一行應用GBSVolatility

我做了以下內容:

> vol <- function(x) GBSVolatility(x$Price, "c", S = 1000, x$Strike, Time = 1/4, 
r = 0.01, b = 0.02, maxiter = 500) 
> foo$iv <- apply(foo, 1, vol) 

但是,這是行不通的。有人能告訴我爲什麼嗎?

非常感謝

達尼

更新: 謝謝您的建議。我的數據幀被稱爲foo,看起來像這樣

Date Price Strike Name 
1.1 100 1200 X 
1.1 120 1500 P 
etc. 

我想創建一個隱含波動率的新列。我試圖申請,

vol <- function(x) GBSVolatility(x["Price"], "c", S = 1000, x["Strike"], 
    Time = 1/4, r = 0.01, b = 0.02, maxiter = 500) 
foo$iv <- apply(foo, 1, vol) 

但它沒有工作。

您有任何其他建議嗎?謝謝

回答

3

申請行上的數據幀將數字轉換爲字符,如果數據框的一列或多列是字符。所以容易的解決方法是再次轉換卷:

vol <- function(x) GBSVolatility(as.numeric(x["Price"]), "c", S = 1000,  
    as.numeric(x["Strike"]), Time = 1/4, r = 0.01, b = 0.02, maxiter = 500) 
apply(foo, 1, vol) 

這不是優雅。 我不能只是現在回憶起來的更優雅的方式,可能使用d *股或東西...

也許這是更優雅:

library(plyr) 
vol <- function(x) GBSVolatility(x$Price, "c", S = 1000, x$Strike, 
    Time = 1/4, r = 0.01, b = 0.02, maxiter = 500) 
foo$iv <- adply(foo, 1, vol)$V1 
+0

這確實奏效,非常感謝! – Dani 2010-12-10 14:45:22

2

您不應該使用$,因爲apply給出的輸入是名爲向量而不是data.frames。所以這應該工作:

vol <- function(x) GBSVolatility(x["Price"], "c", S = 1000, x["Strike"], 
     Time = 1/4, r = 0.01, b = 0.02, maxiter = 500) 
foo$iv <- apply(foo, 1, vol) 
+0

我認爲你的意思是「命名向量」,而不是「矩陣」。如果'foo'是一個標準的數據框,'x'將是一個帶有names屬性的數字向量,而不是一個矩陣。 – 2010-12-10 11:53:18

+0

@Gavin好的一點,我從更多維度的情況推斷了這一點。我會更新答案。 – mbq 2010-12-10 13:00:32

+0

非常感謝,但不幸的是它沒有工作。我必須以不同的方式編寫函數嗎?我更新了我的Q. – Dani 2010-12-10 13:22:03

1

這是我能做到的最好。這有點「魔力」,但我認爲迄今爲止最具可讀性的選項?

foo <- read.table(textConnection("Date Price Strike Name 
1.1 100 1200 X 
1.1 120 1500 P"),header=TRUE) 

foo$iv <- with(d,mapply(GBSVolatility, 
       Price,Strike, 
       MoreArgs=list(TypeFlag="c",S=1000, 
       Time=1/4,r=0.01,b=0.02,maxiter=500)))