เส้นโค้ง (หรือรุ่น) ชนิดใดที่ฉันควรจะพอดีกับข้อมูลเปอร์เซ็นต์ของฉัน


15

ฉันพยายามสร้างรูปที่แสดงความสัมพันธ์ระหว่างสำเนาไวรัสและการครอบคลุมจีโนม (GCC) นี่คือข้อมูลของฉันที่มีลักษณะ:

ปริมาณไวรัสเทียบกับ GCC

ตอนแรกฉันเพิ่งวางแผนการถดถอยเชิงเส้น แต่หัวหน้างานของฉันบอกฉันว่ามันไม่ถูกต้องและลองใช้เส้นโค้ง sigmoidal ดังนั้นฉันจึงใช้ 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))

ปริมาณไวรัสเทียบกับ GCC - geom_smooth

อย่างไรก็ตามหัวหน้างานของฉันบอกว่าสิ่งนี้ไม่ถูกต้องเช่นกันเพราะเส้นโค้งทำให้ดูเหมือนว่า GCC สามารถทำกำไรได้มากกว่า 100% ซึ่งไม่สามารถทำได้

คำถามของฉันคือวิธีที่ดีที่สุดในการแสดงความสัมพันธ์ระหว่างสำเนาไวรัสและ GCC คืออะไร ฉันต้องการทำให้ชัดเจนว่า A) สำเนาไวรัสต่ำ = GCC ต่ำและ B) หลังจากไวรัสจำนวนหนึ่งคัดลอกที่ราบสูง GCC

ฉันค้นคว้าวิธีการมากมาย - GAM, LOESS, logistic, piecewise - แต่ฉันไม่รู้ว่าจะบอกได้อย่างไรว่าวิธีใดดีที่สุดสำหรับข้อมูลของฉัน

แก้ไข: นี่คือข้อมูล:

>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
ดูเหมือนว่าการถดถอยโลจิสติกจะดีที่สุดเนื่องจากมีขอบเขตระหว่าง 0 ถึง 100%
mkt - Reinstate Monica

1
ลอง (2) ชิ้นส่วนที่ชาญฉลาด (เชิงเส้น)
user158565

3
ลองเพิ่มmethod.args=list(family=quasibinomial))ในข้อโต้แย้งgeom_smooth()ในรหัส ggplot เดิมของคุณ
Ben Bolker

4
ป.ล. ผมจะแนะนำให้คุณไม่ได้se=FALSEยกเลิกข้อผิดพลาดกับมาตรฐาน มีความสุขเสมอที่จะแสดงให้ผู้คนว่าขนาดใหญ่ความไม่แน่นอนของจริงคือ ...
เบน Bolker

2
คุณมีจุดข้อมูลไม่เพียงพอในขอบเขตการเปลี่ยนแปลงเพื่ออ้างสิทธิ์กับหน่วยงานที่มีเส้นโค้งที่ราบรื่น ฉันสามารถใส่ฟังก์ชั่น Heaviside เข้ากับจุดที่คุณแสดงให้เราเห็นได้อย่างง่ายดาย
Carl Witthoft

คำตอบ:


6

อีกวิธีหนึ่งในการดำเนินการนี้คือการใช้สูตรแบบเบย์มันอาจเป็นการเริ่มต้นที่หนักหน่วง แต่ก็มีแนวโน้มที่จะทำให้ง่ายขึ้นในการแสดงรายละเอียดของปัญหาของคุณรวมถึงแนวคิดที่ดีกว่า คือ

Stanเป็นตัวอย่างมอนติคาร์โลที่มีอินเตอร์เฟซการเขียนโปรแกรมค่อนข้างง่ายมีไลบรารีสำหรับR และอื่น ๆแต่ฉันใช้ Python ที่นี่

เราใช้ sigmoid เหมือนคนอื่น ๆ : มันมีแรงจูงใจทางชีวเคมีรวมถึงความสะดวกสบายทางคณิตศาสตร์ในการทำงานด้วย การกำหนดพารามิเตอร์ที่ดีสำหรับงานนี้คือ:

import numpy as np

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

