係数の和=0の制約をいれる場合。
##Fit with categorical variable 2 x0<-sample(1:4,100,replace=T) library(dummies) x<-dummy(x0) x1<-x[,1] x2<-x[,2] x3<-x[,3] x4<-x[,4] a1<-2 a2<--2 a3<-10 a4<--10 y<-a1*x1+a2*x2+a3*x3+a4*x4+rnorm(100,sd=0.03) #library("rstan") data<-list(y=y,x2=x2,x1=x1,x3=x3,x4=x4,N=100,K=4) fit<-stan(file="lm4.stan",data=data,seed=1234) summary(fit)$summary
Rstan lm4.stan
data{ int N; int K; real y[N]; real x1[N]; real x2[N]; real x3[N]; real x4[N]; } parameters { real a[K-1]; real b; real <lower=0> sigma; real <lower=0,upper=0.1> sigma_a; } transformed parameters{ real y_base[N]; real aa[K]; real sum1=0; for(i in 1:(K-1)){ aa[i]=a[i]; sum1=sum1+aa[i]; } aa[K]=0-sum1; for(i in 1:N){ y_base[i]=aa[1]*x1[i]+aa[2]*x2[i]+aa[3]*x3[i]+aa[4]*x4[i]+b; } } model { for(i in 1:N){ y[i] ~ normal(y_base[i],sigma); } }
カテゴリが0の制約を入れる場合
a1x1+a2x2+a3x4+a4x4=0;
##Fit with categorical variable 2 x0<-sample(1:4,100,replace=T) library(dummies) x<-dummy(x0) x1<-x[,1] x2<-x[,2] x3<-x[,3] x4<-x[,4] a1<-2 a2<--2 a3<-10 a4<--10 y<-a1*x1+a2*x2+a3*x3+a4*x4+rnorm(100,sd=0.03) data<-list(y=y,x2=x2,x1=x1,x3=x3,x4=x4,N=100,K=4) fit<-stan(file="lm5.stan",data=data,seed=1234) summary(fit)$summary ms<- rstan::extract(fit) apply(ms$aa2,2,mean)
lm5.stan
data{ int N; int K; real y[N]; real x1[N]; real x2[N]; real x3[N]; real x4[N]; } parameters { real a[K-1]; real b; real <lower=0> sigma; real <lower=0,upper=0.1> sigma_a; } transformed parameters{ real y_base[N]; real aa[K]; real sum1=0; for(i in 1:(K-1)){ aa[i]=a[i]; // sum1=sum1+aa[i]; } aa[K]= -(aa[1]*sum(x1)+aa[2]*sum(x2)+aa[3]*sum(x3))/sum(x4); for(i in 1:N){ y_base[i]=aa[1]*x1[i]+aa[2]*x2[i]+aa[3]*x3[i]+aa[4]*x4[i]+b; } } model { for(i in 1:N){ y[i] ~ normal(y_base[i],sigma); } }