[R-meta] Extracting values from a list of confint() objects
Michael Dewey
||@t@ @end|ng |rom dewey@myzen@co@uk
Mon Mar 11 15:14:44 CET 2024
Dear Will
I doubt whether the standard error of tau2 is useful for much and
certainly not for establishing a confidence interval. I think Wolfgang
alluded to that in a previous e-mail.
Michael
On 11/03/2024 08:07, Will Hopkins via R-sig-meta-analysis wrote:
> After many mistakes, ChatGPT eventually provided me with a solution to the problem of extracting the tau2 and tau statistics from the list (adjusted_confint) generated by confint acting on the list selmodel produced. See below. I'm love to hear of any simpler approach.
>
> …
>
> I had to stop confint providing output for the fixed effects:
>
> # Function to eventually get Tau2 using confint on results from selmodel
>
> perform_confint <- function(xxx) {
>
> adjusted_confint <- confint(xxx, level=90, fixed=FALSE, tau2=TRUE, type="PL")
>
> return(adjusted_confint)
>
> }
>
> …
>
> # Extract a list of tau^2 and tau estimates and confidence limits
>
> adjseltau <- sapply(adjusted_confint, function(x) x[1])
>
>
>
> # Convert the list to a matrix
>
> adjseltau_matrix <- do.call(rbind, adjseltau)
>
>
>
> # Split the matrix into two parts: one for tau^2 and one for tau
>
> adjtau2matrix <- adjseltau_matrix[row.names(adjseltau_matrix) == "tau^2", , drop = FALSE]
>
> adjtaumatrix <- adjseltau_matrix[row.names(adjseltau_matrix) == "tau", , drop = FALSE]
>
>
>
> # Convert adjtau2matrix to a data frame to allow addition of a coverage variable
>
> adjtau2df <- as.data.frame(adjtau2matrix)
>
> adjtau2df$Coverage <- 0
>
> adjtau2df$Coverage[adjtau2df$ci.lb<TrueHeteroSD^2 & TrueHeteroSD^2<adjtau2df$ci.ub] <- 100
>
>
>
> # Calculate the means for estimate, ci.lb, ci.ub and coverage for tau2
>
> colMeans(adjtau2df, na.rm = TRUE, na.rm = TRUE)
>
>
>
> Here's the result (I have yet to get the decimal places right), for a true tau2 of 0.25 (TrueHeteroSD=0.5):
>
> estimate ci.lb ci.ub Coverage
>
> 0.4570235 0.1342391 1.1630262 76.8800000
>
> (The tau is much less biased, not shown here, but the coverage is of course the same and not looking good.)
>
> Interestingly, there were no missing values:
>
> #Number of simulations with non-missing values:
>
> colSums(!is.na(adjtau2df))
>
> Here's the result:
>
> estimate ci.lb ci.ub Coverage
> 2500 2500 2500 2500
>
>
>
> It's interesting, because the adjusted SE for tau2 provided by selmodel was missing in about 100 simulations, so evidently confint does not use the SE of tau2 to generate the adjusted confidence limits for tau2. I'm probably misunderstanding something here.
>
>
>
> Will
>
>
>
> From: Will Hopkins <willthekiwi using gmail.com>
> Sent: Monday, March 11, 2024 11:41 AM
> To: 'R Special Interest Group for Meta-Analysis' <r-sig-meta-analysis using r-project.org>
> Subject: RE: [R-meta] Extracting values from a list of confint() objects
>
>
>
> Tobias, that dataset appears to be for a single meta, not a set of many (simulated) metas for checking bias and coverage of the fixed effects and tau2. Nevertheless I tried the last few steps on my list of confint objects (adjusted_confint).
>
>> #get an overview of the list, so that you can see what you need to extract
>
>> str(adjusted_confint)
>
> List of 2500
>
> $ :List of 2
>
> ..$ fixed : num [1:2, 1:3] 1.5 1.74 1.05 1.1 1.95 ...
>
> .. ..- attr(*, "dimnames")=List of 2
>
> .. .. ..$ : chr [1:2] "intrcpt" "mods"
>
> .. .. ..$ : chr [1:3] "estimate" "ci.lb" "ci.ub"
>
> ..$ digits: Named num [1:9] 4 4 4 4 4 4 4 4 4
>
> .. ..- attr(*, "names")= chr [1:9] "est" "se" "test" "pval" ...
>
> ..- attr(*, "class")= chr "confint.rma"
>
> $ :List of 2
>
> ..$ fixed : num [1:2, 1:3] 1.665 1.191 1.148 0.563 2.183 ...
>
> .. ..- attr(*, "dimnames")=List of 2
>
> .. .. ..$ : chr [1:2] "intrcpt" "mods"
>
> .. .. ..$ : chr [1:3] "estimate" "ci.lb" "ci.ub"
>
> ..$ digits: Named num [1:9] 4 4 4 4 4 4 4 4 4
>
> .. ..- attr(*, "names")= chr [1:9] "est" "se" "test" "pval" ...
>
> ..- attr(*, "class")= chr "confint.rma"
>
> etc., etc.
>
> I find this hard to understand, but it looks like the stats for tau2 may not be in there.
>
> The next step didn't work:
>
>> #extract tau2 and tau from list
>
>> adjsel <- as.data.frame(adjusted_confint[["random"]])
>
>> adjsel
>
> data frame with 0 columns and 0 rows
>
>
>
> Nor did the alternative version you suggested:
>
>> adjsel <- as.data.frame(adjusted_confint$random)
>
>> adjsel
>
> data frame with 0 columns and 0 rows
>
>
>
> However, my adjust_conflim was generated with this line of code within a function:
>
> adjusted_confint <- confint(xxx, level=90, fixed=TRUE, random=TRUE, type="PL")
>
>
>
> So I made it:
>
> adjusted_confint <- confint(xxx, level=90, fixed=FALSE, tau2=TRUE, type="PL")
>
>
>
> Now str(adjusted_confint) gave this:
>
> $ :List of 5
>
> ..$ random : num [1:2, 1:3] 0.909 0.954 0.303 0.55 2.108 ...
>
> .. ..- attr(*, "dimnames")=List of 2
>
> .. .. ..$ : chr [1:2] "tau^2" "tau"
>
> .. .. ..$ : chr [1:3] "estimate" "ci.lb" "ci.ub"
>
> ..$ digits : Named num [1:9] 4 4 4 4 4 4 4 4 4
>
> .. ..- attr(*, "names")= chr [1:9] "est" "se" "test" "pval" ...
>
> ..$ ci.null: logi FALSE
>
> ..$ lb.sign: chr ""
>
> ..$ ub.sign: chr ""
>
> ..- attr(*, "class")= chr "confint.rma"
>
> $ :List of 5
>
> etc., etc.
>
>
>
> So we're nearly there. I don’t know how to translate the above information into code that will extract the values of tau^2, tau, and their confidence limits. Your previous suggestions, adjsel <- as.data.frame(adjusted_confint[["random"]]) and adjsel <- as.data.frame(adjusted_confint$random), still gave:
>
> data frame with 0 columns and 0 rows
>
> And my attempts to use sapply() still don't work. I hope you can suggest something else, or point out any silly mistake I might be making.
>
>
>
> Thanks
>
>
>
> Will
>
>
>
> From: R-sig-meta-analysis <r-sig-meta-analysis-bounces using r-project.org <mailto:r-sig-meta-analysis-bounces using r-project.org> > On Behalf Of Tobias Saueressig via R-sig-meta-analysis
> Sent: Monday, March 11, 2024 12:42 AM
> To: r-sig-meta-analysis using r-project.org <mailto:r-sig-meta-analysis using r-project.org>
> Cc: Tobias Saueressig <t.saueressig using gmx.de <mailto:t.saueressig using gmx.de> >
> Subject: Re: [R-meta] Extracting values from a list of confint() objects
>
>
>
> Dear Will,
>
>
>
> you can do the following to get the values:
>
>
>
> install.packages("metafor")
>
> library(metafor)
>
>
>
> dat <- dat.baskerville2012
> dat
>
>
>
> # fit random-effects model
> res <- rma(smd, se^2, data=dat, method="ML", digits=3)
> res
>
>
>
> sel <- selmodel(res, type="beta")
> sel
>
>
>
> #calculate confidence interval for tau2
> a <- confint(sel,tau2=TRUE)
>
>
>
> #get an overview of the list, so that you can see what you need to extract
> str(a)
>
>
>
> #extract tau2 and tau from list
> c <- as.data.frame(a[["random"]])
> c
>
>
>
> #you can also use $ to get access
> d <- as.data.frame(a$random)
> d
>
>
>
> #now you can export the data e.g. to excel
>
> install.packages("openxlsx")
>
> library(openxlsx)
>
>
>
> # Export data to an Excel file
>
> write.xlsx(d, "tau2_data.xlsx", rowNames = FALSE)
>
>
>
> Best Regards,
>
>
>
> Tobias
>
>
>
>
>
> Gesendet: Sonntag, 10. März 2024 um 05:58 Uhr
> Von: "Will Hopkins via R-sig-meta-analysis" < <mailto:r-sig-meta-analysis using r-project.org> r-sig-meta-analysis using r-project.org>
> An: "'R Special Interest Group for Meta-Analysis'" < <mailto:r-sig-meta-analysis using r-project.org> r-sig-meta-analysis using r-project.org>
> Cc: "Will Hopkins" < <mailto:willthekiwi using gmail.com> willthekiwi using gmail.com>
> Betreff: [R-meta] Extracting values from a list of confint() objects
>
> With the help of ChatGPT, I have managed to extract values from a list of
> rma() objects and values from a list of selmodel() objects derived from the
> list of rma() objects. However, I cannot extract values from a list of
> confint() objects derived from the selmodel() objects. I hope I am using the
> right jargon here. If not, please be gentle, as I am still on the steep part
> of the learning curve.
>
>
>
> For example, this code (mysteriously) extracts tau2 from meta_results, which
> is a list of rma objects:
>
> tau2 <- sapply(meta_results, function(x) x$tau2).
>
>
>
> And this code (equally mysteriously) extracts the SE of tau2 from
> adjusted_meta, which is a list of selmodel objects derived by applying
> selmodel() to meta_results:
>
> seltau2se <- sapply(adjusted_meta, function(x) x$se.tau2).
>
>
>
> But I have a list I have called adjusted_confint, which is a list of confint
> objects derived by applying confint to the list adjusted_meta. I don't know
> how to use sapply on this list to extract the confidence limits for tau2
> that are contained within this list. I have "copied blindly" the syntax of
> the other sapply statements without success. Basically I don't know what to
> put for the x$..., and everything I have tried fails. ChatGPT was not
> helpful here. I hope a real maven can help here. Thanks.
>
>
>
> Will
>
>
> [[alternative HTML version deleted]]
>
> _______________________________________________
> R-sig-meta-analysis mailing list @ <mailto:R-sig-meta-analysis using r-project.org> R-sig-meta-analysis using r-project.org
> To manage your subscription to this mailing list, go to:
> <https://stat.ethz.ch/mailman/listinfo/r-sig-meta-analysis> https://stat.ethz.ch/mailman/listinfo/r-sig-meta-analysis
>
>
> [[alternative HTML version deleted]]
>
> _______________________________________________
> R-sig-meta-analysis mailing list @ R-sig-meta-analysis using r-project.org
> To manage your subscription to this mailing list, go to:
> https://stat.ethz.ch/mailman/listinfo/r-sig-meta-analysis
>
--
Michael
More information about the R-sig-meta-analysis
mailing list