将predict与lm()对象列表一起使用

将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,

我有我定期进行回归分析的数据。每个“数据块”都适合不同的回归。例如,每个状态可能有不同的函数来解释依赖值。这似乎是一个典型的“拆分-应用-合并”类型的问题,所以我使用的是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? 
#设置一些假数据
种子(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