相关疑难解决方法(0)

为什么外部工作不像我认为的那样(在R中)?

@ hadley 在今天的答案中引用关于功能文章提示,我决定重新审视一个关于outer函数如何工作(或不工作)的持久性谜题.为什么会失败:

outer(0:5, 0:6, sum) # while outer(0:5, 0:6, "+") succeeds
Run Code Online (Sandbox Code Playgroud)

这显示了我认为outer 应该如何处理如下函数sum:

 Outer <- function(x,y,fun) {
   mat <- matrix(NA, length(x), length(y))
   for (i in seq_along(x)) {
            for (j in seq_along(y)) {mat[i,j] <- fun(x[i],y[j])} }
   mat}

>  Outer(0:5, 0:6, `+`)
     [,1] [,2] [,3] [,4] [,5] [,6] [,7]
[1,]    0    1    2    3    4    5    6
[2,]    1    2    3    4    5    6    7
[3,]    2    3    4    5 …
Run Code Online (Sandbox Code Playgroud)

functional-programming r vectorization

23
推荐指数
1
解决办法
2592
查看次数

将命名的模型列表传递给anova.merMod

我希望能够将命名的模型列表(merMod对象)传递给anova()并在输出中保留模型名称.在使用mclapply()以更高效并行运行一批慢速模型(如glmer)的情况下,这尤其有用.我提出的最好的是在模型列表的去命名版本上使用do.call,但这并不理想,因为我可能有名为(例如)"mod12","mod17"和"mod16"的模型并且这些模型名称在输出中被转换为"MODEL1","MODEL2"和"MODEL3".(在查看单个批次时,这看起来似乎微不足道,但在长时间的建模会话中,有几十个模型,这是一个混乱的确定方法.)

请注意,这与从列表创建和调用线性模型的问题不同,因为我不是要尝试跨列表比较模型对.它比在模型列表上使用lapply更复杂,因为我以非一元的方式使用anova().

这是一个最小的代表:

library(lme4)

formList <- c(mod12 = angle ~ recipe + temp + (1|recipe:replicate),
              mod17 = angle ~ recipe + temperature + (1|recipe:replicate),
              mod16 = angle ~ recipe * temperature + (1|recipe:replicate))
modList <- lapply(formList, FUN=lmer, data=cake)

# Fails because modList is named so it's interpreted as arg-name:arg pairs
do.call(anova, modList)

# Suboptimal because model names aren't preserved
do.call(anova, unname(modList))

# Fails because object isn't merMod (or some other class covered …
Run Code Online (Sandbox Code Playgroud)

r lme4 anova do.call

8
推荐指数
1
解决办法
100
查看次数

使用R对多个依赖变量和多个独立变量进行回归

我试图用多个因变量和多个自变量做回归.基本上我House Prices在整个美国的县级,这是我的IV.然后我在县级(GDP,construction employment)有几个其他变量,这些变量构成我的因变量.我想知道是否有一种有效的方法可以同时完成所有这些回归.我想得到:

lm(IV1 ~ DV11 + DV21)
lm(IV2 ~ DV12 + DV22)
Run Code Online (Sandbox Code Playgroud)

我想为每个独立变量和每个因变量做这个.

编辑: OP添加了这些信息以回应我的回答,现在已删除,误解了这个问题.

我不认为我很好地解释了这个问题,我道歉.每个因变量都有2个与之关联的独立变量,这是唯一的.因此,如果我有500个因变量,我有500个唯一的自变量1和500个唯一的自变量2.

好的,我会再试一次,如果我再也不能解释自己,我可能会放弃(哈哈).我不知道你mtcars对R的意思是什么[这是关于Metrics的答案],所以让我这样试试吧.我将有3个数据向量,每个数据大约500行.我正在尝试从每行数据中构建回归.假设向量1是我的因变量(我试图预测的那个),向量2和3组成我的自变量.因此,第一个回归将包含每个向量的第1行值,第2个将包含每个向量的第2行值,依此类推.再次感谢大家.

r

7
推荐指数
1
解决办法
2万
查看次数

do.call() 在没有默认参数的情况下的行为

这个问题是对之前提出了一个难题的答案的跟进。

上一个答案中的可重现示例:

Models <- list( lm(runif(10)~rnorm(10)),lm(runif(10)~rnorm(10)),lm(runif(10)~rnorm(10)) )
lm1 <- lm(runif(10)~rnorm(10))
library(functional)
# This works
do.call( Curry(anova, object=lm1), Models )
# But so does this
do.call( anova, Models )
Run Code Online (Sandbox Code Playgroud)

问题是为什么do.call(anova, Models)工作正常,正如@Roland 指出的那样?

方差分析的签名是 anova(object, ...)

anova调用UseMethod, which should* call anova.lmwhich should call anova.lmlist,其第一行是objects <- list(object, ...),但object在该公式中不存在。

我唯一可以猜测的是,这do.call可能不仅填写省略号,而且填写所有没有默认值的参数,并为省略号留下任何额外的内容?如果是这样,记录在哪里,因为它对我来说绝对是新的!

* 这本身就是一个线索——如果第一个参数未指定,如何UseMethod知道调用anova.lm?没有anova.list方法anova.default或类似...

arguments r do.call

5
推荐指数
1
解决办法
943
查看次数