我有定期运行回归的数据。每个“数据块”的数据都适合不同的回归。例如,每个州可能具有解释从属值的不同功能。这似乎是典型的“拆分 - 应用 - 组合”类型的问题,因此我使用的是plyr包。我可以轻松创建一个运行良好的lm()
对象列表。但是,我不能完全理解我以后如何使用这些对象来预测单独data.frame中的值。
这是一个完全做作的例子,说明我正在尝试做什么:
# setting up some fake data
set.seed(1)
funct <- function(myState, myYear){
rnorm(1, 100, 500) + myState + (100 * myYear)
}
state <- 50:60
year <- 10:40
myData <- expand.grid( year, state)
names(myData) <- c("year","state")
myData$value <- apply(myData, 1, function(x) funct(x[2], x[1]))
## ok, done with the fake data generation.
require(plyr)
modelList <- dlply(myData, "state", function(x) lm(value ~ year, data=x))
## if you want to see the summaries of the lm() do this:
# lapply(modelList, summary)
state <- 50:60
year <- 50:60
newData <- expand.grid( year, state)
names(newData) <- c("year","state")
## now how do I predict the values for newData$value
# using the regressions in modelList?
那么如何使用lm()
中包含的modelList
个对象来预测使用来自newData
的年份和州独立值的值?
答案 0 :(得分:9)
这是我的尝试:
predNaughty <- ddply(newData, "state", transform,
value=predict(modelList[[paste(piece$state[1])]], newdata=piece))
head(predNaughty)
# year state value
# 1 50 50 5176.326
# 2 51 50 5274.907
# 3 52 50 5373.487
# 4 53 50 5472.068
# 5 54 50 5570.649
# 6 55 50 5669.229
predDiggsApproved <- ddply(newData, "state", function(x)
transform(x, value=predict(modelList[[paste(x$state[1])]], newdata=x)))
head(predDiggsApproved)
# year state value
# 1 50 50 5176.326
# 2 51 50 5274.907
# 3 52 50 5373.487
# 4 53 50 5472.068
# 5 54 50 5570.649
# 6 55 50 5669.229
JD Long edit
我受到了足够的启发,可以找出adply()
选项:
pred3 <- adply(newData, 1, function(x)
predict(modelList[[paste(x$state)]], newdata=x))
head(pred3)
# year state 1
# 1 50 50 5176.326
# 2 51 50 5274.907
# 3 52 50 5373.487
# 4 53 50 5472.068
# 5 54 50 5570.649
# 6 55 50 5669.229
答案 1 :(得分:6)
只有base
R的解决方案。输出的格式不同,但所有值都在那里。
models <- lapply(split(myData, myData$state), 'lm', formula = value ~ year)
pred4 <- mapply('predict', models, split(newData, newData$state))
答案 2 :(得分:6)
您需要使用mdply
为每个函数调用提供模型和数据:
dataList <- dlply(newData, "state")
preds <- mdply(cbind(mod = modelList, df = dataList), function(mod, df) {
mutate(df, pred = predict(mod, newdata = df))
})
答案 3 :(得分:4)
有什么问题
lapply(modelList, predict, newData)
编辑:
感谢您解释这有什么问题。怎么样:
newData <- data.frame(year)
ldply(modelList, function(model) {
data.frame(newData, predict=predict(model, newData))
})
迭代模型,并应用新数据(对于每个状态都是相同的,因为你刚刚创建了expand.grid
来创建它。)
编辑2:
如果newData
对于每个year
的{{1}}没有与示例中相同的值,则可以使用更通用的方法。请注意,这使用state
的原始定义,而不是第一次编辑中的定义。
newData
此输出的前15行:
ldply(state, function(s) {
nd <- newData[newData$state==s,]
data.frame(nd, predict=predict(modelList[[as.character(s)]], nd))
})
答案 4 :(得分:2)
我认为很难将newData
中的每个州与相应的模型相匹配。
或许这样的事情?
predList <- dlply(newData, "state", function(x) {
predict(modelList[[as.character(min(x$state))]], x)
})
在这里,我使用“hacky”方式提取相应的状态模型:as.character(min(x$state))
......可能有更好的方法吗?
输出:
> predList[1:2]
$`50`
1 2 3 4 5 6 7 8 9 10 11
5176.326 5274.907 5373.487 5472.068 5570.649 5669.229 5767.810 5866.390 5964.971 6063.551 6162.132
$`51`
12 13 14 15 16 17 18 19 20 21 22
5514.825 5626.160 5737.496 5848.832 5960.167 6071.503 6182.838 6294.174 6405.510 6516.845 6628.181
或者,如果您想要data.frame
作为输出:
predData <- ddply(newData, "state", function(x) {
y <-predict(modelList[[as.character(min(x$state))]], x)
data.frame(id=names(y), value=c(y))
})
输出:
head(predData)
state id value
1 50 1 5176.326
2 50 2 5274.907
3 50 3 5373.487
4 50 4 5472.068
5 50 5 5570.649
6 50 6 5669.229
答案 5 :(得分:1)
也许我错过了一些东西,但我相信lmList
是理想的工具,
library(nlme)
ll = lmList(value ~ year | state, data=myData)
predict(ll, newData)
## Or, to show that it produces the same results as the other proposed methods...
newData[["value"]] <- predict(ll, newData)
head(newData)
# year state value
# 1 50 50 5176.326
# 2 51 50 5274.907
# 3 52 50 5373.487
# 4 53 50 5472.068
# 5 54 50 5570.649
# 6 55 50 5669.229