Loại đường cong (hoặc mô hình) nào tôi phải phù hợp với dữ liệu tỷ lệ phần trăm của tôi?


15

Tôi đang cố gắng tạo ra một con số cho thấy mối quan hệ giữa các bản sao virus và phạm vi bảo vệ bộ gen (GCC). Đây là dữ liệu của tôi trông như sau:

Tải lượng virus so với GCC

Lúc đầu, tôi chỉ vẽ một hồi quy tuyến tính nhưng các giám sát viên của tôi nói với tôi rằng điều đó không chính xác, và để thử một đường cong sigmoidal. Vì vậy, tôi đã làm điều này bằng cách sử dụng 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))

Tải lượng virus so với GCC - geom_smooth

Tuy nhiên, các giám sát viên của tôi nói rằng điều này cũng không chính xác vì các đường cong làm cho nó trông giống như GCC có thể vượt quá 100%, điều này không thể.

Câu hỏi của tôi là: cách tốt nhất để thể hiện mối quan hệ giữa các bản sao virus và GCC là gì? Tôi muốn làm rõ rằng A) các bản sao virus thấp = GCC thấp và B) sau một số lượng virus nhất định sao chép các cao nguyên GCC.

Tôi đã nghiên cứu rất nhiều phương pháp khác nhau - GAM, LOESS, logistic, piecewise - nhưng tôi không biết làm thế nào để biết phương pháp tốt nhất cho dữ liệu của mình là gì.

EDIT: đây là dữ liệu:

>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
Có vẻ như hồi quy logistic sẽ là tốt nhất, vì điều này được giới hạn trong khoảng từ 0 đến 100%.
mkt - Tái lập Monica

1
Hãy thử (2) mô hình mảnh (tuyến tính).
dùng158565

3
hãy thử thêm method.args=list(family=quasibinomial))vào các đối số geom_smooth()trong mã ggplot ban đầu của bạn.
Ben Bolker

4
PS Tôi sẽ khuyến khích bạn không loại bỏ các lỗi tiêu chuẩn với se=FALSE. Luôn luôn tốt đẹp để cho mọi người thấy sự không chắc chắn thực sự lớn đến mức nào ...
Ben Bolker

2
Bạn không có đủ điểm dữ liệu trong vùng chuyển tiếp để yêu cầu với bất kỳ cơ quan nào có đường cong trơn tru. Tôi có thể dễ dàng điều chỉnh một chức năng của Heaviside với các điểm bạn đang chỉ cho chúng tôi.
Carl Witthoft

Câu trả lời:


6

Một cách khác để làm điều này là sử dụng một công thức Bayes, nó có thể hơi nặng nề khi bắt đầu nhưng nó có xu hướng làm cho nó dễ dàng hơn nhiều để thể hiện cụ thể vấn đề của bạn cũng như nhận được ý tưởng tốt hơn về "sự không chắc chắn" Là

Stan là một bộ lấy mẫu Monte Carlo với giao diện lập trình tương đối dễ sử dụng, các thư viện có sẵn cho R và những người khác nhưng tôi đang sử dụng Python ở đây

chúng tôi sử dụng một sigmoid như mọi người khác: nó có động lực sinh hóa cũng như về mặt toán học rất thuận tiện để làm việc. một tham số tốt đẹp cho nhiệm vụ này là:

import numpy as np

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

trong đó alphaxác định điểm giữa của đường cong sigmoid (nghĩa là nơi nó vượt qua 50%) và betaxác định độ dốc, các giá trị gần bằng 0 là phẳng hơn

để hiển thị cái này trông như thế nào, chúng tôi có thể lấy dữ liệu của bạn và vẽ nó với:

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

nơi raw_data.txtchứa dữ liệu bạn đã cung cấp và tôi đã chuyển đổi phạm vi bảo hiểm sang thứ gì đó hữu ích hơn. các hệ số 5.5 và 3 trông rất đẹp và đưa ra một cốt truyện rất giống với các câu trả lời khác:

