2017-12-15 10 views
0

私はlmの数式を含む列からなるデータフレームを持っています。特定の行[[2]]に対してこの列を実行すると、そのLMのサマリー出力が表示されます。それは完全に動作しますが、私はその列に959の行を持っているので、これらの回帰分析でanovaを実行するためにforループを記述したいと思います。 forループ内のそのリスト内のすべてのオブジェクトに対処するように指定する方法を教えてください。あなたはここで、MWEをよく理解しているようにするためにはforループのアドレス指定リストオブジェクト

DATAFRAME:

structure(list(Week = 7:17, Category = c("2", "2", "2", "2", 
"2", "2", "2", "2", "2", "2", "2"), Brand = c("3", "3", "3", 
"3", "3", "3", "3", "3", "3", "3", "3"), Display = c(0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0), Sales = c(0, 0, 0, 0, 13.440948, 40.097397, 
32.01384, 382.169189, 2830.748779, 4524.460938, 1053.590576), 
    Price = c(0, 0, 0, 0, 5.949999, 5.95, 5.950003, 4.87759, 
    3.787015, 3.205987, 4.898724), Distribution = c(0, 0, 0, 
    0, 1.394019, 1.386989, 1.621416, 8.209759, 8.552915, 9.692097, 
    9.445554), Advertising = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
    0), lnSales = c(11.4945151554497, 11.633214247508, 11.5862944141137, 
    11.5412559646132, 11.4811122484454, 11.4775106999991, 11.6333660772506, 
    11.4859819773102, 11.5232680456161, 11.5572670584292, 11.5303686934256 
    ), IntrayearCycles = c(4.15446534315765, 3.62757053512638, 
    2.92387946552647, 2.14946414386239, 1.40455011205262, 0.768856938870769, 
    0.291497141953598, -0.0131078404184544, -0.162984144025091, 
    -0.200882782749248, -0.182877633924882), `Competitor Advertising` = c(10584.87063, 
    224846.3243, 90657.72553, 0, 0, 0, 2396.54212, 0, 0, 0, 40343.49444 
    ), `Competitor Display` = c(0.385629, 2.108133, 2.515806, 
    4.918288, 3.81749, 3.035847, 2.463194, 3.242594, 1.850399, 
    1.751096, 1.337943), `Competitor Prices` = c(5.30989, 5.372752, 
    5.3717245, 5.3295525, 5.298393, 5.319466, 5.1958415, 5.2941095, 
    5.296757, 5.294059, 5.273578), ZeroSales = c(1, 1, 1, 1, 
    0, 0, 0, 0, 0, 0, 0)), .Names = c("Week", "Category", "Brand", 
"Display", "Sales", "Price", "Distribution", "Advertising", "lnSales", 
"IntrayearCycles", "Competitor Advertising", "Competitor Display", 
"Competitor Prices", "ZeroSales"), row.names = 1255:1265, class = "data.frame") 

それから私は(ECMパッケージで)エラー修正モデルを推定するためのループに適用されます - このリニアモデルouptut - を生成します。このforループは、959個の別個の回帰を推定するために適用される。

f <- function(.) { 
    xeq <- as.data.frame(select(., lnPrice, lnAdvertising, lnDisplay, IntrayearCycles, lnCompetitorPrices, lnCompADV, lnCompDISP, ADVxDISP, ADVxCYC, DISPxCYC, ADVxDISPxCYC)) 
    xtr <- as.data.frame(select(., lnPrice, lnAdvertising, lnDisplay, IntrayearCycles, lnCompetitorPrices, lnCompADV, lnCompDISP, ADVxDISP, ADVxCYC, DISPxCYC, ADVxDISPxCYC)) 
    print(xeq) 
    print(xtr) 
    summary(ecm(.$lnSales, xeq, xtr, includeIntercept = TRUE)) 
} 


Models <- DatasetThesisSynergyClean %>% 
    group_by(Category, Brand) %>% 
    do(Model = f(.)) 

特定のモデル(ここではモデル2)の概要を表示するには、対応することができます。

Models$model[[2]] 

を結果的に、私はこの要約出力から特定の値を抽出します。しかし、まず、anovaを行うために残余Sum of Squares(RSS)を抽出したいと思います。私は次のように1つのリストオブジェクトのためにこれを行う:

anova_output_Unitmodels <- anova(Models$Model[[2]]) 
RSS_Unit <- anova_output_Unitmodels$`Sum Sq`[nrow(anova_output_Unitmodels)] #saving the RSS 

