получить доступ к данным внутри слотов объектов S4

в основном я использую пакет, который дает мне объект S4 со многими слотами. эти объекты легко доступны с s4obj@portfolio, но тогда мне нужно извлечь из этого слота вектор.

более конкретно, пакет — fPortfolio, а функция — portfolioFrontier(). в связанном PDF-файле находится на странице 19. (http://postimg.org/image/62oa8z7dv/ )

в приложенном к упаковке pdf указано, что такой слот есть

"список, содержащий спецификации параметров для портфеля: weights числовой вектор, определяющий веса портфеля, targetReturn числовое значение, определяющее целевую доходность,"

Я хочу выделить «веса», но пока ничего не получилось (ошибки включают в себя то, что объект не является подмножеством, $ не работает [что означает, что s4obj@portfolio$weights не работает] и т. д.)

код на работе:

frontier=portfolioFrontier(as.timeSeries(elements))
frontier@portfolio
frontier@portfolio$weights

Error in frontier@portfolio$weights : 
  $ operator not defined for this S4 class

p.s.: я надеюсь, что на этот вопрос еще не ответили в другом месте, но я ничего не нашел на этом форуме или в Интернете по этому вопросу

ps2: str() дает

> str(frontier@portfolio)
Formal class 'fPFOLIOVAL' [package "fPortfolio"] with 2 slots
  ..@ portfolio:List of 7
  .. ..$ weights         : num [1:49, 1:14] 0.0805 0.161 0.2415 0.322 0.4025 ...
  .. .. ..- attr(*, "dimnames")=List of 2
  .. .. .. ..$ : NULL
  .. .. .. ..$ : chr [1:14] "MNEU" "OBGVEUBR" "OBGVEUML" "OBCPEU" ...
  .. ..$ covRiskBudgets  : num [1:49, 1:14] -3.54e-05 -7.73e-05 -1.28e-04 -1.90e-04 -2.67e-04 ...
  .. .. ..- attr(*, "dimnames")=List of 2
  .. .. .. ..$ : NULL
  .. .. .. ..$ : chr [1:14] "MNEU" "OBGVEUBR" "OBGVEUML" "OBCPEU" ...
  .. ..$ targetReturn    : num [1:49, 1:2] -0.00171 -0.00154 -0.00136 -0.00119 -0.00101 ...
  .. .. ..- attr(*, "dimnames")=List of 2
  .. .. .. ..$ : NULL
  .. .. .. ..$ : chr [1:2] "mean" "mu"
  .. ..$ targetRisk      : num [1:49, 1:4] 0.0394 0.0359 0.0325 0.029 0.0256 ...
  .. .. ..- attr(*, "dimnames")=List of 2
  .. .. .. ..$ : NULL
  .. .. .. ..$ : chr [1:4] "Cov" "Sigma" "CVaR" "VaR"
  .. ..$ targetAlpha     : num 0.05
  .. ..$ minriskPortfolio:Formal class 'fPORTFOLIO' [package "fPortfolio"] with 7 slots
  .. .. .. ..@ call       : language minriskPortfolio(data = data, spec = spec, constraints = constraints)
  .. .. .. ..@ data       :Formal class 'fPFOLIODATA' [package "fPortfolio"] with 3 slots
  .. .. .. .. .. ..@ data      :List of 3
  .. .. .. .. .. .. ..$ series :Time Series:          
 Name:               object
Data Matrix:        
 Dimension:          240 14
 Column Names:       MNEU OBGVEUBR OBGVEUML OBCPEU OBGVIN OBCPNOEU OBGLHGYD OBPSEM AZEU AZUS AZPC AZEM AZRE ATCOMM
 Row Names:           ... 
Positions:          
 Start:              
 End:                
With:               
 Format:             counts
 FinCenter:          
 Units:              MNEU OBGVEUBR OBGVEUML OBCPEU OBGVIN OBCPNOEU OBGLHGYD OBPSEM AZEU AZUS AZPC AZEM AZRE ATCOMM
 Title:              Signal Series Object
 Documentation:      Wed Mar 18 12:18:11 2015
  .. .. .. .. .. .. ..$ nAssets: int 14
  .. .. .. .. .. .. ..$ names  : chr [1:14] "MNEU" "OBGVEUBR" "OBGVEUML" "OBCPEU" ...
  .. .. .. .. .. ..@ statistics:List of 5
  .. .. .. .. .. .. ..$ mean     : Named num [1:14] 0.000277 0.0011 0.003337 0.002433 0.001609 ...
  .. .. .. .. .. .. .. ..- attr(*, "names")= chr [1:14] "MNEU" "OBGVEUBR" "OBGVEUML" "OBCPEU" ...
  .. .. .. .. .. .. ..$ Cov      : num [1:14, 1:14] 2.57e-08 1.60e-07 1.39e-07 -7.50e-08 4.11e-07 ...
  .. .. .. .. .. .. .. ..- attr(*, "dimnames")=List of 2
  .. .. .. .. .. .. .. .. ..$ : chr [1:14] "MNEU" "OBGVEUBR" "OBGVEUML" "OBCPEU" ...
  .. .. .. .. .. .. .. .. ..$ : chr [1:14] "MNEU" "OBGVEUBR" "OBGVEUML" "OBCPEU" ...
  .. .. .. .. .. .. ..$ estimator: chr "covEstimator"
  .. .. .. .. .. .. ..$ mu       : Named num [1:14] 0.000277 0.0011 0.003337 0.002433 0.001609 ...
  .. .. .. .. .. .. .. ..- attr(*, "names")= chr [1:14] "MNEU" "OBGVEUBR" "OBGVEUML" "OBCPEU" ...
  .. .. .. .. .. .. ..$ Sigma    : num [1:14, 1:14] 2.57e-08 1.60e-07 1.39e-07 -7.50e-08 4.11e-07 ...
  .. .. .. .. .. .. .. ..- attr(*, "dimnames")=List of 2
  .. .. .. .. .. .. .. .. ..$ : chr [1:14] "MNEU" "OBGVEUBR" "OBGVEUML" "OBCPEU" ...
  .. .. .. .. .. .. .. .. ..$ : chr [1:14] "MNEU" "OBGVEUBR" "OBGVEUML" "OBCPEU" ...
  .. .. .. .. .. ..@ tailRisk  : list()
  .. .. .. ..@ spec       :Formal class 'fPFOLIOSPEC' [package "fPortfolio"] with 5 slots
  .. .. .. .. .. ..@ model    :List of 5
  .. .. .. .. .. .. ..$ type     : chr "MV"
  .. .. .. .. .. .. ..$ optimize : chr "minRisk"
  .. .. .. .. .. .. ..$ estimator: chr "covEstimator"
  .. .. .. .. .. .. ..$ tailRisk : list()
  .. .. .. .. .. .. ..$ params   :List of 2
  .. .. .. .. .. .. .. ..$ alpha: num 0.05
  .. .. .. .. .. .. .. ..$ a    : num 1
  .. .. .. .. .. ..@ portfolio:List of 6
  .. .. .. .. .. .. ..$ weights        : atomic [1:14] 0.999 0 0 0 0 ...
  .. .. .. .. .. .. .. ..- attr(*, "invest")= num 1
  .. .. .. .. .. .. ..$ targetRisk     : num 0.000155
  .. .. .. .. .. .. ..$ riskFreeRate   : num 0
  .. .. .. .. .. .. ..$ nFrontierPoints: num 50
  .. .. .. .. .. .. ..$ status         : num 0
  .. .. .. .. .. .. ..$ targetReturn   : Named num -1
  .. .. .. .. .. .. .. ..- attr(*, "names")= chr ""
  .. .. .. .. .. ..@ optim    :List of 5
  .. .. .. .. .. .. ..$ solver   : chr "solveRquadprog"
  .. .. .. .. .. .. ..$ objective: chr [1:3] "portfolioObjective" "portfolioReturn" "portfolioRisk"
  .. .. .. .. .. .. ..$ options  :List of 1
  .. .. .. .. .. .. .. ..$ meq: num 2
  .. .. .. .. .. .. ..$ control  : list()
  .. .. .. .. .. .. ..$ trace    : logi FALSE
  .. .. .. .. .. ..@ messages :List of 2
  .. .. .. .. .. .. ..$ messages: logi FALSE
  .. .. .. .. .. .. ..$ note    : chr ""
  .. .. .. .. .. ..@ ampl     :List of 5
  .. .. .. .. .. .. ..$ ampl    : logi FALSE
  .. .. .. .. .. .. ..$ project : chr "ampl"
  .. .. .. .. .. .. ..$ solver  : chr "ipopt"
  .. .. .. .. .. .. ..$ protocol: logi FALSE
  .. .. .. .. .. .. ..$ trace   : logi FALSE
  .. .. .. ..@ constraints:Formal class 'fPFOLIOCON' [package "fPortfolio"] with 16 slots
  .. .. .. .. .. ..@ stringConstraints  : chr "LongOnly"
  .. .. .. .. .. ..@ minWConstraints    : Named num [1:14] 0 0 0 0 0 0 0 0 0 0 ...
  .. .. .. .. .. .. ..- attr(*, "names")= chr [1:14] "MNEU" "OBGVEUBR" "OBGVEUML" "OBCPEU" ...
  .. .. .. .. .. ..@ maxWConstraints    : Named num [1:14] 1 1 1 1 1 1 1 1 1 1 ...
  .. .. .. .. .. .. ..- attr(*, "names")= chr [1:14] "MNEU" "OBGVEUBR" "OBGVEUML" "OBCPEU" ...
  .. .. .. .. .. ..@ eqsumWConstraints  : num [1:2, 1:15] -1 -1 0.000277 -1 0.0011 ...
  .. .. .. .. .. .. ..- attr(*, "dimnames")=List of 2
  .. .. .. .. .. .. .. ..$ : chr [1:2] "Return" "Budget"
  .. .. .. .. .. .. .. ..$ : chr [1:15] "ceq" "MNEU" "OBGVEUBR" "OBGVEUML" ...
  .. .. .. .. .. ..@ minsumWConstraints : logi [1, 1] NA
  .. .. .. .. .. ..@ maxsumWConstraints : logi [1, 1] NA
  .. .. .. .. .. ..@ minBConstraints    : Named num [1:14] -Inf -Inf -Inf -Inf -Inf ...
  .. .. .. .. .. .. ..- attr(*, "names")= chr [1:14] "MNEU" "OBGVEUBR" "OBGVEUML" "OBCPEU" ...
  .. .. .. .. .. ..@ maxBConstraints    : Named num [1:14] 1 1 1 1 1 1 1 1 1 1 ...
  .. .. .. .. .. .. ..- attr(*, "names")= chr [1:14] "MNEU" "OBGVEUBR" "OBGVEUML" "OBCPEU" ...
  .. .. .. .. .. ..@ listFConstraints   : list()
  .. .. .. .. .. ..@ minFConstraints    : num(0) 
  .. .. .. .. .. ..@ maxFConstraints    : num(0) 
  .. .. .. .. .. ..@ minBuyinConstraints: Named num [1:14] 0 0 0 0 0 0 0 0 0 0 ...
  .. .. .. .. .. .. ..- attr(*, "names")= chr [1:14] "MNEU" "OBGVEUBR" "OBGVEUML" "OBCPEU" ...
  .. .. .. .. .. ..@ maxBuyinConstraints: Named num [1:14] 1 1 1 1 1 1 1 1 1 1 ...
  .. .. .. .. .. .. ..- attr(*, "names")= chr [1:14] "MNEU" "OBGVEUBR" "OBGVEUML" "OBCPEU" ...
  .. .. .. .. .. ..@ nCardConstraints   : int 14
  .. .. .. .. .. ..@ minCardConstraints : Named num [1:14] 0 0 0 0 0 0 0 0 0 0 ...
  .. .. .. .. .. .. ..- attr(*, "names")= chr [1:14] "MNEU" "OBGVEUBR" "OBGVEUML" "OBCPEU" ...
  .. .. .. .. .. ..@ maxCardConstraints : Named num [1:14] 1 1 1 1 1 1 1 1 1 1 ...
  .. .. .. .. .. .. ..- attr(*, "names")= chr [1:14] "MNEU" "OBGVEUBR" "OBGVEUML" "OBCPEU" ...
  .. .. .. ..@ portfolio  :Formal class 'fPFOLIOVAL' [package "fPortfolio"] with 2 slots
  .. .. .. .. .. ..@ portfolio:List of 6
  .. .. .. .. .. .. ..$ weights       : Named num [1:14] 0.999 0 0 0 0 ...
  .. .. .. .. .. .. .. ..- attr(*, "names")= chr [1:14] "MNEU" "OBGVEUBR" "OBGVEUML" "OBCPEU" ...
  .. .. .. .. .. .. ..$ covRiskBudgets: Named num [1:14] 0.999 0 0 0 0 ...
  .. .. .. .. .. .. .. ..- attr(*, "names")= chr [1:14] "MNEU" "OBGVEUBR" "OBGVEUML" "OBCPEU" ...
  .. .. .. .. .. .. ..$ targetReturn  : Named num [1:2] 0.000279 0.000279
  .. .. .. .. .. .. .. ..- attr(*, "names")= chr [1:2] "mean" "mu"
  .. .. .. .. .. .. ..$ targetRisk    : Named num [1:4] 1.55e-04 1.55e-04 -1.22e-05 -3.15e-05
  .. .. .. .. .. .. .. ..- attr(*, "names")= chr [1:4] "Cov" "Sigma" "CVaR" "VaR"
  .. .. .. .. .. .. ..$ targetAlpha   : num 0.05
  .. .. .. .. .. .. ..$ status        : num 0
  .. .. .. .. .. ..@ messages : list()
  .. .. .. ..@ title      : chr "Minimum Variance Portfolio"
  .. .. .. ..@ description: chr "Wed Mar 18 12:18:11 2015 by user: dallaliberaf"
  .. ..$ status          : num 0
  ..@ messages : list()

person Asher11    schedule 18.03.2015    source источник
comment
Можете ли вы сказать нам, какой пакет, и показать, как вы получаете доступ к слоту портфолио с фактическим кодом?   -  person Marius    schedule 18.03.2015
comment
s4obj@portfolio$weights работает?   -  person nicola    schedule 18.03.2015
comment
Вы можете показать нам результаты str(s4obj@portfolio) ?   -  person Ben Bolker    schedule 18.03.2015


Ответы (1)


Это действительно просто стандартный S4, поэтому вам нужно выбирать элемент за элементом. Вот пример, , который я на самом деле завернул в C++ как Пример RInside:

suppressMessages(library(fPortfolio))
lppData <- 100 * LPP2005.RET[, 1:6]
ewSpec <- portfolioSpec() 
nAssets <- ncol(lppData)

weightsvec <- c(0.5, rep(0.1, 5))
setWeights(ewSpec) <- weightsvec
ewPf <- feasiblePortfolio(data=lppData, spec=ewSpec, constraints="LongOnly")
print(ewPf)
vec <- getCovRiskBudgets(ewPf@portfolio)

Здесь вы просто неправильно прочитали вывод str() и пропустили слой @portfoio (подсказка: вам нужно два) при попытке получить веса:

R> ewPf@portfolio@portfolio$weights
SBI SPI SII LMI MPI ALT 
0.5 0.1 0.1 0.1 0.1 0.1 
R> 

которые, конечно же, те же самые шесть значений, которые я дал ранее в примере.

Редактировать. Ваши последующие правки доказывают это. У вас есть

> str(frontier@portfolio)
Formal class 'fPFOLIOVAL' [package "fPortfolio"] with 2 slots
  ..@ portfolio:List of 7
  .. ..$ weights         : num [1:49, 1:14] 0.0805 0.161 0.2415 0.322 0.4025 ..

это именно тот frontier@portfolio@portfolio$weights, который я показываю в своем коде (хотя и применяется к переменной, названной так, как в вашем примере).

person Dirk Eddelbuettel    schedule 18.03.2015
comment
Как прокомментировал Бен Б., str(foo@bar) это первое, что нужно сделать :-) - person Carl Witthoft; 18.03.2015