dữ liệu cốt truyện và phù hợp với hướng dẫn sử dụng

để "điều chỉnh" chức năng này bằng Stan, chúng ta cần xác định mô hình của mình bằng ngôn ngữ của chính nó là sự pha trộn giữa R và C ++. một mô hình đơn giản sẽ là một cái gì đó như:

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

mà hy vọng đọc OK. chúng ta có một datakhối xác định dữ liệu mà chúng ta mong đợi khi chúng ta lấy mẫu mô hình, parametersxác định những thứ được lấy mẫu và modelxác định hàm khả năng. Bạn bảo Stan "biên dịch" mô hình, mất một lúc, và sau đó bạn có thể lấy mẫu từ nó với một số dữ liệu. ví dụ:

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 làm cho các sơ đồ chẩn đoán đẹp dễ dàng, trong khi in phù hợp cung cấp cho bạn một bản tóm tắt tham số kiểu R đẹp:

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

độ lệch chuẩn lớn betanói rằng dữ liệu thực sự không cung cấp nhiều thông tin về tham số này. Ngoài ra, một số câu trả lời cho hơn 10 chữ số có nghĩa trong mô hình phù hợp của họ đang nói quá lên

bởi vì một số câu trả lời lưu ý rằng mỗi vi-rút có thể cần các tham số riêng, tôi đã mở rộng mô hình để cho phép alphabetathay đổi theo "Vi-rút". tất cả đều có một chút khó khăn, nhưng hai loại virus gần như chắc chắn có các alphagiá trị khác nhau (tức là bạn cần nhiều bản sao / μL RRAV cho cùng một phạm vi bảo hiểm) và một âm mưu cho thấy điều này là:

sơ đồ dữ liệu và mẫu MC

dữ liệu vẫn giống như trước đây, nhưng tôi đã vẽ một đường cong cho 40 mẫu của hậu thế. UMAVdường như được xác định tương đối tốt, trong khi RRAVcó thể theo cùng một độ dốc và cần số lượng bản sao cao hơn, hoặc có độ dốc cao hơn và số lượng bản sao tương tự. hầu hết khối lượng sau này đang cần số lượng bản sao cao hơn, nhưng sự không chắc chắn này có thể giải thích một số khác biệt trong các câu trả lời khác tìm thấy những điều khác nhau

Tôi chủ yếu sử dụng trả lời điều này như một bài tập để nâng cao kiến ​​thức về Stan và tôi đã đặt một cuốn sổ tay Jupyter về điều này ở đây trong trường hợp bất cứ ai quan tâm / muốn sao chép điều này.


14

(Đã chỉnh sửa khi đưa vào nhận xét tài khoản bên dưới. Cảm ơn @BenBolker & @WeiwenNg cho đầu vào hữu ích.)

Phù hợp với một hồi quy logistic phân đoạn cho dữ liệu. Nó rất phù hợp với dữ liệu tỷ lệ phần trăm được giới hạn từ 0 đến 100% và được chứng minh tốt về mặt lý thuyết trong nhiều lĩnh vực sinh học.

Lưu ý rằng bạn có thể phải chia tất cả các giá trị cho 100 để phù hợp với nó, vì các chương trình thường mong đợi dữ liệu nằm trong khoảng từ 0 đến 1. Và như Ben Bolker khuyến nghị, để giải quyết các vấn đề có thể xảy ra do các giả định nghiêm ngặt của phân phối nhị thức liên quan đến phương sai, hãy sử dụng phân phối quasibinomial thay thế.

Tôi đã đưa ra một số giả định dựa trên mã của bạn, chẳng hạn như có 2 loại virus bạn quan tâm và chúng có thể hiển thị các mẫu khác nhau (nghĩa là có thể có sự tương tác giữa loại vi-rút và số lượng bản sao).

Đầu tiên, mô hình phù hợp:

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

Nếu bạn tin tưởng các giá trị p, đầu ra không cho thấy hai loại virus này có ý nghĩa khác nhau. Điều này trái ngược với kết quả của @ NickCox bên dưới, mặc dù chúng tôi đã sử dụng các phương pháp khác nhau. Tôi cũng không tự tin lắm với 30 điểm dữ liệu.

