Che tipo di curva (o modello) dovrei adattare ai miei dati percentuali?


15

Sto cercando di creare una figura che mostri la relazione tra copie virali e copertura genomica (GCC). Ecco come sono i miei dati:

Carico virale vs GCC

All'inizio, ho appena tracciato una regressione lineare, ma i miei supervisori mi hanno detto che non era corretto e di provare una curva sigmoidale. Quindi l'ho fatto usando geom_smooth:

library(scales)
ggplot(scatter_plot_new, aes(x = Copies_per_uL, y = Genome_cov, colour = Virus)) +
    geom_point() +
    scale_x_continuous(trans = log10_trans(), breaks = trans_breaks("log10", function(x) 10^x), labels = trans_format("log10", math_format(10^.x))) +
        geom_smooth(method = "gam", formula = y ~ s(x), se = FALSE, size = 1) +
    theme_bw() +
    theme(legend.position = 'top', legend.text = element_text(size = 10), legend.title = element_text(size = 12), axis.text = element_text(size = 10), axis.title = element_text(size=12), axis.title.y = element_text(margin = margin (r = 10)), axis.title.x = element_text(margin = margin(t = 10))) +
    labs(x = "Virus copies/µL", y = "GCC (%)") +
    scale_y_continuous(breaks=c(25,50,75,100))

Carico virale vs GCC - geom_smooth

Tuttavia, i miei supervisori affermano che anche questo è errato perché le curve fanno sembrare che GCC possa superare il 100%, il che non può.

La mia domanda è: qual è il modo migliore per mostrare la relazione tra copie di virus e GCC? Voglio chiarire che A) copie antivirus ridotte = basso GCC e che B) dopo una certa quantità di virus copia gli altopiani GCC.

Ho studiato molti metodi diversi - GAM, LOESS, logistica, a tratti - ma non so come dire quale sia il metodo migliore per i miei dati.

EDIT: questi sono i dati:

>print(scatter_plot_new)  
Subsample   Virus   Genome_cov  Copies_per_uL
1   S1.1_RRAV   RRAV    100 92500
2   S1.2_RRAV   RRAV    100 95900
3   S1.3_RRAV   RRAV    100 92900
4   S2.1_RRAV   RRAV    100 4049.54
5   S2.2_RRAV   RRAV    96.9935 3809
6   S2.3_RRAV   RRAV    94.5054 3695.06
7   S3.1_RRAV   RRAV    3.7235  86.37
8   S3.2_RRAV   RRAV    11.8186 84.2
9   S3.3_RRAV   RRAV    11.0929 95.2
10  S4.1_RRAV   RRAV    0   2.12
11  S4.2_RRAV   RRAV    5.0799  2.71
12  S4.3_RRAV   RRAV    0   2.39
13  S5.1_RRAV   RRAV    4.9503  0.16
14  S5.2_RRAV   RRAV    0   0.08
15  S5.3_RRAV   RRAV    4.4147  0.08
16  S1.1_UMAV   UMAV    5.7666  1.38
17  S1.2_UMAV   UMAV    26.0379 1.72
18  S1.3_UMAV   UMAV    7.4128  2.52
19  S2.1_UMAV   UMAV    21.172  31.06
20  S2.2_UMAV   UMAV    16.1663 29.87
21  S2.3_UMAV   UMAV    9.121   32.82
22  S3.1_UMAV   UMAV    92.903  627.24
23  S3.2_UMAV   UMAV    83.0314 615.36
24  S3.3_UMAV   UMAV    90.3458 632.67
25  S4.1_UMAV   UMAV    98.6696 11180
26  S4.2_UMAV   UMAV    98.8405 12720
27  S4.3_UMAV   UMAV    98.7939 8680
28  S5.1_UMAV   UMAV    98.6489 318200
29  S5.2_UMAV   UMAV    99.1303 346100
30  S5.3_UMAV   UMAV    98.8767 345100

6
Sembra una regressione logistica sarebbe la cosa migliore, dal momento che questo è limitato tra 0 e 100%.
mkt - Ripristina Monica il

1
Prova (2) modello (lineare) per pezzo.
user158565

3
prova ad aggiungere method.args=list(family=quasibinomial))gli argomenti geom_smooth()nel tuo codice ggplot originale.
Ben Bolker,

