I am trying to store regression objects in a data.table df <- data.frame(x = rnorm(20)) df[, "y"] <- with(df, x + 0.1 * x^2 + 0.2 * rnorm(20)) mydt <- data.table(mypower = c(1, 2), myreg = list(lm(y ~ x, data = df), lm(y ~ x + I(x^2), data = df))) mydt #?? mypower??? myreg #???? <num>?? <list> #1:?????? 1 <lm[12]> #2:?????? 2 <lm[12]> But mydt[1, 2] has only the coeffients of the first regression. mydt[2, 2] has residuals of the first regression.? These are the first two components of "lm" object. mydt[1, myreg[[1]]] #(Intercept)?????????? x #?? 0.107245??? 1.034110 Is there a way to put full "lm" object in each row? Thanks, Naresh
?s 22:25 de 21/09/2024, Naresh Gurbuxani escreveu:> I am trying to store regression objects in a data.table > > df <- data.frame(x = rnorm(20)) > df[, "y"] <- with(df, x + 0.1 * x^2 + 0.2 * rnorm(20)) > > mydt <- data.table(mypower = c(1, 2), myreg = list(lm(y ~ x, data = df), > lm(y ~ x + I(x^2), data = df))) > > mydt > #?? mypower??? myreg > #???? <num>?? <list> > #1:?????? 1 <lm[12]> > #2:?????? 2 <lm[12]> > > But mydt[1, 2] has only the coeffients of the first regression. mydt[2, > 2] has residuals of the first regression.? These are the first two > components of "lm" object. > > mydt[1, myreg[[1]]] > #(Intercept)?????????? x > #?? 0.107245??? 1.034110 > > Is there a way to put full "lm" object in each row? > > Thanks, > Naresh > > ______________________________________________ > R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see > https://stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide > https://www.R-project.org/posting-guide.html > and provide commented, minimal, self-contained, reproducible code.Hello, Yes, there are ways of pulling the full lm objects from the list column. It's a matter of using the right indexing. mydt[[2L]][1L] extracts a list whose element is a lm object. mydt[[2L]][[1L]] extracts yhe lm object, this is the one you want. See the two examples below. library(data.table) df <- data.frame(x = rnorm(20)) df[, "y"] <- with(df, x + 0.1 * x^2 + 0.2 * rnorm(20)) mydt <- data.table( mypower = c(1, 2), myreg = list(lm(y ~ x, data = df), lm(y ~ x + I(x^2), data = df))) mydt[[2L]][1L] |> class() #> [1] "list" mydt[[2L]][[1L]] |> class() #> [1] "lm" Hope this helps, Rui Barradas -- Este e-mail foi analisado pelo software antiv?rus AVG para verificar a presen?a de v?rus. www.avg.com
I think there is a typo in your reprex l(x^2) ?? mydt[1,2] contains a list. Which when unlisted contains a load of data. I'm not sure what you are asking for? Are you trying to unlist that and have it as a row? Sort of pivot.wider if you like or unnest in tidyverse concepts? I think the data.table verbs are rbindlist But I haven't really understood what your end "product" looks like. I think it's a two row table, with 20 intercepts and 20 gradients, repeated a second time? I'd have made that a 20 row table with x, y and then 4 columns for the two versions? On Sat, 21 Sep 2024, 22:25 Naresh Gurbuxani, <naresh_gurbuxani at hotmail.com> wrote:> I am trying to store regression objects in a data.table > > df <- data.frame(x = rnorm(20)) > df[, "y"] <- with(df, x + 0.1 * x^2 + 0.2 * rnorm(20)) > > mydt <- data.table(mypower = c(1, 2), myreg = list(lm(y ~ x, data = df), > lm(y ~ x + I(x^2), data = df))) > > mydt > # mypower myreg > # <num> <list> > #1: 1 <lm[12]> > #2: 2 <lm[12]> > > But mydt[1, 2] has only the coeffients of the first regression. mydt[2, > 2] has residuals of the first regression. These are the first two > components of "lm" object. > > mydt[1, myreg[[1]]] > #(Intercept) x > # 0.107245 1.034110 > > Is there a way to put full "lm" object in each row? > > Thanks, > Naresh > > ______________________________________________ > R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see > https://stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide > https://www.R-project.org/posting-guide.html > and provide commented, minimal, self-contained, reproducible code. >[[alternative HTML version deleted]]
Well, you may have good reasons to do things this way -- and you certainly do not have to explain them here. But you might wish to consider using R's poly() function and a basic nested list structure to do something quite similar that seems much simpler to me, anyway: x <- rnorm(20) df <- data.frame(x = x, y = x + .1*x^2 + rnorm(20, sd = .2)) result <- with(df, lapply(1:2, \(i) list( degree = i, reg =lm(y ~ poly(x, i, raw = TRUE)) ) ) ) As you can see, 'result' is a list, each component of which is a list of two with names "degree" and "reg" giving the same info as each row of your 'mydt'. You can use lapply() and friends to access these results and fiddle with them as you like, such as: "extract the coefficients from the second degree fits only", and so forth. Also note that individual components of nested lists can be extracted by giving a vector to [[ instead of repeated [['s. For example: result[[2]][[2]] ## the reg component of the degree 2 polynomial ## is the same as result[[c(2,2)]] ## this is a bit easier for me to groc. Again, feel free to ignore without replying if my gratuitous remarks are unhelpful. Cheers, Bert On Sat, Sep 21, 2024 at 2:25?PM Naresh Gurbuxani <naresh_gurbuxani at hotmail.com> wrote:> > I am trying to store regression objects in a data.table > > df <- data.frame(x = rnorm(20)) > df[, "y"] <- with(df, x + 0.1 * x^2 + 0.2 * rnorm(20)) > > mydt <- data.table(mypower = c(1, 2), myreg = list(lm(y ~ x, data = df), > lm(y ~ x + I(x^2), data = df))) > > mydt > # mypower myreg > # <num> <list> > #1: 1 <lm[12]> > #2: 2 <lm[12]> > > But mydt[1, 2] has only the coeffients of the first regression. mydt[2, > 2] has residuals of the first regression. These are the first two > components of "lm" object. > > mydt[1, myreg[[1]]] > #(Intercept) x > # 0.107245 1.034110 > > Is there a way to put full "lm" object in each row? > > Thanks, > Naresh > > ______________________________________________ > R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see > https://stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide https://www.R-project.org/posting-guide.html > and provide commented, minimal, self-contained, reproducible code.