Thứ hai, âm mưu:

Không khó để tự mình viết ra một cách trực quan hóa đầu ra, nhưng dường như có một gói ggPredict sẽ làm hầu hết công việc cho bạn (không thể đảm bảo, tôi đã không tự mình thử). Mã này sẽ trông giống như:

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

Cập nhật: Tôi không còn đề xuất mã hoặc hàm ggPredict nói chung nữa. Sau khi dùng thử, tôi thấy rằng các điểm được vẽ không phản ánh chính xác dữ liệu đầu vào mà thay vào đó được thay đổi vì một lý do kỳ quái nào đó (một số điểm được vẽ nằm trên 1 và dưới 0). Vì vậy, tôi khuyên bạn nên tự viết mã lên, mặc dù đó là công việc nhiều hơn.


7
Tôi tán thành câu trả lời này, nhưng tôi muốn đưa ra một quan điểm rõ ràng: Tôi gọi đây là hồi quy logistic phân đoạn. Tôi nghĩ thuật ngữ này sẽ được công nhận rộng rãi hơn. Khi hầu hết mọi người nghe thấy "hồi quy logistic", tôi cá là họ nghĩ đến biến phụ thuộc 0/1. Một câu trả lời Stackexchange tốt liên quan đến danh pháp này là ở đây: stats.stackexchange.com/questions/216122/ chủ
Weiwen Ng

2
@teaelleceecee Rõ ràng bạn phải chia phạm vi bảo hiểm cho 100 người đầu tiên.
Nick Cox

4
sử dụng family=quasibinomial()để tránh cảnh báo (và các vấn đề tiềm ẩn với các giả định phương sai quá nghiêm ngặt). Hãy tham khảo lời khuyên của @ mkt về vấn đề khác.
Ben Bolker

2
Điều này có thể hoạt động, nhưng tôi muốn cảnh báo mọi người rằng bạn nên có tiền đề trước khi phù hợp với chức năng mà dữ liệu của bạn trong thực tế phải tuân theo chức năng đó. Nếu không, bạn sẽ chụp khá nhiều ngẫu nhiên khi bạn chọn một chức năng phù hợp và bạn có thể bị đánh lừa bởi kết quả.
Carl Witthoft

6
@CarlWitthoft Chúng tôi nghe bài giảng nhưng là tội nhân bên ngoài dịch vụ. Tiền đề nào đã khiến bạn đề xuất một chức năng Heaviside trong các bình luận khác? Sinh học ở đây không giống như quá trình chuyển đổi ở một ngưỡng sắc nét. Thực tế nghiên cứu ở đây theo tôi hiểu là lý thuyết chính thức yếu hơn dữ liệu. Tôi đồng ý: nếu mọi người nghĩ rằng một chức năng bước có ý nghĩa, họ nên phù hợp với một chức năng.
Nick Cox

11

Đây không phải là một câu trả lời khác với @mkt nhưng đặc biệt đồ thị sẽ không phù hợp với một nhận xét. Trước tiên tôi khớp đường cong logistic trong Stata (sau khi ghi nhật ký dự đoán) vào tất cả dữ liệu và lấy biểu đồ này

nhập mô tả hình ảnh ở đây

Một phương trình là

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

Bây giờ tôi điều chỉnh các đường cong riêng biệt cho từng vi-rút trong kịch bản đơn giản nhất về vi-rút xác định một biến chỉ báo. Ở đây cho bản ghi là một kịch bản 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) 

Điều này đang thúc đẩy mạnh mẽ vào một tập dữ liệu nhỏ nhưng giá trị P cho virus có vẻ hỗ trợ cho việc khớp hai đường cong cùng nhau.

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

nhập mô tả hình ảnh ở đây


3

Hãy thử sigmoid chức năng. Có nhiều công thức của hình dạng này bao gồm một đường cong logistic. Hyperbolic tiếp tuyến là một lựa chọn phổ biến khác.