今、私は[[1]]、[[959]]までのループのために、これはオブジェクトのすべてのリストオブジェクトを、accrossしたいです。最終的に私はこれらのRSS値を合計する必要があるこのRSS出力を保存する必要があります。

さらに、これがうまくいくと、すべてのモデルからすべての変数のすべての係数、t値、およびp値を抽出する必要があります。次に、リスト内の特定のオブジェクトに対処し、$係数を後ろに置く必要がありますが、これも管理できませんでした。

@Roman Lustrikの答えをここに示します。

extractRSS <- function(x) { 
    an <- anova(x) 
    RSS_Unit <- an$`Sum Sq`[nrow(an)] 
    return(RSS_Unit) 
} 

sapply(Model, FUN = extractRSS) 

私はまた、ある特定のモデルのためにそれを実行しようとしましたが、これは私にエラーを与える:

SapplyRSS <- sapply(Models$Model, FUN = extractRSS) 

私は別の考えを持っていたし、それは違った、うまくいかなかったforループに思っていますうまくそれがスタートだ:

あなたはだから私はforループでこれを複製する

RSS2<- sum(Models$Model[[2]]$residuals^2) 

考えない場合:

for(i in residuals.lm){ 
    AllRSS<- as.matrix(c(1:949)) 
    AllRSS <- as.data.frame(AllRSS) 
    SumRSS <- sum(Models$Model[[i]]$residuals^2) 
    SumRSS <- as.data.frame(SumRSS) 
    TotalRSS <- cbind(SumRSS, AllRSS)} 

TotalRSS <- SumRSS[NULL,] 

for機能でiを指定することから始まりますが、これが正しいかどうかわかりません。最終的に空のデータフレーム、または同じブランドの価値を持つデータフレームが私に残されます。

+0

これを関数に変換し、 'sapply'それ – MichaelChirico

+0

MWEを含めて私の投稿を更新しました。 @MichaelChirico、あなたはもっと具体的になりますか?私は何を機能させなければならないのですか?サプリーに何を含める必要がありますか? – PimM

+0

申し訳ありませんが、私はコンピュータにいません。しかし、あなたはすでに(基本的に)書かれた関数を持っています。それはあなたの特定の作業コードから抽象化して、モデルの要素の中で動作させることです - 比較的小さなステップ – MichaelChirico

答えて

0

これを行う別の方法は、すべてのリストオブジェクトをデータフレーム内のオブジェクトとしてエクスポートすることです。

names(Models$Model) <- paste0("C", Models$Category, "B", Models$Brand) 
list2env(Models$Model, .GlobalEnv) 

は、その後、私は、これらのオブジェクトに対処するため、およびループのために、このから値を何度も空のデータフレームを埋めるためにループのために書いた:あなたはを通じてこれを行います。これは次のようになります。

for(X in c("0","1","3")){ 
    EmptyRSS <- data.frame(RSS = 0) 
    ModelX <- get(paste0("C", X, "B2")) 
    RSS <- sum(ModelX$residuals^2) 
    RSS <- as.data.frame(RSS) 
    DF <- ModelX$df[2] 
    DF <- as.data.frame(DF) 
    RSSDF <- cbind(RSS, DF) 
    TotalRSS2 <- rbind(TotalRSS2, RSSDF) 
} 
TotalRSS2 <- RSSDF[NULL,] 

ループ外でコマンドを2回実行する必要があります。

1

@MichaelChiricoはおそらくこのようなことを念頭に置いていました。

extractRSS <- function(x) { 
    an <- anova(x) 
    RSS_Unit <- an$`Sum Sq`[nrow(an)] 
    return(RSS_Unit) 
} 

sapply(Model, FUN = extractRSS) 

sapplyすべてのModels$Model[[i]]オブジェクトを横断し、RSSを抽出します。この機能を変更して、おそらく他の情報を含めることができます。その結果はおそらくより簡単なオブジェクトに強制されます。これを防ぐにはsapply(..., simplify = FALSE)してください。

+0

私はこれを実装しましたが、どこにも出力がありません。特定の式からRSSをどのように追加するのですか?私はモデルをどこかに指定すべきですよね? – PimM

+0

@PimMあなたは 'sapply'の結果を変数に保存し、結果を検査しようとしましたか? –

+0

はい。 UseMethod( "anova")のエラー:クラス "call"のオブジェクトに適用される 'anova'の適用可能なメソッドがありません。anova(x) – PimM

関連する問題