相关疑难解决方法(0)

如何制作一个很好的R可重复的例子

在与同事讨论性能,教学,发送错误报告或在邮件列表上搜索指导时,以及在Stack Overflow上,通常会询问可重复的示例并始终提供帮助.

您有什么建议创建优秀示例的提示?如何以文本格式粘贴中的数据结构?您还应该包含哪些其他信息?

在另外还有其他招数来使用dput(),dump()structure()?你什么时候应该包括library()require()声明?其中保留字应避免一个,此外c,df,data等?

怎样才能成为一位伟大的重复的例子?

r r-faq

2474
推荐指数
23
解决办法
28万
查看次数

合并大量的xts对象

我有一个xts互相排列的对象列表.我想把merge列表变成一个大xts对象.我这样做的尝试是"

merged_reg_1_min_prices <- do.call(cbind, reg_1_min_prices)
Run Code Online (Sandbox Code Playgroud)

然而,这似乎耗尽了记忆. reg_1_min_prices相互排斥的日子是6,000天1分钟的回报,所以它不是很大.有谁知道怎么解决这个问题?

需要明确的是:reg_1_min_prices包含每天1分钟价格的互斥日,列表中的每个条目都是一个xts对象.

merge r list zoo xts

11
推荐指数
2
解决办法
4690
查看次数

替代do.call用于大型数据集

我爱do.call.我喜欢能够将函数参数存储在列表中,然后将它们映射到给定的函数.

例如,我经常发现自己使用这种模式来拟合不同预测模型的列表,每个模型都有一些共享和一些独特的参数:

library(caret)
global_args <- list(
  x=iris[,1:3],
  y=iris[,4],
  trControl=trainControl(
    method='cv',
    number=2,
    returnResamp='final',
    )
  )
global_args$trControl$index <- createFolds(
  global_args$y,
  global_args$trControl$number
  )
model_specific_args <- list(
  'lm' = list(method='lm', tuneLength=1),
  'nn' = list(method='nnet', tuneLength=3, trace=FALSE),
  'gbm' = list(
    method='gbm',
    verbose=FALSE,
    tuneGrid=expand.grid(
      n.trees=1:100,
      interaction.depth=c(2, 3),
      shrinkage=c(.1, .01)
    )
  )
)
list_of_models <- lapply(model_specific_args, function(args){
  return(do.call(train, c(global_args, args), quote=TRUE))
})
resamps <- resamples(list_of_models)
dotplot(resamps, metric='RMSE')
Run Code Online (Sandbox Code Playgroud)

global_args包含对所有模型都相同的参数,并model_specific_args包含特定于模型的参数列表.我循环model_specific_args,连接每个元素global_args,然后用于do.call将最终参数列表传递给模型拟合函数.

虽然这段代码在视觉上很优雅,但它的性能非常糟糕:do.call将整个x数据集按字面序列化为文本,然后将其传递给模型拟合函数.如果x是几GB的数据,则使用疯狂的RAM并且通常会失败.

print(list_of_models[[1]]$call)
Run Code Online (Sandbox Code Playgroud)

有没有办法将参数列表传递给R中的函数,而不使用do.callcall …

r do.call

10
推荐指数
1
解决办法
698
查看次数

使用粘贴公式创建的lme拟合无法进行anova测试

我经常指定公式参数来模拟拟合函数,lm或者lme将我需要的部分粘贴在一起,就像@DWin对这个问题的回答一样:理解lm和环境.

在实践中,这看起来像这样:

library(nlme)
set.seed(5)
ns <- 5; ni <- 5; N <- ns*ni
d <- data.frame(y=rnorm(N),
                x1=rnorm(N),
                x2=factor(rep(1:ni, each=ns)),
                id=factor(rep(1:ns, ni)))

getm <- function(xs) {
  f <- paste("y ~", paste(xs, collapse="+"))
  lme(as.formula(f), random=~1|id, data=d, method="ML")
}
m1 <- getm("x1")
m2 <- getm(c("x1", "x2"))
Run Code Online (Sandbox Code Playgroud)

但是,lmenlme包中,比较使用方式构造的两个模型anova不起作用,因为anova.lme查看保存的公式参数以确保模型适合相同的响应,并且保存的公式参数很简单as.formula(f).错误是:

> anova(m1, m2)
Error in inherits(object, "formula") : object 'f' not found
Run Code Online (Sandbox Code Playgroud)

这是anova命令应该做的(重新安装模型以使其工作):

> m1 <- lme(y~x1, random=~1|id, …
Run Code Online (Sandbox Code Playgroud)

r

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

标签 统计

r ×4

do.call ×1

list ×1

merge ×1

r-faq ×1

xts ×1

zoo ×1