我一直在使用MatLab作为统计工具。我喜欢我可以自己定制和编码的方式。我很高兴地发现,在MatLab中进行加权线性回归相当简单。举一个有点愚蠢的例子,我可以加载"carbig“数据文件,并将美国汽车与其他国家汽车的马力与里程进行比较,但我决定只信任8缸汽车。
load carbig
w=(Cylinders==8)+0.5*(Cylinders~=8)%1 if 8 cylinders, 0.5 otherwise.
for i=1:length(org)
o(i,1)=strcmp(org(i,:),org(1,:));%strcmp only works on one string.
end
x1=Horsepower(o==1)
x2=Horsepower(o==0)
y1=MPG(o==1)
y2=MPG(o==0)
w1=w(o==1)
w2=w(o==0)
lm1=fitlm(x1,y1,'Weights',w1)
lm2=fitlm(x2,y2,'Weights',w2)这样,来自8缸汽车的数据将被算作一个数据点,而来自3,4,5,6缸汽车的数据将被算作半个数据点。
问题是,比较两个回归的明显方法是使用ANCOVA,MatLab有一个函数用于:
aoctool(Horsepower,MPG,o)这个函数比较两组的线性回归,但我还没有找到一种明显的方法来包含权重。
我想我可以更仔细地看看ANCOVA是做什么的,并手动包括权重。有没有更简单的解决方案?
发布于 2016-09-22 20:47:09
我计算出,如果我给“信任”度量权重2,“不信任”度量权重1,用于回归目的,这就等同于为每个信任度量增加1个相同的度量。将权重设置为1和0.5应该执行相同的操作。我可以用一个脚本来做到这一点。
这也增加了相当多的自由度,所以我在n-rank上手动将自由度设置为sum(w)-rank。
x=[];
y=[];
g=[];
w=(Cylinders==8)+0.5*(Cylinders~=8);
df=sum(w)
for i=1:length(w)
while w(i)>0
x=[x;Horsepower(i)];
y=[y;MPG(i)];
g=[g;o(i)];
w(i)=w(i)-0.5
end
end然后,我复制了aoctool.m文件(edit aoctool),并将df的值插入到新文件中的某个位置。它并不优雅,但看起来很管用。
edit aoctool.m
%(insert new df somewhere. Save as aoctool2.m)
aoctool2(x,y,g)https://stackoverflow.com/questions/39633824
复制相似问题