ที่alphaกำหนดจุดกึ่งกลางของเส้นโค้ง sigmoid (เช่นที่มันข้าม 50%) และbetaกำหนดความลาดชันค่าใกล้ศูนย์เป็นประจบ

เพื่อแสดงสิ่งที่ดูเหมือนว่าเราสามารถดึงข้อมูลของคุณและวางแผนด้วย:

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')

ที่raw_data.txtมีข้อมูลที่คุณให้และฉันเปลี่ยนความครอบคลุมเป็นสิ่งที่มีประโยชน์มากขึ้น ค่าสัมประสิทธิ์ 5.5 และ 3 ดูดีและให้พล็อตมากเหมือนคำตอบอื่น ๆ :

ข้อมูลการพล็อตและแบบแมนนวล

เพื่อ "พอดี" ฟังก์ชั่นนี้โดยใช้สแตนเราจำเป็นต้องกำหนดโมเดลของเราโดยใช้ภาษาของตัวเองซึ่งเป็นการผสมผสานระหว่าง R และ C ++ โมเดลที่เรียบง่ายน่าจะเป็นอะไรที่ชอบ:

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);
}

ซึ่งหวังว่าจะอ่านตกลง เรามีdataบล็อกที่กำหนดข้อมูลที่เราคาดหวังเมื่อเราสุ่มตัวอย่างแบบจำลองparametersกำหนดสิ่งต่าง ๆ ที่สุ่มตัวอย่างและmodelกำหนดฟังก์ชันความน่าจะเป็น คุณบอกให้สแตน "รวบรวม" โมเดลซึ่งใช้เวลาสักครู่แล้วคุณสามารถสุ่มตัวอย่างจากมันด้วยข้อมูลบางอย่าง ตัวอย่างเช่น:

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 ช่วยให้การวินิจฉัยที่ดีเป็นเรื่องง่ายในขณะที่การพิมพ์ที่พอดีช่วยให้คุณสรุปพารามิเตอร์ R-style ได้ดี:

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

ค่าเบี่ยงเบนมาตรฐานขนาดใหญ่ที่betaบอกว่าข้อมูลไม่ได้ให้ข้อมูลมากเกี่ยวกับพารามิเตอร์นี้ บางคำตอบที่ให้ตัวเลขมากกว่า 10 หลักในแบบจำลองของพวกเขากำลังพูดเกินจริงไปบ้าง

เนื่องจากคำตอบบางข้อสังเกตว่าไวรัสแต่ละตัวอาจต้องการพารามิเตอร์ของตัวเองฉันจึงขยายแบบจำลองเพื่ออนุญาตalphaและbetaแตกต่างกันโดย "ไวรัส" ทุกอย่างได้รับบิตเที่ยวยุ่งยิ่ง แต่ไวรัสสองตัวเกือบจะแน่นอนมีalphaค่าที่แตกต่างกัน(เช่นคุณต้องการสำเนาเพิ่มเติม / μLของ RRAV สำหรับความครอบคลุมเดียวกัน) และพล็อตที่แสดงนี้คือ:

พล็อตของข้อมูลและตัวอย่าง MC

ข้อมูลเหมือนเดิม แต่ฉันวาดเส้นโค้งสำหรับ 40 ตัวอย่างหลัง UMAVดูเหมือนจะค่อนข้างดีในขณะที่RRAVสามารถติดตามความชันเดียวกันและต้องการจำนวนสำเนาที่สูงกว่าหรือมีความชันชันและจำนวนสำเนาที่คล้ายกัน มวลหลังส่วนใหญ่ต้องการจำนวนสำเนาที่สูงขึ้น แต่ความไม่แน่นอนนี้อาจอธิบายความแตกต่างของคำตอบอื่น ๆ ในการค้นหาสิ่งต่าง ๆ

ฉันส่วนใหญ่ใช้การตอบคำถามนี้เป็นแบบฝึกหัดเพื่อพัฒนาความรู้เกี่ยวกับสแตนและฉันได้ใส่สมุดบันทึก Jupyter ของที่นี่ในกรณีที่ใครก็ตามที่สนใจ / ต้องการที่จะทำซ้ำ


14

