Hãy để vật lý (của thí nghiệm và thiết bị đo) hướng dẫn bạn.
Cuối cùng, độ hấp thụ được xác định bằng cách đo lượng bức xạ đi qua môi trường và các phép đo đó được đưa xuống để đếm các photon. Khi môi trường là vĩ mô, dao động nhiệt động trong nồng độ là không đáng kể nên nguồn lỗi chính nằm ở việc đếm. Lỗi này (hoặc "tiếng ồn bắn" ) có phân phối Poisson . Điều này ngụ ý sai số tương đối lớn ở nồng độ cao khi có ít bức xạ đi qua.
Với sự chăm sóc đầy đủ trong phòng thí nghiệm, nồng độ thường được đo cực kỳ chính xác, vì vậy tôi sẽ không lo lắng về sai sót về nồng độ.
Độ hấp thụ chính nó liên quan trực tiếp đến logarit của bức xạ đo được . Lấy logarit phát sinh số lượng lỗi trên toàn bộ phạm vi nồng độ có thể. Vì lý do này thôi, tốt nhất là phân tích độ hấp thụ theo các giá trị thông thường của nó thay vì thể hiện lại chúng. Cụ thể, chúng ta nên tránh ghi nhật ký độ hấp thụ, mặc dù điều đó sẽ đơn giản hóa biểu hiện của luật Bia-Lambert.
Chúng ta cũng nên cảnh giác với các phi tuyến tính có thể. Đạo hàm của Luật Bia-Lambert cho thấy đường cong hấp thụ và nồng độ sẽ trở thành phi tuyến ở nồng độ cao. Một số cách để phát hiện hoặc kiểm tra điều này là cần thiết.
Những cân nhắc này cho thấy một quy trình đơn giản để phân tích một loạt các cặp nồng độ và độ hấp thụ đo được:(Ci,Ai)
Ước tính hệ số là trung bình số học của , .κA/Cκ^=∑iAiCi
Dự đoán độ hấp thụ ở mỗi nồng độ theo hệ số ước tính:A^(C)=κ^C.
Kiểm tra phần dư phụ gia để biết xu hướng phi tuyến tính trong .Ai−Ai^Ci
Tất nhiên tất cả điều này chỉ là lý thuyết và hơi suy đoán - chúng tôi không có bất kỳ dữ liệu thực tế nào để phân tích - nhưng đó là một nơi hợp lý để bắt đầu. Nếu kinh nghiệm trong phòng thí nghiệm lặp đi lặp lại cho thấy dữ liệu khởi hành từ các hành vi thống kê được mô tả ở đây, thì một số sửa đổi của các quy trình này sẽ được yêu cầu.
Để minh họa những ý tưởng này, tôi đã tạo ra một mô phỏng thực hiện các khía cạnh chính của phép đo, bao gồm nhiễu Poisson và có thể là các phản ứng phi tuyến. Bằng cách chạy nó nhiều lần, chúng ta có thể quan sát loại biến thể có thể gặp phải trong phòng thí nghiệm. Dưới đây là kết quả của một lần chạy mô phỏng. (Các mô phỏng khác có thể được thực hiện đơn giản bằng cách thay đổi hạt giống bắt đầu trong mã bên dưới và sửa đổi các tham số khác nhau theo ý muốn.)