4
PS Ti incoraggio a non eliminare gli errori standard con se=FALSE. Sempre bello mostrare alla gente quanto è grande l'incertezza in realtà ...
Ben Bolker,

2
Non hai abbastanza punti dati nella regione di transizione per affermare con alcuna autorità che esiste una curva regolare. Potrei facilmente adattare una funzione di Heaviside ai punti che ci stai mostrando.
Carl Witthoft,

Risposte:


6

un altro modo di procedere sarebbe usare una formulazione bayesiana, può essere un po 'pesante per iniziare, ma tende a rendere molto più semplice esprimere i dettagli del tuo problema e ottenere idee migliori su dove "l'incertezza" è

Stan è un campionatore Monte Carlo con un'interfaccia programmatica relativamente facile da usare, le librerie sono disponibili per R e altri, ma sto usando Python qui

usiamo un sigmoide come tutti gli altri: ha motivazioni biochimiche oltre ad essere matematicamente molto conveniente con cui lavorare. una buona parametrizzazione per questa attività è:

import numpy as np

def sigfn(x, alpha, beta):
    return 1 / (1 + np.exp(-(x - alpha) * beta))

dove alphadefinisce il punto medio della curva sigmoidea (cioè dove attraversa il 50%) e betadefinisce la pendenza, i valori più vicini allo zero sono più piatti

per mostrare come appare, possiamo inserire i tuoi dati e tracciarli con:

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

df = pd.read_table('raw_data.txt', delim_whitespace=True)
df.columns = ['subsample', 'virus', 'coverage', 'copies']
df.coverage /= 100

x = np.logspace(-1, 6, 201)
plt.semilogx(x, sigfn(np.log(x), 5.5, 3), label='sigfn', color='C2')

sns.scatterplot(df.copies, df.coverage, hue=df.virus, edgecolor='none')

dove raw_data.txtcontiene i dati che hai fornito e ho trasformato la copertura in qualcosa di più utile. i coefficienti 5.5 e 3 sembrano belli e danno una trama molto simile alle altre risposte:

dati della trama e adattamento manuale

per "adattare" questa funzione usando Stan dobbiamo definire il nostro modello usando il suo linguaggio che è un mix tra R e C ++. un modello semplice sarebbe qualcosa del tipo:

data {
    int<lower=1> N;  // number of rows
    vector[N] log_copies;
    vector<lower=0,upper=1>[N] coverage;
}
parameters {
    real alpha;
    real beta;
    real<lower=0> sigma;
}
model {
    vector[N] mu;
    mu = 1 ./ (1 + exp(-(log_copies - alpha) * beta));

    sigma ~ cauchy(0, 0.1);
    alpha ~ normal(0, 5);
    beta ~ normal(0, 5);

    coverage ~ normal(mu, sigma);
}

che si spera sia OK. abbiamo un datablocco che definisce i dati che ci aspettiamo quando campioniamo il modello, parametersdefiniamo le cose che vengono campionate e modeldefiniscono la funzione di verosimiglianza. Dici a Stan di "compilare" il modello, il che richiede un po 'di tempo, e quindi puoi campionarlo da esso con alcuni dati. per esempio:

import pystan

model = pystan.StanModel(model_code=code)
model.sampling(data=dict(
    N=len(df),
    log_copies=np.log(df.copies),
    coverage=df.coverage,
), iter=10000, chains=4, thin=10)

import arviz
arviz.plot_trace(fit)

arviz semplifica i grafici diagnostici, mentre la stampa dell'adattamento offre un piacevole riepilogo dei parametri in stile R:

4 chains, each with iter=10000; warmup=5000; thin=10; 
post-warmup draws per chain=500, total post-warmup draws=2000.

        mean se_mean     sd   2.5%    25%    50%    75%  97.5%  n_eff   Rhat
alpha   5.51  6.0e-3   0.26   4.96   5.36   5.49   5.64   6.12   1849    1.0
beta    2.89    0.04   1.71   1.55   1.98   2.32   2.95   8.08   1698    1.0
sigma   0.08  2.7e-4   0.01   0.06   0.07   0.08   0.09    0.1   1790    1.0
lp__   57.12    0.04   1.76   52.9   56.1  57.58  58.51  59.19   1647    1.0

la grande deviazione standard su betadice che i dati in realtà non forniscono molte informazioni su questo parametro. anche alcune delle risposte che danno più di 10 cifre significative nei loro adattamenti del modello stanno sopravvalutando un po 'le cose

