R: Почему model.frame не читает уравнения в цикле функций? - PullRequest
0 голосов
/ 19 ноября 2018

Я создал функцию fm_ebp, которая создает уравнение с определенными аргументами.Я проверил функцию, и она работает, но когда я использую ее в цикле for, кажется, что model.frame не работает, как мне показывают, и ошибка, связанная с несуществующими объектами, когда они существуют.Я только учусь программировать на R, поэтому моя ошибка может быть очень простой.В следующих строках я воспроизведу простой пример моих вопросов, чтобы прояснить:

`sessionInfo()`

R версия 3.5.1 (2018-07-02);Платформа: x86_64-w64-mingw32 / x64 (64-разрядная версия);Работает в: Windows> = 8 x64 (сборка 9200)

library(data.table) set.seed(123)

Используемые функции:

Функция 1: эта функция просто масштабирует данные, когда данные имеют менее 2Точки данных.Это полезно для моей проблемы.

scale_con<-function(x){
if(length(x)>1){scale(x)}
else x
}

Функция 2: эта функция генерирует формулу, необходимую для моих расчетов.Выходные данные функции - это объект формулы.

fm_ebp<-function(X,dt,bt){    
  n=length(X)
  f=numeric(length = 0)
  for(i in 1:n){
    if(length(grep("\\(",X[i]))>0){
      y=gsub("\\(|\\)|scale","",X[i]) 
      y1=paste0("scale_con(",dt,"$",y,")","+")  
    }else { 
      y=X[i]
      y1=paste0(dt,"$",X[i],"+")
    }
    postt=grep(y,names(eval(parse(text=bt))))
    f=paste0(f,bt,"[", postt,"]","*",y1)
  }
  f=paste0("~I(",bt,"[1]","+",f,"phi*vv[s]",")")
  return(as.formula(f))
}

Функция работает:

Некоторые аргументы

X=c("d1","scale(x)")
dt="datd"
beta=c("(intercept)"=-.8,"scale(x)"=0.5,"d1"=.2)
bt="beta"

Итак fm_ebp(X=X,dt=dt,bt=bt) дает:

~I(beta[1] + beta[3] * datd$d1 + beta[2] * scale_con(datd$x) + 
    phi * vv[s])
<environment: 0x000000000524a2c0>

Теперь давайте попробуем с некоторымиданные (я работаю с data.table в моем проекте):

dat=data.frame(y=rbinom(200,1,.2),x1=rnorm(200),d1=rbinom(200,1,.5),
               sample1=rbinom(200,1,.2),dom=c(rep("g1",round(200/3)),rep("g2",round(200/3)),
                                                                        rep("g3",round(200/3)-1)))

dat=data.table(dat)
phi=.5

Аргументы функции

X=c("d1","scale(x)")
S=2
SS<-2*S # Monte-Carlo
a2<-rep(0,SS)
v<-rnorm(n=S,mean=0,sd=1)
vv<-c(v,-v)
s=1

Тогда, если я использую as.double(model.frame(fm_ebp(X=X,dt="dat",bt="beta"))[,1])[1:3], я получаю -1.4732023 -0.7709053 -1.2324033

Однако, когда я применяю fm_ebp в контексте следующей функции, я получаю сообщение об ошибке:

fnc_ebp1<-function(datname,S=2,mtname,domname){    
  dominios=sort(unique(get(datname)[get(mtname)==1,get(domname)]))     
  ndom<-length(dominios)   
  SS<-2*S # Monte-Carlo
  a2<-rep(0,SS)
  v<-rnorm(n=S,mean=0,sd=1)
  vv<-c(v,-v)
  den<-dominios

  ebpmudesn<-dominios; ebpmubardesn<-dominios 

  for (d in 1:ndom) {
    datd<-get(datname)[get(domname)==dominios[d]]
    ndatd<-nrow(datd)
    datd<-datd[get(mtname) == "0"]
    ndatd1<-nrow(datd)
    datdm<-get(datname)[get(domname)== dominios[d] & get(mtname) == 1]


    for (s in 1:SS) {
      return(as.double(model.frame(fm_ebp(X=X,dt="datd",bt="beta"))[,1])[1:3])
    }

  }

}

Некоторые аргументы:

datname="dat"
mtname="sample1"
domname="dom"

Затем я использую fnc_ebp1,и получить:

fnc_ebp1(datname=datname,mtname=mtname,domname=domname)
Error in structure(x, class = unique(c("AsIs", oldClass(x)))) : 
  object 'datd' not found

Я использовал команду debug и traceback, и я выполнил другие элементы управления, и проблема заключается в функции fm_ebp.Кажется, что model.frame не работает, так как я обнаружил похожие ошибки при включении объекта в виде строки.Я пытался решить эту проблему в течение нескольких дней, и я не добился успеха.Любые идеи по этому вопросу будут очень полезны.Заранее спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...