Thí nghiệm mô phỏng này đã đo độ hấp thụ ở nồng độ từ đến . Các chênh lệch dọc trong các giá trị rõ ràng trong biểu đồ phân tán cho thấy ảnh hưởng của (a) nhiễu bắn trong các phép đo truyền và (b) nhiễu bắn trong phép đo truyền ban đầu ở nồng độ bằng không. (Lưu ý cách điều này thực sự tạo ra một số giá trị độ hấp thụ âm .) Mặc dù các lỗi kết quả sẽ không có cùng phân phối chính xác ở mỗi nồng độ, chênh lệch gần bằng nhau là bằng chứng thực nghiệm cho thấy các phân phối đủ gần giống như chúng ta cần ' T lo lắng về điều đó. Nói cách khác, không cần phải cân trọng lượng của chất hấp thụ theo nồng độ.11/32
Đường chéo màu đỏ đã được ước tính từ tất cả 50 mô phỏng. Nó có độ dốc , khác một chút so với độ dốc chính xác vật lý là được sử dụng trong các mô phỏng. Độ lệch này quá lớn vì tôi cho rằng có rất ít bức xạ cần đo; số lượng photon tối đa chỉ là . Trong thực tế, số lượng tối đa có thể lớn hơn nhiều bậc, dẫn đến ước tính độ dốc rất chính xác - nhưng sau đó chúng ta sẽ không học được nhiều từ con số này!κ^=2.1321000
Biểu đồ của phần dư có vẻ không tốt: nó bị lệch sang phải. Điều này chỉ ra một số loại rắc rối. Rắc rối đó không đến từ sự bất cân xứng trong phần dư ở mỗi nồng độ; thay vào đó, nó đến từ sự thiếu phù hợp. Điều đó thể hiện rõ ở các ô vuông ở bên phải: mặc dù năm trong số chúng đầu tiên xếp hàng gần như theo chiều ngang, cái cuối cùng - ở nồng độ cao nhất - rõ ràng khác nhau về vị trí (quá cao) và tỷ lệ (quá dài) . Kết quả này từ một phản ứng phi tuyến tôi đã tích hợp vào mô phỏng. Mặc dù tính phi tuyến có mặt trong toàn bộ phạm vi nồng độ, nhưng nó chỉ có tác dụng rõ rệt ở nồng độ cao nhất. Điều này ít nhiều sẽ xảy ra trong phòng thí nghiệm. Tuy nhiên, chỉ với một lần hiệu chỉnh có sẵn, chúng tôi không thể vẽ các ô như vậy. Xem xét phân tích nhiều lần chạy độc lập nếu sự phi tuyến tính có thể là một vấn đề.
Các mô phỏng đã được thực hiện trong R
. Tuy nhiên, các tính toán với dữ liệu thực tế rất đơn giản để thực hiện bằng tay hoặc bằng bảng tính: chỉ cần đảm bảo kiểm tra phần dư cho độ phi tuyến.
#
# Simulate instrument responses:
# `concentration` is an array of concentrations to use.
# `kappa` is the Beer-Lambert law coefficient.
# `n.0` is the largest expected photon count (at 0 concentration).
# `start` is a tiny positive value used to avoid logs of zero.
# `beta` is the amount of nonlinearity (it is a quadratic perturbation
# of the Beer-Lambert law).
# The return value is a parallel array of measured absorbances; it is subject
# to random fluctuations.
#
observe <- function(concentration, kappa=1, n.0=10^3, start=1/6, beta=0.2) {
transmission <- exp(-kappa * concentration - beta * concentration^2)
transmission.observed <- start + rpois(length(transmission), transmission * n.0)
absorbance <- -log(transmission.observed / rpois(1, n.0))
return(absorbance)
}
#
# Perform a set of simulations.
#
concentration <- 2^(-(0:5)) # Concentrations to use
n.iter <- 50 # Number of iterations
set.seed(17) # Make the results reproducible
absorbance <- replicate(n.iter, observe(concentration, kappa=2))
#
# Put the results into a data frame for further analysis.
#
a.df <- data.frame(absorbance = as.vector(absorbance))
a.df$concentration <- concentration # ($ interferes with TeX processing on this site)
#
# Create the figures.
#
par(mfrow=c(1,3))
#
# Set up a region for the scatterplot.
#
plot(c(min(concentration), max(concentration)),
c(min(absorbance), max(absorbance)), type="n",
xlab="Concentration", ylab="Absorbance",
main=paste("Scatterplot of", n.iter, "iterations"))
#
# Make the scatterplot.
#
invisible(apply(absorbance, 2,
function(a) points(concentration, a, col="#40404080")))
slope <- mean(a.df$absorbance / a.df$concentration)
abline(c(0, slope), col="Red")
#
# Show the residuals.
#
a.df$residuals <- a.df$absorbance - slope * a.df$concentration # $
hist(a.df$residuals, main="Histogram of residuals", xlab="Absorbance Difference") # $
#
# Study the residual distribution vs. concentration.
#
boxplot(a.df$residuals ~ a.df$concentration, main="Residual distributions",
xlab="Concentration")