【问题标题】:read file from memory for regression (R)从内存中读取文件以进行回归(R)
【发布时间】:2014-12-23 18:41:48
【问题描述】:

在尝试使用 speedglm 包的 shglm 功能时,我遇到了问题。由于文件太大而无法读入内存,我想使用包帮助页面中概述的链接功能。链接功能是

make.data<-function(filename, chunksize,...){       
 conn<-NULL
 function(reset=FALSE){
 if(reset){
   if(!is.null(conn)) close(conn)
   conn<<-file(filename,open="r")
 } else{
   rval<-read.table(conn, nrows=chunksize,...)
   if ((nrow(rval)==0)) {
        close(conn)
        conn<<-NULL
        rval<-NULL
   }
   return(rval)
 }

} }

load(ti.RData)

然后我将我的数据帧(称为 ti)写入表格

write.table(ti,"data1.txt",row.names=FALSE,col.names=FALSE)

就像这里的例子http://www.inside-r.org/packages/cran/speedglm/docs/shglm。之后

da<-make.data("data1.txt",chunksize=10000,col.names=colnames(ti))
rm(ti)
b1<-shglm(T2D~factor(SIBCO)+factor(POCOD),datafun=da,family=binomial())

但我得到一个错误

Error in dev.resids(y, mu, weights) : 
  argument mu must be a numeric vector of length 1 or length 802

我很高兴上传我的数据集,但有人可以大致告诉我从哪里开始调试吗?我认为当通过链接函数(使用 read.table)读取 data1.txt 时,原始数据框中的某些因素是通过此操作转换为整数的。这就是我将因素放在变量周围的原因。任何建议都会很有帮助

【问题讨论】:

    标签: r ram glm


    【解决方案1】:

    简短的回答是您的输入数据可能有问题。如果没有输入数据,很难说,但根据我的经验,使用带有因子的二项式 glm 运行 shglm,这就是我要开始的地方。

    作为一般调试策略,您可以尝试以下方法:

    • debug(shglm)options(error=recover) 行添加到您的脚本中
    • 打开 shglm 的 trace=T 选项
    • 启动 R 并将脚本加载为 source("myscript.R")
    • 单步调试器并使用ls() 查看当前存在的变量并使用dim() colnames() 等检查它们。

    根据我的经验,现在 shglm 返回相当神秘的错误消息,这些错误消息可能会根据输入块的大小而改变(因为这会改变数据和模型所知道的因素)。下面我列出了一些要检查您的数据的事情以及我在使其工作时遇到的一些常见错误,这可能会帮助您运行自己的模型。

    关于数据,请确保:

    • 因变量是 0/1 或者它是一个比例 0

    Error in if (any(y < 0 | y > 1)) stop("y values must be 0 <= y <= 1") : missing value where TRUE/FALSE needed Calls: shglm -> eval -> eval

    • 指定因子的所有级别(不要忘记默认值)并确保它们已排序,即factor(age, levels("24andbelow, 25to49, "50to74", "75andover")),否则会出现如下错误:

    Error in crossprod(weights, y) : non-conformable arguments Calls: shglm -&gt; crossprod -&gt; crossprod

    Error in XTX[rownames(Ax), colnames(Ax)] : subscript out of bounds Calls: shglm

    现在我没有得到你的具体错误,但我认为我应该提到的足够接近。在这里,我尝试提供一个包含两列的公式(在常规 glm 中用于成功和失败),即 cbind(success, failures)~factor(var1) + factor(var2)

    Error in dev.resids(y, mu, weights) : argument wt must be a numeric vector of length 1 or length 10 Calls: shglm -> dev.resids

    我想主要的收获是检查您的输入数据。

    【讨论】:

    • 您似乎在试图回答,但这太漫无边际了,您实际上并没有得到答案......它读起来像一个问题。
    猜你喜欢
    • 2017-10-18
    • 1970-01-01
    • 2020-07-16
    • 1970-01-01
    • 1970-01-01
    • 2011-01-10
    • 2021-07-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多