私は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を指定することから始まりますが、これが正しいかどうかわかりません。最終的に空のデータフレーム、または同じブランドの価値を持つデータフレームが私に残されます。
これを関数に変換し、 'sapply'それ – MichaelChirico
MWEを含めて私の投稿を更新しました。 @MichaelChirico、あなたはもっと具体的になりますか?私は何を機能させなければならないのですか?サプリーに何を含める必要がありますか? – PimM
申し訳ありませんが、私はコンピュータにいません。しかし、あなたはすでに(基本的に)書かれた関数を持っています。それはあなたの特定の作業コードから抽象化して、モデルの要素の中で動作させることです - 比較的小さなステップ – MichaelChirico