R 聚合线性回归

R 聚合线性回归,r,aggregate,linear-regression,R,Aggregate,Linear Regression,对不起,我对R很陌生,但我有一个多玩家游戏日志的数据框。我试图得到每个球员在所有比赛中得分的斜率系数。我已经看到,aggregate可以使用像sum和average这样的运算符,从线性回归中获取系数也非常简单。我如何组合这些 a <- c("player1","player1","player1","player2","player2","player2") b <- c(1,2,3,4,5,6) c <- c(15,12,13,4,15,9) gamelogs <- d

对不起,我对R很陌生,但我有一个多玩家游戏日志的数据框。我试图得到每个球员在所有比赛中得分的斜率系数。我已经看到,
aggregate
可以使用像
sum
average
这样的运算符,从线性回归中获取系数也非常简单。我如何组合这些

a <- c("player1","player1","player1","player2","player2","player2")
b <- c(1,2,3,4,5,6)
c <- c(15,12,13,4,15,9)
gamelogs <- data.frame(name=a, game=b, pts=c)
你可以

s <- split(gamelogs, gamelogs$name)

vapply(s, function(x) lm(game ~ pts, x)[[1]][2], 1)
#     player1     player2 
# -0.42857143  0.08241758 
或者,如果您想使用dplyr,您可以这样做

library(dplyr)

models <- group_by(gamelogs, name) %>% 
    do(mod = lm(game ~ pts, data = .))

cbind(
    name = models$name, 
    do(models, data.frame(slope = coef(.$mod)[2]))
)
#      name       slope
# 1 player1 -0.42857143
# 2 player2  0.08241758
库(dplyr)
型号%
do(mod=lm(游戏~pts,数据=))
cbind(
name=型号$name,
do(models,data.frame(slope=coef(.$mod)[2]))
)
#名称坡度
#1播放器1-0.42857143
#2播放器2 0.08241758

nlme
也有此功能,
lmList

library(nlme)
coef(lmList(game ~ pts | name, gamelogs))
#        (Intercept)         pts
# player1    7.714286 -0.42857143
# player2    4.230769  0.08241758

您还可以使用base
lm
执行一些魔术,一次完成所有操作:

coef(lm(game ~ pts*name - pts, data=gamelogs))[3:4]
coef(lm(game ~ pts:name + name, data=gamelogs))[3:4]
#pts:nameplayer1 pts:nameplayer2 
#    -0.42857143      0.08241758 
作为
数据帧

data.frame(slope=coef(lm(game ~ pts*name - pts, data=gamelogs))[3:4])
#                      slope
#pts:nameplayer1 -0.42857143
#pts:nameplayer2  0.08241758
有关
lm
调用中建模的进一步说明,请参见此处:



在这种情况下,
pts*name
扩展为
pts+name+pts:name
,当删除
-pts
时,这意味着它相当于
pts:name+name

by
by(gamelogs,gamelogs$name,function(x)lm(game~pts,x)[[1]][2]类似
@nongkrong-有两种方法-我总是忘记如何表达互动效果等以获得正确的结果。你是说除了你展示的那些之外?就像在没有-/+?@nongkrong-no的情况下说“只保留交互术语”一样,我的意思是我总是忘记这些方法,然后不得不再次查找它们。请看最近的邮件的答案。这是最好的。
coef(lm(game ~ pts*name - pts, data=gamelogs))[3:4]
coef(lm(game ~ pts:name + name, data=gamelogs))[3:4]
#pts:nameplayer1 pts:nameplayer2 
#    -0.42857143      0.08241758 
data.frame(slope=coef(lm(game ~ pts*name - pts, data=gamelogs))[3:4])
#                      slope
#pts:nameplayer1 -0.42857143
#pts:nameplayer2  0.08241758