我一直在使用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的功能并手动包含重量。任何更简单的解决方案?
答案 0 :(得分:0)
我想如果我给予"信任"测量重量2,"不信任"测量权重1,出于回归的目的,与每个可信任的测量值具有额外的1个相同测量值相同。将重量设置为1和0.5应该做同样的事情。我可以用脚本做到这一点。
这也增加了相当多的自由度,所以我手动将自由度设置为sum(w)-rank
而不是n-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)