(แก้ไขโดยคำนึงถึงความคิดเห็นของบัญชีด้านล่างขอบคุณ @BenBolker & @WeiwenNg สำหรับการป้อนข้อมูลที่เป็นประโยชน์)

พอดีการถดถอยโลจิสติกเศษส่วนกับข้อมูล มันเหมาะอย่างยิ่งกับข้อมูลร้อยละที่ล้อมรอบระหว่าง 0 และ 100% และมีเหตุผลทางทฤษฎีในหลายพื้นที่ของชีววิทยา

โปรดทราบว่าคุณอาจต้องหารค่าทั้งหมดด้วย 100 เพื่อให้พอดีเนื่องจากโปรแกรมมักคาดหวังว่าข้อมูลจะอยู่ในช่วงระหว่าง 0 ถึง 1 และตามที่ Ben Bolker แนะนำให้ใช้เพื่อจัดการปัญหาที่อาจเกิดขึ้นจากสมมติฐานที่เข้มงวดของการแจกแจงทวินาม การกระจาย quasibinomial แทน

ฉันได้ตั้งสมมติฐานบางอย่างตามรหัสของคุณเช่นมีไวรัส 2 ตัวที่คุณสนใจและพวกเขาอาจแสดงรูปแบบที่แตกต่างกัน (เช่นอาจมีปฏิสัมพันธ์ระหว่างประเภทไวรัสและจำนวนสำเนา)

ประการแรกรูปแบบที่เหมาะสม:

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

หากคุณเชื่อถือค่า p ผลลัพธ์จะไม่แนะนำให้ไวรัสทั้งสองแตกต่างกันอย่างมีความหมาย ตรงกันข้ามกับผลลัพธ์ของ @ NickCox ด้านล่างแม้ว่าเราจะใช้วิธีการที่แตกต่างกัน ฉันไม่มั่นใจอย่างมากกับจุดข้อมูล 30 จุด

ประการที่สองการวางแผน:

มันไม่ยากที่จะเขียนโค้ดวิธีที่จะเห็นภาพผลลัพธ์ด้วยตัวคุณเอง แต่ดูเหมือนจะมีแพ็คเกจ ggPredict ที่จะทำงานส่วนใหญ่ให้คุณ (ไม่สามารถรับรองได้ฉันไม่ได้ลองเอง) รหัสจะมีลักษณะดังนี้:

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

อัปเดต: ฉันไม่แนะนำรหัสหรือฟังก์ชั่น ggPredict อีกต่อไปโดยทั่วไป หลังจากลองแล้วฉันพบว่าจุดที่วางแผนไม่ได้สะท้อนข้อมูลที่ป้อนเข้าจริง แต่จะเปลี่ยนไปด้วยเหตุผลแปลก ๆ (จุดที่วางแผนบางจุดอยู่เหนือ 1 และต่ำกว่า 0) ดังนั้นฉันขอแนะนำให้เขียนโค้ดด้วยตัวเอง แต่มันก็ใช้ได้ดีกว่า


7
ฉันรับรองคำตอบนี้ แต่ฉันต้องการชี้แจง: ฉันเรียกการถดถอยโลจิสติกแบบเศษส่วนนี้ ฉันคิดว่าคำนี้จะเป็นที่รู้จักอย่างกว้างขวางมากขึ้น เมื่อคนส่วนใหญ่ได้ยิน "การถดถอยโลจิสติก" ฉันคิดว่าพวกเขาคิดว่าตัวแปรตาม 0/1 หนึ่งคำตอบที่ดี Stackexchange จัดการกับศัพท์นี้อยู่ที่นี่: stats.stackexchange.com/questions/216122/ …
Weiwen Ng

2
@teaelleceecee คุณเห็นได้ชัดว่าต้องแบ่งความคุ้มครองโดย 100 ก่อน
Nick Cox

4
ใช้family=quasibinomial()เพื่อหลีกเลี่ยงคำเตือน (และปัญหาพื้นฐานที่มีข้อแปรปรวนที่เข้มงวดเกินไป) รับคำแนะนำจาก @ mkt เกี่ยวกับปัญหาอื่น ๆ
Ben Bolker