poiché alcune risposte hanno notato che ogni virus potrebbe aver bisogno dei propri parametri, ho esteso il modello per consentire alphae betavariare in base a "Virus". tutto diventa un po 'complicato, ma i due virus hanno quasi certamente alphavalori diversi (cioè hai bisogno di più copie / μL di RRAV per la stessa copertura) e un diagramma che mostra questo è:

trama di dati e campioni MC

i dati sono gli stessi di prima, ma ho disegnato una curva per 40 campioni del posteriore. UMAVsembra relativamente ben determinato, mentre RRAVpotrebbe seguire la stessa pendenza e richiedere un conteggio delle copie più elevato o avere una pendenza più ripida e un conteggio delle copie simile. la maggior parte della massa posteriore necessita di un conteggio delle copie più elevato, ma questa incertezza potrebbe spiegare alcune delle differenze in altre risposte che trovano cose diverse

Io per lo più usato rispondere a questa come un esercizio per migliorare la mia conoscenza della Stan, e ho messo un notebook Jupyter di questo qui nel caso in cui qualcuno è interessato / vuole replicare questo.


14

(Modificato tenendo conto dei commenti di seguito. Grazie a @BenBolker e @WeiwenNg per l'input utile.)

Adatta una regressione logistica frazionata ai dati. È adatto a dati percentuali limitati tra lo 0 e il 100% ed è giustificato teoricamente in molte aree della biologia.

Si noti che potrebbe essere necessario dividere tutti i valori per 100 per adattarli, poiché i programmi prevedono frequentemente che i dati siano compresi tra 0 e 1. E, come raccomanda Ben Bolker, per affrontare i possibili problemi causati dalle assunzioni rigide della distribuzione binomiale relative alla varianza, utilizzare un invece distribuzione quasibinomiale.

Ho fatto alcune ipotesi basate sul tuo codice, come ad esempio che ci sono 2 virus a cui sei interessato e che potrebbero mostrare schemi diversi (cioè potrebbe esserci un'interazione tra il tipo di virus e il numero di copie).

Innanzitutto, il modello si adatta:

dat <- read.csv('Book1.csv')
dat$logcopies <- log10(dat$Copies_per_uL)
dat$Genome_cov_norm <- dat$Genome_cov/100

fit <- glm(Genome_cov_norm ~ logcopies * Virus, data = dat, family = quasibinomial())
summary(fit)


Call:
glm(formula = Genome_cov_norm ~ logcopies * Virus, family = quasibinomial(), 
    data = dat)

Deviance Residuals: 
     Min        1Q    Median        3Q       Max  
-0.55073  -0.13362   0.07825   0.20362   0.70086  

Coefficients:
                    Estimate Std. Error t value Pr(>|t|)  
(Intercept)          -5.9702     2.8857  -2.069   0.0486 *
logcopies             2.3262     1.0961   2.122   0.0435 *
VirusUMAV             2.6147     3.3049   0.791   0.4360  
logcopies:VirusUMAV  -0.6028     1.3173  -0.458   0.6510  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for quasibinomial family taken to be 0.6934319)

    Null deviance: 30.4473  on 29  degrees of freedom
Residual deviance:  2.7033  on 26  degrees of freedom

Se ti fidi dei valori p, l'output non suggerisce che i due virus differiscano significativamente. Questo è in contrasto con i risultati di @ NickCox di seguito, anche se abbiamo usato metodi diversi. Non sarei molto fiducioso in entrambi i casi con 30 punti dati.

In secondo luogo, la trama:

Non è difficile codificare un modo per visualizzare l'output da soli, ma sembra che ci sia un pacchetto ggPredict che farà la maggior parte del lavoro per te (non posso garantirlo, non l'ho provato da solo). Il codice sarà simile a:

library(ggiraphExtra)
ggPredict(fit) + theme_bw(base_size = 20) + geom_line(size = 2) 

Aggiornamento: non consiglio più il codice o la funzione ggPredict più in generale. Dopo averlo provato, ho scoperto che i punti tracciati non riflettono esattamente i dati di input ma sono cambiati per qualche bizzarro motivo (alcuni dei punti tracciati erano sopra 1 e sotto 0). Quindi raccomando di codificarlo tu stesso, anche se è più lavoro.


