2015-11-02 12 views
8

を呼び出しているlapply LMのリストに重み引数を使用します。は、(再現可能にするために架空のデータ)私の問題をここで

set.seed(42) 
df<-data.frame("x"=rnorm(1000),"y"=rnorm(1000),"z"=rnorm(1000)) 
df2<-data.frame("x"=rnorm(100),"y"=rnorm(100),"z"=rnorm(100)) 
breaks<-c(-1000,-0.68,-0.01315,0.664,1000) 
divider<-cut(df$x,breaks) 
divider2<-cut(df2$x,breaks) 
subDF<-by(df,INDICES=divider,data.frame) 
subDF2<-by(df2,INDICES=divider2,data.frame) 
reg<-lapply(subDF,lm,formula=x~.) 
pre<-lapply(1:4,function(x){predict(reg[[x]],subDF2[[x]])}) 
lapply(1:4,function(x){summary(reg[[x]])$r.squared}) 

上記のコードは正常に動作します。私がやっていることは、xの値に従って、を4つのデータフレームに分割し、それらのデータフレームごとに回帰を実行して、他のデータセットの値を予測できるようにします。データフレームの分割は、xの範囲が実際のデータに大きな影響を及ぼすため、より良い予測を可能にすることです。

私がやっているのは、最新のデータをより重視するために回帰の重み引数を追加することです。私の重みの議論は:weights<-0.999^seq(250,1,by=-1)もし250のデータがあれば。

Error in eval(expr, envir, enclos) : 
    ..2 used in an incorrect context, no ... to look in 

lapply...を持っているとして、非常に奇妙である:42のシードと前の休憩では、4次元のすべては、私がreg<-lapply(subDF,lm,formula=x~.,weights=0.999^seq(250,1,by=-1))をしようとすると、私はこのエラーを得た250

ですここではformulaに使用されていますが、weightsは受け付けていません。

だから私は本当にそれらの重量を追加するために何をすべきか分かりません。私のコードではどうすればよいですか?あるいは、私はウェイトを使用できるように(ほとんど)変更する必要がありますか?

この例では、(おそらく)簡単にするために、4つのサブセットが同じ次元を持つように分割を切りますが、4つのサブセットが同じ次元でない場合でも答えが理想的ですbreaks<-c(-1000,-0.75,0,0.75,1000)のブレークあり)

CrossValidatedの投稿は全く同じ問題を抱えていますが、私の役に立たなかったような解決策はありません。

答えて

3

なぜ私はエラーが出ているのか分かりません(私は....のコメントが考えられたと思っていましたが、ちょっとした回避策が見つかりました、これは必要な方向にありますか? (データの大きさに依存)の重みを計算し、モデルを返しlapply内部の「匿名」関数を作成している。

reg2 <- lapply(subDF, function(chunk){ 
    #calculate weights (!dependent on data ordering) 
    weights <- 0.999^seq(nrow(chunk),1,by=-1) 

    #fit model 
    fit <- lm(x~., data=chunk, weights=weights) 
    return(fit) 
}) 
+0

これは本当に素晴らしいです!誰かが問題の内容を知っているかもしれませんが、あなたの答えは私が探していたものです – etienne

+1

あなたは大歓迎です!現在の重みは、データフレームの順序に基づいていることに注意してください。それはいつも私をちょっと神経質にさせます、 'weights < - weights [order(data $ time、decline = T)]またはそれに類するものを行う方が安全かもしれません。 – Heroka

6

は残念ながら、あなたが最初に手にR.ザ・で、間違いなく、最も厄介なエラーを経験していますNSE(Non-Standard Evaluation)エラーです。

コードを掘り下げた後、私は犯人を見つけたと思いますそれ。のは、物事を一つずつ見てみましょう:すべての

まずtraceback()を見てみましょう:

weights <- 0.999^seq(250,1,by=-1) 

lapply(subDF, lm, formula=x~., weights=weights) 
Error in eval(expr, envir, enclos) : 
    ..2 used in an incorrect context, no ... to look in 
> traceback() 
8: eval(expr, envir, enclos) 
7: eval(extras, data, env) 
6: model.frame.default(formula = ..1, data = X[[1L]], weights = ..2, 
     drop.unused.levels = TRUE) 
5: stats::model.frame(formula = ..1, data = X[[1L]], weights = ..2, 
     drop.unused.levels = TRUE) 
4: eval(expr, envir, enclos) 
3: eval(mf, parent.frame()) 
2: FUN(X[[1L]], ...) 
1: lapply(subDF, lm, formula = x ~ ., weights = weights) 

問題がmodel.frame.default内部で発生したように見えます。だから、ソースコードを見てみましょう。私は、全体のソースコードを掲載しませんが、あなたはコンソールでmodel.frame.defaultを入力すると、あなたは途中でどこかに表示されます。それが失敗した場所

extras <- substitute(list(...)) 
extranames <- names(extras[-1L]) 
extras <- eval(extras, data, env) 

最後の行です。最初の行はNSEと呼ばれ、substituteによって作成されます。 substituteは、expressionと呼ばれるものを作成します。つまり、評価対象のオブジェクト(例:後でevalの内部に作成されます)。 evalに見られるように、extrasdataで評価され、次にenvで見つからない場合に評価されます。計算式では、データ内で評価されるため、x~.はのすべての列を使用するようにevalに指示します。 dataにはありません。weightsしたがって、evalenvで検索します。しかし、envとは何ですか?

どうやら、envは環境であり、ラインでmodel.frame.default内に作成されます。

env <- environment(formula$terms) 

だから、これは何を意味するのでしょうか?私はenvmodel.frame.defaultにどうなるか少ない行をで複製しようとする上記の関数で

xtest <- function(x) { 
    new_func <- function(x) { 
    env <- environment(x) 
    print(env) 
    } 
    new_func(x) 
} 

> xtest(x~z) 
<environment: R_GlobalEnv> 

:さんは別の例を見てみましょう。ご覧のとおり、environment(formula)は地球環境を指しています。

のでenvはすなわち...に渡された第二引数..2(すなわちweights)を見つけようとするところ、それはありますが、地球環境に何ら...がされていないとして、エラーが発生しました。今はっきりしていることを願っています!

ベストソリューションとそれを解決するために@Herokaの答えを使用することです(またはNSEを使用せずにmodel.frame.defaultlmを最初から書き直すことができますが、最初はより合理的です:)))。

+0

大変ありがとうございます!私はまた、データに重みを持たせるために 'w <-0.99^seq(1000,1、by = -1) df <-cbind(df、w)'を実行しようとしましたが、それでも失敗します。データに重みがあるとすれば、その理由を知ることができますか? – etienne

+0

あなたの 'lapply'コールはどうですか? – LyzandeR

+0

'lapply(subDF、lm、formula = x〜y + z、weights = w)' – etienne

関連する問題