2
สิ่งนี้อาจใช้งานได้ แต่ฉันขอเตือนผู้ใช้ว่าคุณควรมีหลักฐานก่อนปรับฟังก์ชั่นที่ข้อมูลของคุณควรทำตามนั้น ไม่เช่นนั้นคุณจะถ่ายภาพแบบสุ่มเมื่อคุณเลือกฟังก์ชั่นกระชับและผลลัพธ์อาจถูกหลอก
Carl Witthoft

6
@CarlWitthoft เราได้ยินคำเทศนา แต่เป็นคนบาปนอกบริการ หลักฐานอะไรที่ทำให้คุณแนะนำฟังก์ชัน Heaviside ในความคิดเห็นอื่น ชีววิทยาที่นี่ไม่ได้มีลักษณะคล้ายกับการเปลี่ยนแปลงในระดับที่คมชัด ความจริงของการวิจัยที่นี่ที่ฉันเข้าใจคือทฤษฎีทางการนั้นอ่อนแอกว่าข้อมูล ฉันเห็นด้วย: ถ้าคนคิดว่าฟังก์ชั่นขั้นตอนเหมาะสมแล้วพวกเขาควรจะเข้ากันได้ดี
Nick Cox

11

นี่ไม่ใช่คำตอบที่แตกต่างจาก @mkt แต่โดยเฉพาะกราฟจะไม่พอดีกับความคิดเห็น ฉันแรกพอดีโค้งโลจิสติกใน Stata (หลังจากบันทึกการทำนาย) กับข้อมูลทั้งหมดและรับกราฟนี้

ป้อนคำอธิบายรูปภาพที่นี่

สมการคือ

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

ตอนนี้ฉันพอดีกับเส้นโค้งแยกกันสำหรับไวรัสแต่ละตัวในสถานการณ์ที่ง่ายที่สุดของไวรัสที่กำหนดตัวแปรตัวบ่งชี้ นี่คือบันทึกเป็นสคริปต์ 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) 

สิ่งนี้กำลังผลักดันอย่างหนักบนชุดข้อมูลขนาดเล็ก แต่ค่า P-value ของไวรัสดูเหมือนจะสนับสนุนการโค้งสองเส้นที่เหมาะสม

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
-------------------------------------------------------------------------------

ป้อนคำอธิบายรูปภาพที่นี่


3

ลองใช้ฟังก์ชั่นsigmoid มีหลายสูตรของรูปร่างนี้รวมถึงเส้นโค้งโลจิสติก แทนเจนต์ซึ่งเกินความจริงเป็นอีกทางเลือกยอดนิยม

เมื่อรับแปลงฉันไม่สามารถแยกแยะฟังก์ชั่นขั้นตอนง่ายๆได้ ฉันเกรงว่าคุณจะไม่สามารถแยกแยะความแตกต่างระหว่างฟังก์ชั่นขั้นตอนกับสเปคซิกมอยด์จำนวนเท่าใดก็ได้ คุณไม่มีข้อสังเกตุใด ๆ ที่เปอร์เซ็นต์ของคุณอยู่ในช่วง 50% ดังนั้นการกำหนดขั้นตอนง่าย ๆ อาจเป็นตัวเลือก parsimoinous ที่สุดที่ทำงานได้ไม่เลวร้ายยิ่งกว่าแบบจำลองที่ซับซ้อนมากขึ้น


σ(x)=12(1+tanhx2)

2
@JG "sigmoid" เป็นคำทั่วไปสำหรับ S-curve ตราบใดที่ฉันเป็นห่วง แต่คุณถูกต้องที่จะชี้ไปที่ลิงก์ระหว่างสองข้อมูลจำเพาะของ sigmoid
24919

2

นี่คือ 4PL (4 พารามิเตอร์โลจิสติก) เหมาะทั้ง จำกัด และไม่ จำกัด ด้วยสมการตาม CA Holstein, M. Griffin, J. Hong, PD Sampson, "วิธีการทางสถิติสำหรับการกำหนดและเปรียบเทียบข้อ จำกัด ของการตรวจหา Bioassays", Anal . Chem 87 (2015) 9795-9801 สมการ 4PL แสดงทั้งในรูปและความหมายของพารามิเตอร์มีดังนี้: a = asymptote ที่ต่ำกว่า, b = ปัจจัยความชัน, c = จุดผัน, และ d = เส้นกำกับบน

