聚合线性回归
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 <- data.frame(name=a, game=b, pts=c)
我希望它变成:
name pts slope
player1 -.4286
player2 .08242
你可以
s <- split(gamelogs, gamelogs$name)
vapply(s, function(x) lm(game ~ pts, x)[[1]][2], 1)
# player1 player2
# -0.42857143 0.08241758
或
do.call(rbind, lapply(s, function(x) coef(lm(game ~ pts, x))[2]))
# pts
# player1 -0.42857143
# player2 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
库nlme
也有这个功能,lmList
library(nlme)
coef(lmList(game ~ pts | name, gamelogs))
# (Intercept) pts
# player1 7.714286 -0.42857143
# player2 4.230769 0.08241758
你也可以用底座做一些魔术 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
:
data.frame(slope=coef(lm(game ~ pts*name - pts, data=gamelogs))[3:4])
# slope
#pts:nameplayer1 -0.42857143
#pts:nameplayer2 0.08241758
有关 lm
调用中建模的进一步说明,请参阅此处:
https://stat.ethz.ch/R-manual/R-devel/library/stats/html/formula.html
http://faculty.chicagobooth.edu/richard.hahn/teaching/FormulaNotation.pdf#2
在这种情况下 pts*name
扩展为 pts + name + pts:name
删除 - pts
意味着它等同于 pts:name + name
抱歉,我是 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)
我希望它变成:
name pts slope
player1 -.4286
player2 .08242
你可以
s <- split(gamelogs, gamelogs$name)
vapply(s, function(x) lm(game ~ pts, x)[[1]][2], 1)
# player1 player2
# -0.42857143 0.08241758
或
do.call(rbind, lapply(s, function(x) coef(lm(game ~ pts, x))[2]))
# pts
# player1 -0.42857143
# player2 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
库nlme
也有这个功能,lmList
library(nlme)
coef(lmList(game ~ pts | name, gamelogs))
# (Intercept) pts
# player1 7.714286 -0.42857143
# player2 4.230769 0.08241758
你也可以用底座做一些魔术 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
:
data.frame(slope=coef(lm(game ~ pts*name - pts, data=gamelogs))[3:4])
# slope
#pts:nameplayer1 -0.42857143
#pts:nameplayer2 0.08241758
有关 lm
调用中建模的进一步说明,请参阅此处:
https://stat.ethz.ch/R-manual/R-devel/library/stats/html/formula.html
http://faculty.chicagobooth.edu/richard.hahn/teaching/FormulaNotation.pdf#2
在这种情况下 pts*name
扩展为 pts + name + pts:name
删除 - pts
意味着它等同于 pts:name + name