7
Approvo questa risposta, ma vorrei fare un punto di chiarimento: definirei questa regressione logistica frazionaria. Penso che questo termine sarebbe più ampiamente riconosciuto. Quando la maggior parte delle persone sente "regressione logistica", scommetto che pensa a una variabile dipendente 0/1. Una buona risposta Stackexchange che tratta questa nomenclatura è qui: stats.stackexchange.com/questions/216122/…
Weiwen Ng

2
@teaelleceecee Evidentemente devi prima dividere la copertura per 100.
Nick Cox,

4
usare family=quasibinomial()per evitare l'avvertimento (e i problemi sottostanti con ipotesi di varianza troppo rigide). Segui i consigli di @ mkt sull'altro problema.
Ben Bolker,

2
Questo potrebbe funzionare, ma vorrei avvertire la gente che dovresti avere una premessa prima di adattare una funzione che i tuoi dati dovrebbero effettivamente seguire quella funzione. Altrimenti stai praticamente sparando a caso quando scegli una funzione adatta e potresti essere ingannato dai risultati.
Carl Witthoft,

6
@CarlWitthoft Sentiamo il sermone ma siamo peccatori fuori dal servizio. Quale premessa precedente ti ha portato a suggerire una funzione Heaviside in altri commenti? La biologia qui non assomiglia alla transizione a una soglia netta. Il fatto della ricerca qui, come ho capito, è che la teoria formale è più debole dei dati. Sono d'accordo: se le persone pensano che una funzione di passaggio abbia senso, dovrebbero adattarsi a una.
Nick Cox,

11

Questa non è una risposta diversa da @mkt, ma i grafici in particolare non rientrano in un commento. Innanzitutto inserisco una curva logistica in Stata (dopo aver registrato il predittore) su tutti i dati e ottengo questo grafico

inserisci qui la descrizione dell'immagine

Un'equazione è

100 invlogit(-4.192654 + 1.880951 log10( Copies))

Ora inserisco le curve separatamente per ciascun virus nel più semplice scenario del virus che definisce una variabile indicatore. Qui per la cronaca c'è uno script Stata:

clear 
input id str9 Subsample   str4 Virus   Genome_cov  Copies_per_uL
1   S1.1_RRAV   RRAV    100 92500
2   S1.2_RRAV   RRAV    100 95900
3   S1.3_RRAV   RRAV    100 92900
4   S2.1_RRAV   RRAV    100 4049.54
5   S2.2_RRAV   RRAV    96.9935 3809
6   S2.3_RRAV   RRAV    94.5054 3695.06
7   S3.1_RRAV   RRAV    3.7235  86.37
8   S3.2_RRAV   RRAV    11.8186 84.2
9   S3.3_RRAV   RRAV    11.0929 95.2
10  S4.1_RRAV   RRAV    0   2.12
11  S4.2_RRAV   RRAV    5.0799  2.71
12  S4.3_RRAV   RRAV    0   2.39
13  S5.1_RRAV   RRAV    4.9503  0.16
14  S5.2_RRAV   RRAV    0   0.08
15  S5.3_RRAV   RRAV    4.4147  0.08
16  S1.1_UMAV   UMAV    5.7666  1.38
17  S1.2_UMAV   UMAV    26.0379 1.72
18  S1.3_UMAV   UMAV    7.4128  2.52
19  S2.1_UMAV   UMAV    21.172  31.06
20  S2.2_UMAV   UMAV    16.1663 29.87
21  S2.3_UMAV   UMAV    9.121   32.82
22  S3.1_UMAV   UMAV    92.903  627.24
23  S3.2_UMAV   UMAV    83.0314 615.36
24  S3.3_UMAV   UMAV    90.3458 632.67
25  S4.1_UMAV   UMAV    98.6696 11180
26  S4.2_UMAV   UMAV    98.8405 12720
27  S4.3_UMAV   UMAV    98.7939 8680
28  S5.1_UMAV   UMAV    98.6489 318200
29  S5.2_UMAV   UMAV    99.1303 346100
30  S5.3_UMAV   UMAV    98.8767 345100
end 

gen log10Copies = log10(Copies)
gen Genome_cov_pr = Genome_cov / 100
encode Virus, gen(virus)
set seed 2803 
fracreg logit Genome_cov_pr log10Copies i.virus, vce(bootstrap, reps(10000)) 