รูปที่ 1 จำกัด a เท่ากับ 0% และ d ให้เท่ากับ 100%:

รูปที่ 1 จำกัด & a

รูปที่ 2 ไม่มีข้อ จำกัด ในพารามิเตอร์ 4 ในสมการ 4PL:

รูปที่ 2 ไม่มีข้อ จำกัด

มันสนุกฉันไม่คิดว่าจะรู้อะไรทางชีววิทยาและมันจะน่าสนใจที่จะดูว่ามันจะเป็นอย่างไร!


ขอบคุณนี่เป็นประโยชน์จริงๆ แค่สงสัยคุณทำสิ่งนี้ใน MATLAB ด้วยฟังก์ชั่นพอดีหรือไม่?
teaelleceecee

1
ฉันใช้ Igor Pro กับฟังก์ชั่นผู้ใช้ที่ผู้ใช้กำหนดเองที่แสดงในรูป ฉันใช้ Igor Pro และผู้บุกเบิกรุ่นก่อนหน้า (Igor) มาตั้งแต่ปี 1988 แต่โปรแกรมอื่น ๆ อีกมากมายที่สามารถทำการปรับเส้นโค้งเช่น Origin Pro และ Kaleidagraph ราคาไม่แพงมาก และดูเหมือนว่าคุณมีสิทธิ์เข้าถึง R และ (อาจเป็นไปได้) ที่ Matlab ซึ่งฉันไม่รู้อะไรเลยยกเว้นว่าพวกเขามีความสามารถอย่างยิ่ง ดีที่สุดของความสำเร็จกับเรื่องนี้และฉันหวังว่าคุณจะได้รับข่าวดีในครั้งต่อไปที่คุณพูดคุยกับผู้บังคับบัญชา! นอกจากนี้ขอขอบคุณที่โพสต์ข้อมูล!
Ed V

2

ฉันดึงข้อมูลจากสแกตเตอร์ของคุณและการค้นหาสมการของฉันได้สร้างสมการโลจิสติกประเภท 3 พารามิเตอร์เป็นผู้สมัครที่ดี: "y = a / (1.0 + b * exp (-1.0 * c * x))" ที่ไหน x "คือล็อกฐาน 10 ต่อพล็อตของคุณ พารามิเตอร์ที่ติดตั้งคือ a = 9.0005947126706630E + 01, b = 1.2831794858584102E + 07, และ c = 6.6483431489473155E + 00 สำหรับข้อมูลที่แยกออกมาของฉันแบบพอดี (บันทึก 10 x) ข้อมูลต้นฉบับควรให้ผลลัพธ์ที่คล้ายกัน ข้อมูลต้นฉบับโดยใช้ค่าของฉันเป็นการประมาณการพารามิเตอร์เริ่มต้น ค่าพารามิเตอร์ของฉันยอมให้ R-squared = 0.983 และ RMSE = 5.625 บนข้อมูลที่แยกออกมา

พล็อต

แก้ไข: ตอนนี้คำถามได้รับการแก้ไขเพื่อรวมข้อมูลจริงนี่คือโครงเรื่องโดยใช้สมการ 3 พารามิเตอร์ข้างต้นและการประมาณพารามิเตอร์เริ่มต้น

plot2


ดูเหมือนว่ามีข้อผิดพลาดในการดึงข้อมูลของคุณ: คุณมีค่าเปอร์เซ็นต์ลบ นอกจากนี้ค่าสูงสุดของคุณอยู่ที่ประมาณ 90% แทนที่จะเป็น 100% เหมือนในพล็อตดั้งเดิม คุณอาจชดเชยทุกอย่างได้ประมาณ 10% ด้วยเหตุผลบางอย่าง
mkt - Reinstate Monica

