将predict与lm()对象列表一起使用
我有我定期进行回归分析的数据。每个“数据块”都适合不同的回归。例如,每个状态可能有不同的函数来解释依赖值。这似乎是一个典型的“拆分-应用-合并”类型的问题,所以我使用的是plyr包。我可以轻松创建一个运行良好的将predict与lm()对象列表一起使用,r,plyr,lm,predict,R,Plyr,Lm,Predict,我有我定期进行回归分析的数据。每个“数据块”都适合不同的回归。例如,每个状态可能有不同的函数来解释依赖值。这似乎是一个典型的“拆分-应用-合并”类型的问题,所以我使用的是plyr包。我可以轻松创建一个运行良好的lm()对象列表。然而,我不能完全理解我以后如何使用这些对象在单独的data.frame中预测值 下面是一个完全人为的例子,说明了我正在尝试做的事情: # setting up some fake data set.seed(1) funct <- function(myState,
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?
#设置一些假数据
种子(1)
funct这是怎么回事
lapply(modelList, predict, newData)
?
编辑:
谢谢你解释这是怎么回事。那么:
newData <- data.frame(year)
ldply(modelList, function(model) {
data.frame(newData, predict=predict(model, newData))
})
此输出的前15行:
year state predict
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
7 56 50 5767.810
8 57 50 5866.390
9 58 50 5964.971
10 59 50 6063.551
11 60 50 6162.132
12 50 51 5514.825
13 51 51 5626.160
14 52 51 5737.496
15 53 51 5848.832
我认为最难的部分是将newData
中的每个状态匹配到相应的模型
也许是这样的
predList <- dlply(newData, "state", function(x) {
predict(modelList[[as.character(min(x$state))]], x)
})
或者,如果希望将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))
})
以下是我的尝试:
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
只有base
R的解决方案。输出格式不同,但所有值都在那里
models <- lapply(split(myData, myData$state), 'lm', formula = value ~ year)
pred4 <- mapply('predict', models, split(newData, newData$state))
models您需要使用mdply
为每个函数调用提供模型和数据:
dataList <- dlply(newData, "state")
preds <- mdply(cbind(mod = modelList, df = dataList), function(mod, df) {
mutate(df, pred = predict(mod, newdata = df))
})
dataList也许我遗漏了什么,但我相信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
库(nlme)
ll=lmList(值~年份|状态,数据=myData)
预测(ll,新数据)
##或者,为了证明它产生的结果与其他提出的方法相同。。。
newData[[“value”]]这正是我一直在做的事情,但这并不是我真正想要的。这适用于每个州的每个模型。我只想将state==50的模型应用于state==50的数据,这就完全解决了问题!谢谢你,穆乔。你能解释一下data.frame片段的来源吗?它是由ddply自动生成的吗?@JDLong:。fun
最终在名为piece
的数据帧上调用。但是,正如@BrianDiggs在聊天中指出的,这不应该被依赖。最好使用匿名函数(参见我的更新)。嗨,如果你能看看我的问题,那就太好了。谢谢@JDLong我能用这种方法得到标准错误吗?@juliamm2011我想你所要做的就是根据这个问题转动se.fit=TRUE
:请注意,在这个问题得到回答后,我们现在已经8年了,我不再使用adply
,而是可能会使用broom
谢谢@ramnath。我真的很喜欢比较BaseR解决方案和那些使用包完成的解决方案。它既帮助我提高了对基本R的理解,也帮助我理解了我在使用plyr之类的抽象时所做的妥协。这就是我通常解决问题的方式——但是使用dlply
和mdply
@hadley,你能为这种情况展示一个有效的示例吗?我试着用mdply
构建一个,但不知道怎么做,因为.data
必须是矩阵或data.frame,而predict
的两个参数是lm
对象和data.frame
。我无法将lm
对象列表填充为data.frame
中的一列。我尝试的另一种方法是,将.data
制作成一个列表列表,(.data=list(object=modelsist,newData=newDataList)
其中newDataList简而言之,将两个列表一起查找嗯,是的,这似乎是最好的!非常好的是lmList
有自己的predict()
方法。
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
models <- lapply(split(myData, myData$state), 'lm', formula = value ~ year)
pred4 <- mapply('predict', models, split(newData, newData$state))
dataList <- dlply(newData, "state")
preds <- mdply(cbind(mod = modelList, df = dataList), function(mod, df) {
mutate(df, pred = predict(mod, newdata = df))
})
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