【问题标题】:ddply bug? (Adding lm residuals computed within groups back to the original data frame)ddply 错误? (将组内计算的 lm 残差添加回原始数据帧)
【发布时间】:2015-03-14 15:09:26
【问题描述】:

我有一个带有因子 (grpfactor) 的数据框。我的目标是在每个组中分别计算拟合 lm 模型的残差,并将它们存储在原始数据框中。

模型需要在运行时指定(即不能是固定字符串)。

我找到this answer

  ddply(d,.(g1,g2),transform,z= predict(lm(y ~ x)))

它似乎适用于静态指定的公式,但如果我将代码放在函数中并使用字符串变量而不是字符串文字(常量),它会失败 - 为什么??

d <- data.frame(x = rnorm(20), 
            y = rnorm(20), 
            g1 = c(rep('a', 10), rep('b', 10)), 
            g2 = rep(c(rep('c', 5), rep('d', 5)), 2))


myfunc = function(d) {
xx = "y ~ x"
retval = ddply(d,.(g1,g2),transform,z= predict(lm(as.formula(xx))))
return(retval)
}

# This fails:
d.new = myfunc(d)

# With the error:
#Error: error in evaluating the argument 'object' in selecting a 
#method for function 'predict': Error in as.formula(xx) : object 'xx' not 
#found 


# But this works, because it's not encased in a function:
xx = "y ~ x"
retval = ddply(d,.(g1,g2),transform,z= predict(lm(as.formula(xx))))

#Now, with the variable "xx" defined two lines above this line, 
#the following will actually work now:
d.new = myfunc(d)

#But if we do this, it will fail again:
rm(xx)
d.new = myfunc(d)

#ddply works inside a function, but only with a model specified 
#as a literal string:
myfunc2 = function(d) {
retval = ddply(d,.(g1,g2),transform,z= predict(lm(formula=as.formula("y ~ x"))))
return(retval)
}
d.new2 = myfunc2(d)

顺便说一句,如果没有 as.formula,myfunc2 会失败并出现以下错误:

#Error: error in evaluating the argument 'object' in selecting a method 
#for function 'predict': Error in eval(expr, envir, enclos) : object 'y' 
#not found

但是如果 as.formula 不在函数中,同样的代码也可以工作。

发生了什么事?

编辑:好的,这里真的很疯狂:这行得通(不同的是,我在父环境中使用

 myfunc3 = function(d) {
 xx <<- "y ~ x"
 retval = ddply(d,.(g1,g2),transform,z= predict(lm(as.formula(xx))))
 return(retval)
 }
 myfunc3(d)

【问题讨论】:

    标签: r plyr lm


    【解决方案1】:

    你得到错误:

    Error: object of type 'closure' is not subsettable
    

    因为当ddply尝试在全局环境之前解析t在本地环境中。事实上,它找到了转置函数(闭包)t,而不是你的全局变量 t。 您只需更改为其他 R 内置函数 (t,c,..)。例如,这将起作用:

    xx <- "y ~ x"
    

    一个完整的例子:

    d <- data.frame(x = rnorm(20), 
                    y = rnorm(20), 
                    g1 = c(rep('a', 10), rep('b', 10)), 
                    g2 = rep(c(rep('c', 5), rep('d', 5)), 2))
    xx <- "y ~ x"
    ddply(d,.(g1,g2),transform,z= predict(lm(as.formula(xx))))
    
    #            x           y g1 g2           z
    # 1 -0.2066509 -0.74159051  a  c -0.21886198
    # 2 -0.9801753  1.38958373  a  c  0.62214098
    # 3 -0.4626821  0.48195967  a  c  0.05950415
    # 4  1.2255134 -1.72809777  a  c -1.77596158
    # 5 -1.0922717  0.02898265  a  c  0.74401621
    # 6 -1.4379229  0.96377879  a  d  0.18312800
    

    【讨论】:

    • 看来我标记它回答得太早了!一旦我将 ddply 放入函数中,它就不再起作用。我正在用一个更好的玩具示例编辑原始问题来演示错误。
    • @Dimitri 这是ddply 中的一个错误。更多详情可以看here
    猜你喜欢
    • 1970-01-01
    • 2017-05-19
    • 2014-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多