Đưa ra các âm mưu, tôi cũng không thể loại trừ một chức năng bước đơn giản. Tôi e rằng bạn sẽ không thể phân biệt giữa chức năng bước và bất kỳ số lượng thông số kỹ thuật sigmoid nào. Bạn không có bất kỳ quan sát nào trong đó tỷ lệ phần trăm của bạn nằm trong phạm vi 50%, do đó, công thức bước đơn giản có thể là lựa chọn tuyệt vời nhất thực hiện không tệ hơn các mô hình phức tạp hơn


σ(x)= =12(1+tanhx2)

2
@JG "sigmoid" là một thuật ngữ chung cho đường cong S, theo như tôi quan tâm, nhưng bạn có quyền chỉ ra một liên kết giữa hai thông số kỹ thuật của một sigmoid
Aksakal 22/07/19

2

Sau đây là các 4PL (4 tham số logistic) phù hợp, cả hai đều bị hạn chế và không bị giới hạn, với phương trình theo CA Holstein, M. Griffin, J. Hồng, PD Sampson, “Phương pháp thống kê cho Xác định và So sánh Giới hạn phát hiện của sinh trắc nghiệm”, Anal . Hóa. 87 (2015) 9795-9801. Phương trình 4PL được thể hiện trong cả hai hình và ý nghĩa của tham số như sau: a = tiệm cận thấp hơn, b = hệ số dốc, c = điểm uốn và d = tiệm cận trên.

Hình 1 ràng buộc a bằng 0% và d bằng 100%:

Hình 1 Ràng buộc a & d

Hình 2 không có ràng buộc về 4 tham số trong phương trình 4PL:

Hình 2 Không có ràng buộc

Điều này thật thú vị, tôi không giả vờ biết bất cứ điều gì sinh học và sẽ rất thú vị khi xem tất cả giải quyết như thế nào!


Cảm ơn bạn, điều này thực sự hữu ích. Chỉ cần tự hỏi, bạn đã làm điều này trong MATLAB với chức năng phù hợp?
teaelleceecee

1
Tôi đã sử dụng Igor Pro với chức năng người dùng do người dùng định nghĩa được hiển thị trong các hình. Tôi đã sử dụng Igor Pro và người tiền nhiệm của nó (Igor) từ năm 1988, nhưng rất nhiều chương trình khác có thể thực hiện điều chỉnh đường cong, ví dụ, Origin Pro và Kaleid Đoạn rất rẻ tiền. Và có vẻ như bạn có quyền truy cập R và (có thể?) Vào Matlab, không ai trong số đó tôi biết gì ngoại trừ việc họ cực kỳ có khả năng. Thành công nhất với điều này và tôi hy vọng bạn sẽ nhận được tin tốt vào lần tới khi bạn thảo luận mọi thứ với các giám sát viên! Ngoài ra, cảm ơn bạn đã đăng dữ liệu!
Ed V

2

Tôi đã trích xuất dữ liệu từ biểu đồ phân tán của bạn và tìm kiếm phương trình của tôi đã đưa ra phương trình loại logistic 3 tham số như một ứng cử viên tốt: "y = a / (1.0 + b * exp (-1.0 * c * x))", trong đó " x "là cơ sở nhật ký 10 trên mỗi lô của bạn. Các tham số được trang bị là a = 9.0005947126706630E + 01, b = 1.2831794858584102E + 07 và c = 6.6483431361473155E + 00 cho dữ liệu được trích xuất của tôi, phù hợp với dữ liệu gốc (log 10 x) sẽ mang lại kết quả tương tự nếu bạn phù hợp với dữ liệu gốc dữ liệu gốc sử dụng các giá trị của tôi làm ước tính tham số ban đầu. Các giá trị tham số của tôi đang mang lại R-squared = 0,983 và RMSE = 5.625 trên dữ liệu được trích xuất.

âm mưu

EDIT: Bây giờ câu hỏi đã được chỉnh sửa để bao gồm dữ liệu thực tế, đây là một biểu đồ sử dụng phương trình 3 tham số và ước tính tham số ban đầu ở trên.