twoway function invlogit(-5.055519 + 1.961538 * x), lc(orange) ra(log10Copies)      ///
|| function invlogit(-5.055519 + 1.233273 + 1.961538 * x), ra(log10Copies) lc(blue) ///
|| scatter Genome_cov_pr log10Copies if Virus == "RRAV", mc(orange) ms(Oh)          ///
|| scatter Genome_cov_pr log10Copies if Virus == "UMAV", mc(blue) ms(+)             ///
legend(order(4 "UMAV" 3 "RRAV") pos(11) col(1) ring(0))                             ///
xla(-1 "0.1" 0 "1" 1 "10" 2 "100" 3 "10{sup:3}" 4 "10{sup:4}" 5 "10{sup:5}")        ///
yla(0 .25 "25" .5 "50" .75 "75" 1 "100", ang(h))                                    ///
ytitle(Genome coverage (%)) xtitle(Genome copies / {&mu}L) scheme(s1color) 

Questo sta spingendo molto su un set di dati minuscolo, ma il valore P per il virus sembra supportare l'inserimento congiunto di due curve.

Fractional logistic regression                  Number of obs     =         30
                                                Replications      =     10,000
                                                Wald chi2(2)      =      48.14
                                                Prob > chi2       =     0.0000
Log pseudolikelihood = -6.9603063               Pseudo R2         =     0.6646

-------------------------------------------------------------------------------
              |   Observed   Bootstrap                         Normal-based
Genome_cov_pr |      Coef.   Std. Err.      z    P>|z|     [95% Conf. Interval]
--------------+----------------------------------------------------------------
  log10Copies |   1.961538   .2893965     6.78   0.000     1.394331    2.528745
              |
        virus |
        UMAV  |   1.233273   .5557609     2.22   0.026     .1440018    2.322544
        _cons |  -5.055519   .8971009    -5.64   0.000    -6.813805   -3.297234
-------------------------------------------------------------------------------

inserisci qui la descrizione dell'immagine


3

Prova la funzione sigmoid . Esistono molte formulazioni di questa forma tra cui una curva logistica. La tangente iperbolica è un'altra scelta popolare.

Dati i grafici, non posso escludere nemmeno una semplice funzione di passaggio. Temo che non sarai in grado di distinguere tra una funzione step e un numero qualsiasi di specifiche sigmoid. Non ci sono osservazioni in cui la percentuale è compresa nell'intervallo del 50%, quindi la semplice formulazione a gradino può essere la scelta più parsimoniosa che si comporta non peggio di modelli più complessi


σ(X)=12(1+tanhX2)

2
@JG "sigmoid" è un termine generico per una curva a S, per quanto mi riguarda, ma hai ragione a indicare un collegamento tra due specifiche di un
sigmoid

2

Ecco gli accoppiamenti 4PL (4 parametri logistici), sia vincolati che non vincolati, con l'equazione secondo CA Holstein, M. Griffin, J. Hong, PD Sampson, "Metodo statistico per determinare e confrontare i limiti di rilevamento di biotest", Anal . Chem. 87 (2015) 9795-9801. L'equazione 4PL è mostrata in entrambe le figure ei significati dei parametri sono i seguenti: a = asintoto inferiore, b = fattore di inclinazione, c = punto di flesso e d = asintoto superiore.

La Figura 1 vincola a uguale a 0% e d uguale a 100%:

Fig. 1 Vincolato a & d

La Figura 2 non ha vincoli sui 4 parametri nell'equazione 4PL:

Fig. 2 Nessun vincolo

È stato divertente, non pretendo di sapere nulla di biologico e sarà interessante vedere come tutto si risolve!


Grazie, è davvero utile. Mi chiedevo, hai fatto questo in MATLAB con la funzione di adattamento?
teaelleceecee,

1
Ho usato Igor Pro con la funzione utente definita dall'utente mostrata nelle figure. Ho usato Igor Pro e il suo predecessore (Igor) dal 1988, ma molti altri programmi possono adattarsi alla curva, ad esempio Origin Pro e il Kaleidagraph molto economico. E sembra che tu abbia R e (forse?) L'accesso a Matlab, nessuno dei quali ne so nulla tranne che sono estremamente capaci. Meglio del successo con questo e spero che tu abbia buone notizie la prossima volta che discuterai di cose con i supervisori! Inoltre, grazie per aver pubblicato i dati!
Ed V,

