12

data.tableグループごとに回帰を実行し、結果を適切に整理する関数を記述できるようにしたいと思います。これが私がやりたいことのサンプルです:

require(data.table)
dtb = data.table(y=1:10, x=10:1, z=sample(1:10), weights=1:10, thedate=1:2)
models = c("y ~ x", "y ~ z")

res = lapply(models, function(f) {dtb[,as.list(coef(lm(f, weights=weights, data=.SD))),by=thedate]})

#do more stuff with res

#doe more stuffが長いかもしれないので、これらすべてを関数にラップしたいと思います。私が直面している問題は、さまざまな名前をどのように渡すdata.tableかです。たとえば、列名を渡すにはどうすればよいweightsですか?どうすれば合格できthedateますか?私は次のようなプロトタイプを想定しています。

myfun = function(dtb, models, weights, dates)

はっきりさせておきますが、数式を関数に渡すことは問題ではありません。使用しweightsたい日付と日付を表す列名thedateがわかっている場合、関数は次のようになります。

 myfun = function(dtb, models) {
res = lapply(models, function(f) {dtb[,as.list(coef(lm(f, weights=weights, data=.SD))),by=thedate]})

 #do more stuff with res
 }

thedateただし、に対応する列名weightsは事前に不明です。私はそれらを私の関数にそのように渡したいと思います:

#this will not work
myfun = function(dtb, models, w, d) {
res = lapply(models, function(f) {dtb[,as.list(coef(lm(f, weights=w, data=.SD))),by=d]})

 #do more stuff with res
 }

ありがとう

4

3 に答える 3

7

これは、データを長い形式にすることに依存するソリューションです(このケースでは、これは私にとってより理にかなっています

library(reshape2)
dtlong <- data.table(melt(dtb, measure.var = c('x','z')))


foo <- function(f, d, by, w ){
  # get the name of the w argument (weights)
  w.char <- deparse(substitute(w))
  # convert `list(a,b)` to `c('a','b')`
  # obviously, this would have to change depending on how `by` was defined
  by <- unlist(lapply(as.list(as.list(match.call())[['by']])[-1], as.character))
  # create the call substituting the names as required
  .c <- substitute(as.list(coef(lm(f, data = .SD, weights = w), list(w = as.name(w.char)))))
  # actually perform the calculations
  d[,eval(.c), by = by]
}

foo(f= y~value, d= dtlong, by = list(variable, thedate), w = weights)

   variable thedate (Intercept)       value
1:        x       1   11.000000 -1.00000000
2:        x       2   11.000000 -1.00000000
3:        z       1    1.009595  0.89019190
4:        z       2    7.538462 -0.03846154
于 2013-02-21T22:40:40.523 に答える
3

考えられる解決策の 1 つ:

fun = function(dtb, models, w_col_name, date_name) {
     res = lapply(models, function(f) {dtb[,as.list(coef(lm(f, weights=eval(parse(text=w_col_name)), data=.SD))),by=eval(parse(text=paste0("list(",date_name,")")))]})

}
于 2013-02-21T19:39:16.610 に答える
0

(その匿名関数呼び出し内に)追加することはできませんか:

 f <- as.formula(f) 

... dtb[,as.list(coef(lm(f, ...)?の前に別の行として これは、文字要素を式オブジェクトに変換する通常の方法です。

> res = lapply(models, function(f) {f <- as.formula(f)
                 dtb[,as.list(coef(lm(f, weights=weights, data=.SD))),by=thedate]})
> 
> str(res)
List of 2
 $ :Classes ‘data.table’ and 'data.frame':  2 obs. of  3 variables:
  ..$ thedate    : int [1:2] 1 2
  ..$ (Intercept): num [1:2] 11 11
  ..$ x          : num [1:2] -1 -1
  ..- attr(*, ".internal.selfref")=<externalptr> 
 $ :Classes ‘data.table’ and 'data.frame':  2 obs. of  3 variables:
  ..$ thedate    : int [1:2] 1 2
  ..$ (Intercept): num [1:2] 6.27 11.7
  ..$ z          : num [1:2] 0.0633 -0.7995
  ..- attr(*, ".internal.selfref")=<externalptr> 

コンポーネント名から数式の文字バージョンを作成する必要がある場合は、pasteorpaste0を使用してモデルの文字ベクトルに渡します。テスト可能な例の受領とともに提供されるテスト済みコード。

于 2013-02-21T19:01:15.500 に答える