我想做一個等同於在mtcars數據集中擬合gpm(加侖每英里= 1/mpg)到wt的模型。這看起來很容易:如何使用掃帚和dplyr將分組數據應用於分組模型?
data(mtcars)
library(dplyr)
library(tidyr)
library(broom)
library(ggplot2)
library(scales)
mtcars2 <-
mtcars %>%
mutate(gpm = 1/mpg) %>%
group_by(cyl, am)
lm1 <-
mtcars2 %>%
do(fit = lm(gpm ~ wt, data = .))
這使我得到一個6行的行數據幀,如預期。
此圖證實了有六組:
p1 <-
qplot(wt, gpm, data = mtcars2) +
facet_grid(cyl ~ am) +
stat_smooth(method='lm',se=FALSE, fullrange = TRUE) +
scale_x_continuous(limits = c(0,NA))
我可以使用擴充()來獲得擬合輸出:
lm1 %>% augment(fit)
這給了我32行,每行一個在mtcars2,如預期。
現在的挑戰:我想用newdata,在那裏我已經被加重量得到擬合輸出缸/ 4:
newdata <-
mtcars2 %>%
mutate(
wt = wt + cyl/4)
我希望這將產生同樣大小的數據幀如lm1%>%增加(適合):newdata中的每一行都有一行,因爲掃帚會通過分組變量cyl和am匹配模型和newdata。
不幸的是,
pred1 <-
lm1 %>%
augment(
fit,
newdata = newdata)
給我與192行(= 6×32)的數據幀,顯然擬合每個模型到newdata的每一行。
從其他地方讀取,我收集到group_by和rowwise數據幀不兼容,所以lm1被取消分組,並且擴充不能關聯模型和newdata。是否有另一種設計模式可以讓我做到這一點?如果它像上述嘗試一樣簡單和透明,那將會很好,但它的工作更重要。
這裏是我的sessionInfo():
> sessionInfo()
R version 3.3.1 (2016-06-21)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 7 x64 (build 7601) Service Pack 1
locale:
[1] LC_COLLATE=English_United States.1252
[2] LC_CTYPE=English_United States.1252
[3] LC_MONETARY=English_United States.1252
[4] LC_NUMERIC=C
[5] LC_TIME=English_United States.1252
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] scales_0.4.0 ggplot2_2.1.0 broom_0.4.1 tidyr_0.6.0 dplyr_0.5.0
loaded via a namespace (and not attached):
[1] Rcpp_0.12.7 magrittr_1.5 mnormt_1.5-4 munsell_0.4.3
[5] colorspace_1.2-6 lattice_0.20-34 R6_2.1.3 stringr_1.1.0
[9] plyr_1.8.4 tools_3.3.1 parallel_3.3.1 grid_3.3.1
[13] nlme_3.1-128 gtable_0.2.0 psych_1.6.9 DBI_0.5-1
[17] lazyeval_0.2.0 assertthat_0.1 tibble_1.2 reshape2_1.4.1
[21] labeling_0.3 stringi_1.1.1 compiler_3.3.1 foreign_0.8-67
編輯:
@aosmith:我一直在探索你的第二個選擇,我喜歡它。但是,當我嘗試使用我的真實數據時,我在mutate命令中遇到問題:它返回「錯誤:擴充不知道如何處理類列表的數據」。
我真正的代碼更像是:
newdata %>%
dplyr::select(cyl, am, wt) %>% # wt holds new predictor values
group_by(cyl, am) %>%
nest() %>%
inner_join(regressions, .) %>%
## looks like yours at this point
mutate(pred = list(augment(fit, newdata = data))) %>% # Error here
unnest(pred)
當我說,它看起來像你的,我的意思是我有以下的列(這裏改名爲一致性):ID(CHR),attR1位(DBL) cyl(dbl),am(chr),fit(列表)和data(列表)。你有cyl,am(dbl),fit和data。我改變了我的dbl,但這沒有幫助。
我認爲不同之處在於,我在此樣本中有3個(ID ...類似於mtcars中的rownames)x 2(cyl)x 2(am)個單位(每個樣本有12個測量值),而mtcars示例具有3(cyl)x 2(am)單元格xa每個單元格的隨機數的汽車類型。在我的分析中,我需要看到ID值,但新數據同樣適用於所有單位。如果有幫助的話,可以把它看作是測試中每輛汽車逆風的速度。這是否意味着增加投訴的原因,它無法處理班級名單的數據?
編輯:將ID與newdata合併(使用full = TRUE)解決了最後一個問題。我目前正在使用你的第一個建議解決方案