缩短 r 中的重复表达式

问题描述

我有一个方程组,它在 r 中以最大似然联合估计。系统中有三个方程,其中两个是结构方程(估计系数以 bc 开头)和一个第一阶段 (g)。在 (x1,x4,x5,x6,x8,x10,x11,x12,x13,x17,x18,19,x20,x21,x25,x27,d2,d3,d5,d6,d7,d8d,d9,d10,d11) 的表达式中添加了三个仪器 (x22,x23,x24) 的三个等式 g 中的控件是统一的。所有以 x 开头的表达式都是数据点。 由于表达式的重复性,我在手动输入时不断出错。有人可以推荐一种编写此函数的有效方法吗?

我的对数似然函数如下

ll6 <- function(param){
  
  b0  <- param[1]
  b1  <- param[2]
  b4  <- param[3]
  b5  <- param[4]
  b6  <- param[5]
  b8  <- param[6]
  b9  <- param[7]
  b10 <- param[8]
  b11 <- param[9]
  b12 <- param[10]
  b13 <- param[11]
  b15 <- param[12]
  b17 <- param[13]
  b18 <- param[14]
  b19 <- param[15]
  b20 <- param[16]
  b21 <- param[17]
  b25 <- param[18]
  b27 <- param[19]
  
  g0  <- param[20]
  g1  <- param[21]
  g4  <- param[22]
  g5  <- param[23]
  g6  <- param[24]
  g8  <- param[25]
  g9  <- param[26]
  g10 <- param[27]
  g11 <- param[28]
  g12 <- param[29]
  g13 <- param[30]
  g17 <- param[31]
  g18 <- param[32]
  g19 <- param[33]
  g20 <- param[34]
  g21 <- param[35]
  g22 <- param[36]
  g23 <- param[37]
  g24 <- param[38]
  g25 <- param[39]
  g27 <- param[40]
  
  
  c0  <- param[41]
  c1  <- param[42]
  c4  <- param[43]
  c5  <- param[44]
  c6  <- param[45]
  c8  <- param[46]
  c9  <- param[47]
  c10 <- param[48]
  c11 <- param[49]
  c12 <- param[50]
  c13 <- param[51]
  c15 <- param[52]
  c17 <- param[53]
  c18 <- param[54]
  c19 <- param[55]
  c20 <- param[56]
  c21 <- param[57]
  c25 <- param[58]
  c27 <- param[59]
  
  
  bl2 <- param[60]
  bl3 <- param[61]
  bl5 <- param[62]
  bl6 <- param[63]
  bl7 <- param[64]
  bl8 <- param[65]
  bl9 <- param[66]
  bl10<- param[67]
  bl11<- param[68]
  
  cl2 <- param[69]
  cl3 <- param[70]
  cl5 <- param[71]
  cl6 <- param[72]
  cl7 <- param[73]
  cl8 <- param[74]
  cl9 <- param[75]
  cl10<- param[76]
  cl11<- param[77]
  
  gl2 <- param[78]
  gl3 <- param[79]
  gl5 <- param[80]
  gl6 <- param[81]
  gl7 <- param[82]
  gl8 <- param[83]
  gl9 <- param[84]
  gl10<- param[85]
  gl11<- param[86]
  
  sum(log(
    ((pnorm(b0+b1*x1+ b4*x4+ b5*x5+ b6*x6+ b8*x8+
                  b9*x9+ b10*x10+b11*x11+ b12*x12+ b13*x13+b15*x15+b17*x17+b18*x18
                +b19*x19+b20*x20+b21*x21+b25*x25+b27*x27+ bl2*d2 + bl3*d3 + bl5*d5 + bl6*d6 + bl7*d7 + 
                  bl8*d8 + bl9*d9 + bl10*d10 + bl11*d11))^y)
    * ((pnorm(g0 + g1*x1 + g4*x4+ g5*x5+ g6*x6+g8*x8+g9*x9+ g10*x10
                    +g11*x11+ g12*x12+ g13*x13+g17*x17+g18*x18+g19*x19+g20*x20+g21*x21+
                      g25*x25+g27*x27+g22*z1+g23*z2+g24*z3+ gl2*d2 + gl3*d3 + gl5*d5 + gl6*d6 + gl7*d7 + 
                      gl8*d8 + gl9*d9 + gl10*d10 + gl11*d11))^x15)
    *((pnorm(c0+c1*x1+ c4*x4+ c5*x5+ c6*x6+c8*x8+
                     c9*x9+ c10*x10+c11*x11+ c12*x12+ c13*x13+c15*x15+c17*x17+c18*x18
                   +c19*x19+c20*x20+c21*x21+c25*x25+c27*x27+ cl2*d2 + cl3*d3 + cl5*d5 + cl6*d6 + cl7*d7 + 
                     cl8*d8 + cl9*d9 + cl10*d10 + cl11*d11))^x14)
    * ((1-pnorm(b0+b1*x1+ b4*x4+ b5*x5+ b6*x6+ b8*x8+
                          b9*x9+ b10*x10+b11*x11+ b12*x12+ b13*x13+b15*x15+b17*x17+b18*x18
                        +b19*x19+b20*x20+b21*x21+b25*x25+b27*x27+  bl2*d2 + bl3*d3 + bl5*d5 + bl6*d6 + bl7*d7 + 
                          bl8*d8 + bl9*d9 + bl10*d10 + bl11*d11))^(1-y))
    *((1-pnorm(g0 + g1*x1 + g4*x4+ g5*x5+ g6*x6+g8*x8+g9*x9+ g10*x10
                         +g11*x11+ g12*x12+ g13*x13+g17*x17+g18*x18+g19*x19+g20*x20+g21*x21+g25*x25+g27*x27
                         +g22*z1+g23*z2+g24*z3+ gl2*d2 + gl3*d3 + gl5*d5 + gl6*d6 + gl7*d7 + 
                           gl8*d8 + gl9*d9 + gl10*d10 + gl11*d11))^(1-x15))
    * ((1-pnorm(c0+c1*x1+ c4*x4+ c5*x5+ c6*x6+c8*x8+
                            c9*x9+ c10*x10+c11*x11+ c12*x12+ c13*x13+c15*x15+c17*x17+c18*x18
                          +c19*x19+c20*x20+c21*x21+c25*x25+c27*x27+ cl2*d2 + cl3*d3 + cl5*d5 + cl6*d6 + cl7*d7 + 
                            cl8*d8 + cl9*d9 + cl10*d10 + cl11*d11))^(1-x14)) ))
  
  
}

我尝试按如下方式分别保存表达式的各个部分,但不断收到错误,因为添加到 maxLik 命令未运行。

    da<-b0+b1*x1+ b4*x4+ b5*x5+ b6*x6+ b8*x8+
      b9*x9+ b10*x10+b11*x11+ b12*x12+ b13*x13+b15*x15+b17*x17+b18*x18
    +b19*x19+b20*x20+b21*x21+b25*x25+b27*x27+ bl2*d2 + bl3*d3 + bl5*d5 + bl6*d6 + bl7*d7 + 
      bl8*d8 + bl9*d9 + bl10*d10 + bl11*d11
Error: object 'b0' not found

解决方法

您可以创建一个命名列表并使用 list2env 将其扩展到环境中。例如,这里是如何减少 f 变量

的代码
vidx <- c(0,1,4,5,6,8,9,10,11,12,13,17,18,19,20,21,22,23,24,25,26)
vnames <- paste0("g",vidx)
pidx <- 20:(20+length(vidx)-1)

list2env(setNames(as.list(params[pidx]),vnames),envir=globalenv())

这将一次性创建所有 g* 值。对于其他变量,您也可以这样做。