lô2


Dường như đã có một lỗi trong quá trình trích xuất dữ liệu của bạn: bạn có một loạt các giá trị phần trăm âm. Ngoài ra, giá trị tối đa của bạn ở khoảng 90% thay vì 100% như trong cốt truyện gốc. Bạn có thể có mọi thứ bù đắp khoảng 10% vì một số lý do.
mkt - Tái lập Monica

Meh - đây là dữ liệu được trích xuất bán thủ công, dữ liệu gốc là bắt buộc. Điều này thường là đủ cho các tìm kiếm phương trình, và tất nhiên không phải cho kết quả cuối cùng - đó là lý do tại sao tôi nói sử dụng các giá trị tham số trích xuất phù hợp của tôi làm ước tính tham số ban đầu trên dữ liệu gốc.
James Phillips

Xin lưu ý rằng vì dữ liệu thực tế hiện đã được thêm vào bài viết, tôi đã cập nhật câu trả lời này bằng cách sử dụng dữ liệu cập nhật.
James Phillips

Chỉ cần nhắc lại: ứng dụng, ví dụ, hàm Heaviside, có thể mang lại các giá trị lỗi tương tự.
Carl Witthoft

1
@JamesPhillips Tôi sẽ cố gắng làm như vậy (Heaviside -> lỗi hoặc tương đương)
Carl Witthoft

2

Vì tôi phải mở miệng về Heaviside, đây là kết quả. Tôi đặt điểm chuyển đổi thành log10 (viruscopies) = 2.5. Sau đó, tôi đã tính độ lệch chuẩn của hai nửa của tập dữ liệu - nghĩa là, Heaviside đang giả sử dữ liệu ở hai bên có tất cả các dẫn xuất = 0.

Phía bên std dev = 4,76
LH bên std dev = 7,72

Vì hóa ra có 15 mẫu trong mỗi lô, nên tiêu chuẩn tổng thể là trung bình, hoặc 6,24.

Giả sử "RMSE" được trích dẫn trong các câu trả lời khác là "lỗi RMS" nói chung, chức năng Heaviside sẽ xuất hiện ít nhất cũng như, nếu không tốt hơn, hầu hết "đường cong Z" (mượn từ danh pháp phản ứng chụp ảnh) phù hợp đây.

biên tập

Đồ thị vô dụng, nhưng được yêu cầu trong các ý kiến:

Phù hợp với đường cong


Woukd bạn vui lòng đăng một mô hình và phân tán tương tự như những gì đã được thực hiện trong các câu trả lời khác? Tôi tò mò nhất để xem những kết quả này và so sánh. Vui lòng thêm các giá trị RMSE và R bình phương để so sánh. Cá nhân tôi chưa bao giờ sử dụng chức năng Heaviside và thấy điều này rất thú vị.
James Phillips

R2

Ý nghĩa của tôi là tạo ra một cốt truyện tương tự như những câu trả lời trong các câu trả lời khác, với mục đích so sánh trực tiếp với những câu trả lời đó.
James Phillips

2
@JamesPhillips bạn còn hai điều ước. Chọn một cách khôn ngoan :-)
Carl Witthoft

Cảm ơn bạn cho cốt truyện. Tôi quan sát rằng trong tất cả các ô trong các câu trả lời khác, phương trình được vẽ theo hình dạng cong của dữ liệu ở phía trên bên phải - bạn không, như bản chất của hàm Heaviside. Điều này trực quan dường như mâu thuẫn với khẳng định của bạn rằng hàm Heaviside sẽ làm tốt như các phương trình được đăng trong các câu trả lời khác - đó là lý do tại sao trước đây tôi đã yêu cầu các giá trị RMSE và R bình phương, tôi nghi ngờ rằng hàm Heaviside sẽ không theo hình dạng của dữ liệu trong khu vực này và có thể mang lại giá trị tồi tệ hơn cho những thống kê phù hợp.
James Phillips
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.