Върнете каретката за предварителна обработка на трансформацията

Трансформирах данните, за да отговоря на изискванията на линеен модел (нормално разпределен):

d.reg1 = d.reg %>% preProcess("YeoJohnson") %>% predict(d.reg) 

Коригираният модел:

fit = lm(log10(Qmld)~log10(Peq750), data = d.reg1) #potential regression

Прогнозирани данни:

a=10^fit$coefficients[1]
b=fit$coefficients[2]

d.reg1$Qmld_predita=a*d.reg1$Peq750^b 

Как бих могъл да детрансформирам d.reg1$Qmld_predita, след като моделът беше монтиран към трансформирани данни и това няма физическо значение за мен?


person Arthur Calegario    schedule 07.07.2017    source източник
comment
Не разбирам какво питаш. Питате ли какво е обратното на функцията log10()? Също така не съм сигурен защо не използвате predict() и с вашия коригиран модел. Може би ще помогне, ако включите подходящ възпроизводим пример с примерни входни данни, за да можем да стартираме кода и да го тестваме.   -  person MrFlick    schedule 07.07.2017
comment
Също така имайте предвид, че предположението за нормално разпределение обикновено се основава на члена на грешката (който проверяваме с помощта на остатъците), така че наистина не трябва да го проверявате, докато не паснете на модела.   -  person Dason    schedule 07.07.2017


Отговори (2)


Ето модел за функция, която може да бъде модифицирана въз основа на избраните първоначални трансформации (напр. тук първоначалните трансформации бяха c("scale", "center").

library(tidyverse)

revPredict <- function(preproc, data, digits=0) {
  data %>%
    select(one_of(preproc$mean %>% names)) %>%
    map2_df(preproc$std, ., function(sig, dat) dat * sig) %>%
    map2_df(preproc$mean, ., function(mu, dat) dat + mu)
}

revPredict(preprocess_params, df_needing_reverse_transformation)

Тъй като изминаха повече от 6 месеца от задаването на въпроса, предполагам, че сте намерили начин да заобиколите това, но все още може да представлява интерес, като се има предвид, че подобен въпрос е тук също.


За да закръглите стойности, насочете изхода на второто map2_df към това:

    mutate_if(is.numeric,funs(round(.,digits = digits)))
person saladi    schedule 25.01.2018
comment
Така че caret не прилага предварителна обработка към всеки набор за обучение независимо? Мислех, че това е необходимо, за да се избегне изтичане на информация, но от публикацията ви изглежда, че всички данни са мащабирани и центрирани заедно. Предположих, че ще има една средна стойност и едно стандартно отклонение за всяка променлива И всеки комплект за обучение/тест. - person Giovanni Colitti; 24.07.2019
comment
Не съм сигурен как би работило, ако сте обработили предварително вашето обучение и тестване отделно, но с този пример SO, параметрите за предварителна обработка се изчисляват веднъж за d.reg и след това могат да се използват. - person saladi; 25.07.2019

Ето още едно допълнение, ако мащабирате до 0-1, можете да използвате това, за да го трансформирате обратно. Полезно за задълбочено обучение

revPredict <- function(preproc, data,digits=0,range = F) {
   if (range == T){
     data<-data %>%
       select(one_of(dimnames(preproc$ranges)[[2]])) %>%
       map2_df(preproc$ranges[2,]-preproc$ranges[1,], ., function(min_max, dat) min_max* dat)  %>%
       map2_df(preproc$ranges[1,], ., function(min, dat) min + dat) %>%
      mutate_if(is.numeric,funs(round(.,digits = digits)))
    return(data)
    }
  data<- data %>%
    select(one_of(names(preproc$mean))) %>%
    map2_df(preproc$std, ., function(sig, dat) dat * sig)  %>%
    map2_df(preproc$mean, ., function(mu, dat) dat + mu) %>%
    mutate_if(is.numeric,funs(round(.,digits = digits)))
  return(data)
}
person Andrew Troiano    schedule 05.05.2018