2

Ho estratto i dati dal tuo diagramma a dispersione e la mia ricerca di equazioni ha rivelato un'equazione di tipo logistico a 3 parametri come un buon candidato: "y = a / (1.0 + b * exp (-1.0 * c * x))", dove " x "è la base di registro 10 per la trama. I parametri adattati erano a = 9.0005947126706630E + 01, b = 1.2831794858584102E + 07 e c = 6.6483431489473155E + 00 per i miei dati estratti, un adattamento dei dati originali (log 10 x) dovrebbe fornire risultati simili se si reinserisce i dati originali usando i miei valori come stime iniziali dei parametri. I miei valori dei parametri stanno producendo R-quadrato = 0,983 e RMSE = 5,625 sui dati estratti.

tracciare

EDIT: ora che la domanda è stata modificata per includere i dati effettivi, ecco un diagramma che utilizza l'equazione a 3 parametri sopra e le stime iniziali dei parametri.

Plot2


Sembra che ci sia stato un errore nell'estrazione dei dati: hai un sacco di valori percentuali negativi. Inoltre, i valori massimi sono circa il 90% anziché il 100% come nel grafico originale. Potresti avere tutto compensato di circa il 10% per qualche motivo.
mkt - Ripristina Monica il

Meh - si tratta di dati estratti semi-manualmente, sono richiesti i dati originali. Questo di solito è sufficiente per le ricerche di equazioni e, ovviamente, non per i risultati finali, motivo per cui ho detto di utilizzare i miei valori di parametro extract-o-fit come stime iniziali dei parametri sui dati originali.
James Phillips,

Si noti che poiché i dati effettivi sono stati aggiunti al post, ho aggiornato questa risposta utilizzando i dati aggiornati.
James Phillips,

Giusto per ribadire: l'applicazione, ad esempio, di una funzione Heaviside, può produrre valori di errore simili.
Carl Witthoft,

1
@JamesPhillips Tenterò di farlo (Heaviside -> errorbars o equivalente)
Carl Witthoft,

2

Da quando ho dovuto aprire la mia bocca su Heaviside, ecco i risultati. Ho impostato il punto di transizione su log10 (viruscopie) = 2.5. Quindi ho calcolato le deviazioni standard delle due metà del set di dati - ovvero, Heaviside sta assumendo che i dati su entrambi i lati abbiano tutte le derivate = 0.

Dev. Lato destro DX = 4,76
dev. Lato destro DX = 7,72

Dal momento che si scopre che ci sono 15 campioni in ogni batch, lo std dev complessivo è la media, o 6.24.

Supponendo che "RMSE" citato in altre risposte sia "errore RMS" nel complesso, la funzione Heaviside sembrerebbe fare almeno così come, se non meglio, la maggior parte delle "curve Z" (prese in prestito dalla nomenclatura della risposta fotografica) Qui.

modificare

Grafico inutile, ma richiesto nei commenti:

Vestibilità curva Heaviside


Ti piacerebbe pubblicare un modello e un diagramma a dispersione in modo simile a quello che è stato fatto nelle altre risposte? Sono molto curioso di vedere questi risultati e confrontare. Aggiungi anche i valori RMSE e R al quadrato per il confronto. Personalmente non ho mai usato la funzione Heaviside e trovo questo molto interessante.
James Phillips,

R2

Il mio significato era quello di fare una trama simile a quelle fatte nelle altre risposte, allo scopo di un confronto diretto con quelle risposte.
James Phillips,

2
@JamesPhillips ti restano due desideri. Scegli saggiamente :-)
Carl Witthoft,

Grazie per la trama. Osservo che in tutti i diagrammi di altre risposte, l'equazione tracciata segue la forma curva dei dati in alto a destra - non è così, come lo è la natura della funzione di Heaviside. Ciò sembra contraddire visivamente la tua affermazione che la funzione di Heaviside farebbe così come le equazioni pubblicate nelle altre risposte - motivo per cui in precedenza avevo richiesto i valori RMSE e R-quadrato, sospettavo che la funzione di Heaviside non avrebbe seguito la forma dei dati in questa regione e potrebbe produrre valori peggiori per quelle statistiche adeguate.
James Phillips,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.