如何告诉Matlab忽略nan计算/循环吗

101(30天)
Tobi83
Tobi83 2012年8月8日
你好,我想做一些与Matlab操作但我需要忽略generatedmissing值/ nan Matlab给出了在阅读从excel的数据。因为现在的代码是只把空细胞,并将其复制到新的表格。相反,nan应该被忽略。(我复制一个金融论文利用动量策略描述Jegadeesh / Titman (1993))。下面的代码发布
代码是采取部分从纸是完全相同的主题。我只有一些汉。我不能删除所有的列一些nan。
谢谢你的任何有用的评论
是使用的代码
% [stockdata] = xlsread (' Argentina.xlsm ', 1);
% [stockid] = xlsread (' Argentina.xlsm ', 1);
s = 1 +(1 -(1))。*兰德(715215);
stockdata = ' (s);
stockdata (stockdata > 0.5) =南;
stockid = [1:715];
[totalmonths,森]=大小(stockdata);%的月数,数量的股票
period1 = 6;%的订单周期
period2 = 6;%持有期
startmonth = 14;
我= 1:totalmonths
nbrstocks (i) =森- sum (isnan (stockdata(我,:)));
结束
i = 1:长度(period1)
j = 1:长度(period2)
p1 = period1(我);
p2 = period2 (j);
Rwinner = 0 (totalmonths, 1);
Rloser = 0 (totalmonths, 1);
idwinner = 0 (totalmonths轮(max (nbrstocks) * 0.33));%空矩阵为赢家
idloser = 0 (totalmonths轮(max (nbrstocks) * 0.33));%空矩阵为失败者
k = startmonth: totalmonths + 1-p1-p2%从开始到结束循环
start1 = k;
stop1 = start1 + p1-1;
ordermonths = start1: stop1;
start2 = stop1 + 1;
stop2 = start2 + p2-1;
holdmonths = start2: stop2;
nstocks = nbrstocks (k);
%订单订购周的R
data1 = stockdata (ordermonths 1: nstocks);
R1 = 1 (1、nstocks);
m = 1:长度(ordermonths)
R1 = R1。* data1 (m:);
结束
R1 = R1-1;
%选择赢家和输家
[B, idx] =排序(R1,“下”);
ncandidates =圆(nstocks * 0.33);
idwinner (k, 1: ncandidates) = stockid (idx (1: ncandidates));
idloser (k, 1: ncandidates) = stockid (idx (end-ncandidates + 1:结束);
%各行各业赢家和输家的R个月
data2winner = stockdata (holdmonths idx (1: ncandidates));
data2loser = stockdata (holdmonths idx (end-ncandidates + 1:结束);
ncandidates R2w = 1 (1);
ncandidates R2l = 1 (1);
m = 1:长度(holdmonths)
R2w = R2w。* data2winner (m:);
R2l = R2l。* data2loser (m:);
结束
R2w = R2w-1;
R2l = R2l - 1;
Rwinner (k) =意味着(R2w);
Rloser (k) =意味着(R2l);
结束
xlswrite (fullfile ([“strategy_”num2str (p1)“_”num2str (p2)“_”.xlsx”Rwinner]),“Rwinner”);
xlswrite (fullfile ([“strategy_”num2str (p1)“_”num2str (p2)“_”.xlsx”Rloser]),“Rloser”);
xlswrite (fullfile ([“strategy_”num2str (p1)“_”num2str (p2)“_”.xlsx”idwinner]),“idwinner”);
xlswrite (fullfile ([“strategy_”num2str (p1)“_”num2str (p2)“_”.xlsx”idloser]),“idloser”);
结束
结束

答案(4)

奥列格•科马罗夫
奥列格•科马罗夫 2012年8月8日
编辑:奥列格•科马罗夫 2012年8月9日
如果你有统计或金融工具箱,使用 nanmean ()
编辑
你想怎么处理:
%订单订购周的R
data1 = stockdata (ordermonths 1: nstocks);
R1 = 1 (1、nstocks);
m = 1:长度(ordermonths)
R1 = R1。* data1 (m:);
结束
R1 = R1-1;
累计回报呢?然后将nan设置为1。
idx = isnan (data1);
data1 (idx) = 1;
R1 = prod (data1) - 1;
不需要循环,因为 刺激() 是矢量化。
应用相同的概念:
%各行各业赢家和输家的R个月
data2winner = stockdata (holdmonths idx (1: ncandidates));
data2loser = stockdata (holdmonths idx (end-ncandidates + 1:结束);
ncandidates R2w = 1 (1);
ncandidates R2l = 1 (1);
m = 1:长度(holdmonths)
R2w = R2w。* data2winner (m:);
R2l = R2l。* data2loser (m:);
结束
R2w = R2w-1;
R2l = R2l - 1;
然后使用 nanmean ()
6个评论

登录置评。


艾伯特山药
艾伯特山药 2012年8月8日
如何低水平。在循环的开始(或在适用情况下),
如果任何(isnan(变量))
继续
结束
4评论
Tobi83
Tobi83 2012年8月9日
再次谢谢你的帮助。我试着这样
如果任何(isnan (R1))
继续
[B, idx] =排序(R1,“下”);
结束
但这给了我一个RWinner 0。我用这个数据结合上面的代码
s = 1 +(1 -(1))。*兰德(715215);
stockdata = ' (s);
stockdata (stockdata > 0.5) =南;
stockid = [1:715];

登录置评。


塞巴斯蒂安Holmqvist
塞巴斯蒂安Holmqvist 2012年8月9日
data_vec =(1 2 3 4 5南7 8南十12);
data_vec (~ isnan (data_vec))
ans =
1 2 3 4 5 7 8 10 12
3评论
Tobi83
Tobi83 2012年8月9日
再次感谢。这并不工作,因为元素的数量必须一致
R1 = R1。* data1 (m:);
模拟数据看上去就像我使用的复制和使用它,而不是xlsread命令:
s = 1 +(1 -(1))。*兰德(715215);
stockdata = ' (s);
stockdata (stockdata > 0.5) =南;
stockid = [1:715];

登录置评。


borge
borge 2012年12月6日
嗨Tobi83,
我尝试做一个类似的分析我试图编译代码类似于你的,但遇到了同样的问题,所以我想知道你的代码最终看起来像吗?
提前感谢!
最好,borge

社区寻宝

找到宝藏在MATLAB中央,发现社区如何帮助你!

开始狩猎!