#' Try to standardise continuous traits to be in standard deviation units
#'
#' Uses [estimate_trait_sd()].
#'
#' @param dat Output from [harmonise_data()].
#'
#' @export
#' @return Data frame
standardise_units <- function(dat)
{
out <- plyr::ddply(dat, c("id.exposure", "id.outcome"), function(d)
{
if(d$units.exposure[1] != "log odds")
{
estsd <- mean(estimate_trait_sd(d$beta.exposure, d$se.exposure, d$samplesize.exposure, d$eaf.exposure), na.rm=TRUE)
if(!is.na(estsd))
{
d$beta.exposure <- d$beta.exposure / estsd
d$se.exposure <- d$se.exposure / estsd
d$units.exposure <- "SD"
d$estimated_sd.exposure <- estsd
}
}
if(d$units.outcome[1] != "log odds")
{
estsd <- mean(estimate_trait_sd(d$beta.outcome, d$se.outcome, d$samplesize.outcome, d$eaf.outcome), na.rm=TRUE)
if(!is.na(estsd))
{
d$beta.outcome <- d$beta.outcome / estsd
d$se.outcome <- d$se.outcome / estsd
d$units.outcome <- "SD"
d$estimated_sd.outcome <- estsd
}
}
return(d)
})
return(out)
}
#' Estimate trait SD by obtaining beta estimates from z-scores and finding the ratio with original beta values
#'
#' Assumes that sample size and allele frequency is correct for each SNP, and that allele frequency gives a reasonable estimate of the variance of the SNP.
#'
#' @param b vector of effect sizes.
#' @param se vector of standard errors.
#' @param n vector of sample sizes.
#' @param p vector of allele frequencies.
#'
#' @export
#' @return Vector of sd estimates for each association.
estimate_trait_sd <- function(b, se, n, p)
{
z <- b / se
standardised_bhat <- sqrt((z^2/(z^2+n-2)) / (2 * p * (1-p))) * sign(z)
estimated_sd <- b / standardised_bhat
return(estimated_sd)
}
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.