0

Question

Hello, I would like to use the function lme() from the nlme package inside the pipe.

Data

library(tidyverse)
library(nlme)

df <- tribble( 
  ~id_pat,  ~diff,
  1,          -15, 
  2,         NA,
  3,         -25.2,
  4,          46.2,
  1,         16.4,
  2,         -12,
  3,         9, 
  4,         14
)

Code

This works:

lme(diff ~ 1, random = ~1 |
      id_pat, na.action = na.omit, data = df)

This doesn't work:

df %>%
   lme(diff ~ 1, random = ~1 |
       id_pat, na.action = na.omit)

I've tried several solutions, none of them work:

# With pull
df %>%
  lme(pull(.x["diff"]) ~1, random = ~1 |
      pull(.x["id_pat"]), na.action = na.omit))

# With eval & subtitue
b <- df["id_pat"]
df %>%
  lme(eval(substitute(j ~ 1, list(j = as.name("diff")))), random = ~1 |
      b, na.action = na.omit, data = df_time_point_as_col_pf)

# With paste0
b <- df["id_pat"]
df_time_point_as_col %>% 
  lme(paste0(diff_avt_dd_pdt_dv, "~1"), random = ~1 |
      b, na.action = na.omit
      )

# With broom
library(broom)
df %>%
  broom::tidy(lme(pull(.x["diff"]) ~1, random = ~1 |
                  pull(.x["id_pat"]), na.action = na.omit))

# With broom.mixed
library(broom.mixed)
df %>%
  broom.mixed::tidy(lme(pull(.x["diff"]) ~1, random = ~1 |
                        pull(.x["id_pat"]), na.action = na.omit))

Thank you very much in advance

T. Walter
  • 81
  • 1
  • 6
  • 2
    Try `df %>% lme(diff ~ 1, random = ~1 | id_pat, na.action = na.omit, data=.)`. You can use `.` to move the object on the left of the pipe from its default position of "first argument of the function on the right of the pipe. It's all in the online doc. – Limey Mar 02 '22 at 12:04

2 Answers2

3

Refer the data with .

library(dplyr)
library(nlme)

df %>% 
  lme(diff ~ 1, random = ~1 |
        id_pat, na.action = na.omit, data = .)

#Linear mixed-effects model fit by REML
#  Data: . 
#  Log-restricted-likelihood: -28.5764
#  Fixed: diff ~ 1 
#(Intercept) 
#   4.398488 

#Random effects:
# Formula: ~1 | id_pat
#        (Intercept) Residual
#StdDev:    9.773561 22.46122

#Number of Observations: 7
#Number of Groups: 4 
Ronak Shah
  • 377,200
  • 20
  • 156
  • 213
0

Using . for the data as @RonakShah suggests is fine. You can also name the arguments provided to make sure that data is the first unspecified argument in the argument list

df %>% lme(fixed = diff ~ 1, random = ~1|id_pat, na.action = na.omit)

i.e. since args(lme) is

function (fixed, data = sys.frame(sys.parent()), random, correlation = NULL, 
    weights = NULL, subset, method = c("REML", "ML"), na.action = na.fail, 
    control = list(), contrasts = NULL, keep.data = TRUE) 

and we have explicitly specified fixed, the piped argument will be identified as data.

Ben Bolker
  • 211,554
  • 25
  • 370
  • 453