แก้ไข: ตอนแรกฉันคิดว่า OP รู้ว่าการสังเกตมาจากเผ่าพันธุ์ใด การแก้ไขของ OP ทำให้ชัดเจนว่าวิธีดั้งเดิมของฉันไม่สามารถทำได้ ฉันจะทิ้งไว้เพื่อลูกหลาน แต่คำตอบอื่น ๆ ดีกว่ามาก เพื่อเป็นการปลอบใจฉันได้เขียนแบบจำลองส่วนผสมขึ้นในสแตน ฉันไม่ได้บอกว่าวิธีการแบบเบย์นั้นดีเป็นพิเศษในกรณีนี้ แต่มันก็เป็นสิ่งที่ฉันสามารถมีส่วนร่วมได้
รหัสสแตน
data{
//Number of data points
int N;
real y[N];
real x[N];
}
parameters{
//mixing parameter
real<lower=0, upper =1> theta;
//Regression intercepts
real beta_0[2];
//Regression slopes.
ordered[2] beta_1;
//Regression noise
real<lower=0> sigma[2];
}
model{
//priors
theta ~ beta(5,5);
beta_0 ~ normal(0,1);
beta_1 ~ normal(0,1);
sigma ~ cauchy(0,2.5);
//mixture likelihood
for (n in 1:N){
target+=log_mix(theta,
normal_lpdf(y[n] | beta_0[1] + beta_1[1]*x[n], sigma[1]),
normal_lpdf(y[n] | beta_0[2] + beta_1[2]*x[n], sigma[2]));
}
}
generated quantities {
//posterior predictive distribution
//will allow us to see what points belong are assigned
//to which mixture
matrix[N,2] p;
matrix[N,2] ps;
for (n in 1:N){
p[n,1] = log_mix(theta,
normal_lpdf(y[n] | beta_0[1] + beta_1[1]*x[n], sigma[1]),
normal_lpdf(y[n] | beta_0[2] + beta_1[2]*x[n], sigma[2]));
p[n,2]= log_mix(1-theta,
normal_lpdf(y[n] | beta_0[1] + beta_1[1]*x[n], sigma[1]),
normal_lpdf(y[n] | beta_0[2] + beta_1[2]*x[n], sigma[2]));
ps[n,]= p[n,]/sum(p[n,]);
}
}
เรียกใช้โมเดลของสแตนจาก R
library(tidyverse)
library(rstan)
#Simulate the data
N = 100
x = rnorm(N, 0, 3)
group = factor(sample(c('a','b'),size = N, replace = T))
y = model.matrix(~x*group)%*% c(0,1,0,2)
y = as.numeric(y) + rnorm(N)
d = data_frame(x = x, y = y)
d %>%
ggplot(aes(x,y))+
geom_point()
#Fit the model
N = length(x)
x = as.numeric(x)
y = y
fit = stan('mixmodel.stan',
data = list(N= N, x = x, y = y),
chains = 8,
iter = 4000)
ผล
เส้นประคือความจริงพื้นฐานเส้นทึบถูกประมาณไว้
คำตอบเดิม
หากคุณรู้ว่าตัวอย่างใดมาจากดอกแดฟโฟดิลชนิดใดคุณสามารถประมาณค่าปฏิสัมพันธ์ระหว่างพันธุ์และดินค่า PH
โมเดลของคุณจะมีหน้าตาเป็นอย่างไร
y=β0+β1variety+β2PH+β3variety⋅PH
นี่คือตัวอย่างใน R. ฉันได้สร้างข้อมูลบางอย่างที่มีลักษณะดังนี้:
เห็นได้ชัดว่ามีสองสายที่แตกต่างกัน นี่คือวิธีประมาณเส้นโดยใช้การถดถอยเชิงเส้น
library(tidyverse)
#Simulate the data
N = 1000
ph = runif(N,5,8)
species = rbinom(N,1,0.5)
y = model.matrix(~ph*species)%*% c(20,1,20,-3) + rnorm(N, 0, 0.5)
y = as.numeric(y)
d = data_frame(ph = ph, species = species, y = y)
#Estimate the model
model = lm(y~species*ph, data = d)
summary(model)
และผลที่ได้คือ
> summary(model)
Call:
lm(formula = y ~ species * ph, data = d)
Residuals:
Min 1Q Median 3Q Max
-1.61884 -0.31976 -0.00226 0.33521 1.46428
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 19.85850 0.17484 113.58 <2e-16 ***
species 20.31363 0.24626 82.49 <2e-16 ***
ph 1.01599 0.02671 38.04 <2e-16 ***
species:ph -3.03174 0.03756 -80.72 <2e-16 ***
---
Signif. codes:
0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.4997 on 996 degrees of freedom
Multiple R-squared: 0.8844, Adjusted R-squared: 0.8841
F-statistic: 2541 on 3 and 996 DF, p-value: < 2.2e-16
สำหรับสปีชีส์ที่มีป้ายกำกับ 0 บรรทัดจะอยู่ที่ประมาณ
y=19+1⋅PH
สำหรับสปีชีส์ที่มีป้ายกำกับ 1 บรรทัดจะอยู่ที่ประมาณ
y=40−2⋅PH