R 分组运行回归,并将拟合值和/或残差分配回原始数据。帧?

R 分组运行回归,并将拟合值和/或残差分配回原始数据。帧?,r,R,我正试图从ols中获得分组预测,并将预测分配回原始data.frame中的一列。在sas中,这可以通过以下方式完成: proc reg data = ds; by group_var1 group_var2; model y= x; output out = ds r = resd p = pred; run; 上述代码将正确地将预测分配给pred变量,将残差分配给原始数据集中正确“块”中的resd变量。在R中,我最接近的是以下内容: d <- data.frame(x = rnorm(

我正试图从ols中获得分组预测,并将预测分配回原始data.frame中的一列。在sas中,这可以通过以下方式完成:

proc reg data = ds;
by group_var1 group_var2;
model y= x;
output out = ds r = resd p = pred;
run;
上述代码将正确地将预测分配给
pred
变量,将残差分配给原始数据集中正确“块”中的
resd
变量。在R中,我最接近的是以下内容:

d <- data.frame(x = rnorm(20), y = rnorm(20), g1 = c(rep('a', 10), rep('b', 10)), g2 = rep(c(rep('c', 5), rep('d', 5)), 2))
fun <- function(d) predict(lm(y ~ x, data = d), d)
d['predict'] <- unlist(by(d, d[, c('g1', 'g2')], fun))

             x           y g1 g2     predict
1  -0.53089730  0.26437295  a  c -0.01569909
2  -1.70298591 -0.58804638  a  c -0.01960800
3   0.31134574 -0.96575392  a  c -0.01289022
4   1.03821508  0.36409789  a  c -0.01046612
5  -1.05180195  0.84922972  a  c -0.01743631
6   0.94785058  0.16559779  a  d  0.55257659
7  -0.11779401 -2.31900972  a  d  0.65193420
8  -0.87618526 -2.29891776  a  d -0.54113668
9   0.28450262 -0.68698073  a  d -1.48699542
10  0.44388469 -1.54596297  a  d -1.22664063
11 -1.15656711  1.70991300  b  c -0.26021797
12 -1.26949128 -0.05968582  b  c -1.67447336
13  0.08648475 -1.56257791  b  c -2.68096176
14  1.16149361 -1.40203666  b  c -1.14057100
15  0.86558927 -0.73587454  b  c -0.92904930
16 -1.15168500  0.55817377  b  d  1.34287585
17  1.17898623 -0.84767449  b  d  0.12289709
18 -0.61372747  1.55786932  b  d  1.06128454
19 -0.31233192  1.15423216  b  d  0.90352047
20  0.61869842  1.42415426  b  d  0.41617707

d在R中有许多选项,例如使用
plyr

library(plyr)
ddply(d,.(g1,g2),fun)
 g1 g2          1           2          3          4          5
1  a  c  0.4218236 -0.20147871  0.4544890 -0.2330185  0.2070659
2  a  d  1.0728608  1.08735907  1.0239526  0.8740484  1.4750465
3  b  c -0.1288420  0.20727212  0.2407177  0.4017079 -0.5237893
4  b  d -0.6598871 -0.06777359 -0.2847552 -1.6400449 -0.2821023
或使用
data.table

library(data.table)
DT <- as.data.table(d)
DT[,as.list(predict(lm(y~x))),by= c('g1', 'g2')]

  g1 g2          1           2          3          4          5
1:  a  c  0.4218236 -0.20147871  0.4544890 -0.2330185  0.2070659
2:  a  d  1.0728608  1.08735907  1.0239526  0.8740484  1.4750465
3:  b  c -0.1288420  0.20727212  0.2407177  0.4017079 -0.5237893
4:  b  d -0.6598871 -0.06777359 -0.2847552 -1.6400449 -0.2821023
库(data.table)

DT我考虑过使用
plyr
。有没有办法将plyr的矩阵输出转换成与原始观测值位置匹配的列向量?@ezbentley
ddply(d,.(g1,g2),transform,z=predict(lm(y~x))
非常聪明。非常感谢。@ezbentley不客气。也许您可以对您的SAS代码稍加注释(解释pred和resd是什么样子的SAS关键字)?这个问题可以被其他想从SAS迁移到R的人使用。实际上,
R
p
是关键词。我补充了一些意见。