Meh - นี่คือข้อมูลที่แยกด้วยตนเองกึ่งข้อมูลข้อมูลที่จำเป็น ซึ่งมักจะเพียงพอสำหรับการค้นหาสมการและไม่ใช่สำหรับผลลัพธ์สุดท้าย - ซึ่งเป็นเหตุผลที่ฉันบอกว่าใช้ค่าพารามิเตอร์ extract-o-fit ของฉันเป็นพารามิเตอร์เริ่มต้นประมาณการข้อมูลต้นฉบับ
James Phillips

โปรดทราบว่าขณะนี้มีการเพิ่มข้อมูลจริงลงในโพสต์แล้วฉันได้อัปเดตคำตอบนี้โดยใช้ข้อมูลที่อัปเดตแล้ว
James Phillips

เพียงเพื่อย้ำ: การประยุกต์ใช้เช่นฟังก์ชั่น Heaviside อาจให้ค่าความผิดพลาดที่คล้ายกัน
Carl Witthoft

1
@ JamesPhillips ฉันจะพยายามทำเช่นนั้น (Heaviside -> errorbars หรือเทียบเท่า)
Carl Witthoft

2

เนื่องจากฉันต้องเปิดปากใหญ่เกี่ยวกับ Heaviside นี่คือผลลัพธ์ ฉันตั้งค่าจุดเปลี่ยนเป็น log10 (viruscopies) = 2.5 จากนั้นฉันคำนวณค่าเบี่ยงเบนมาตรฐานของสองส่วนของชุดข้อมูล - นั่นคือ Heaviside สมมติว่าข้อมูลทั้งสองด้านมีอนุพันธ์ทั้งหมด = 0

RH side std dev = 4.76
LH side std dev = 7.72

เนื่องจากปรากฎว่ามีตัวอย่าง 15 ชุดในแต่ละชุด std dev โดยรวมคือค่าเฉลี่ยหรือ 6.24

สมมติว่า "RMSE" ที่ยกมาในคำตอบอื่น ๆ คือ "ข้อผิดพลาด RMS" โดยรวมฟังก์ชั่น Heaviside จะปรากฏขึ้นเพื่อทำอย่างน้อยเช่นเดียวกับถ้าไม่ดีกว่า "Z-curve" ส่วนใหญ่ (ยืมมาจากคำศัพท์การถ่ายภาพ) ที่นี่

แก้ไข

กราฟไร้ประโยชน์ แต่ถูกร้องขอในความคิดเห็น:

เส้นโค้ง Heaviside นั้นพอดี


คุณโปรดโพสต์แบบจำลองและ Scatterplot คล้ายกับคำตอบอื่น ๆ ฉันอยากรู้มากที่สุดที่จะเห็นผลลัพธ์และเปรียบเทียบ โปรดเพิ่ม RMSE และ R-squared เพื่อเปรียบเทียบ โดยส่วนตัวฉันไม่เคยใช้ฟังก์ชั่น Heaviside และพบว่ามันน่าสนใจมาก
James Phillips

R2

ความหมายของฉันคือทำพล็อตคล้ายกับคำตอบอื่น ๆ เพื่อจุดประสงค์ในการเปรียบเทียบโดยตรงกับคำตอบเหล่านั้น
James Phillips

2
@JamesPhillips คุณมีความปรารถนาสองอย่างที่เหลือ เลือกอย่างชาญฉลาด :-)
Carl Witthoft

ขอบคุณสำหรับพล็อต ฉันสังเกตว่าในแปลงทั้งหมดในคำตอบอื่น ๆ สมการพล็อตตามรูปร่างโค้งของข้อมูลที่ด้านบนขวา - ของคุณไม่เช่นเดียวกับธรรมชาติของฟังก์ชั่น Heaviside ดูเหมือนว่าจะขัดแย้งกับการยืนยันของคุณว่าฟังก์ชั่น Heaviside จะทำเช่นเดียวกับสมการที่โพสต์ในคำตอบอื่น ๆ - ซึ่งเป็นเหตุผลที่ฉันเคยขอค่า RMSE และ R-squared ก่อนหน้านี้ฉันสงสัยว่าฟังก์ชั่น Heaviside จะไม่เป็นไปตามรูปร่าง ของข้อมูลในภูมิภาคนี้และอาจทำให้ค่าแย่ลงสำหรับสถิติที่เหมาะสม
James Phillips
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.