【发布时间】:2016-05-09 19:08:15
【问题描述】:
您好,我是 R 的初学者,我正在尝试编写一个用于敏感性分析的函数,该函数从样本“X”(一个包含 12 列和每个 2500 个观察值的数据表)返回一个包含 2500 个值的向量,称为 Global成本(每行一个)。它确实可以正常工作,但问题是应该为每一行重新计算的 j1、j2 和 j3(对于 while 循环)用第一个“行”修复 > 变量,因此只有第一个结果实际上是正确的。
lcc<-function(X){
#initial costs
globalcost<-(X[,3]+X[,4]+X[,5]);
#replacement costs 1
j1<-X[,6];
while(j1<30){globalcost<-globalcost+((X[,3]*((1/(1+((X[,2]-X[,1])/(1+X[,1]))))^j1)));j1<-j1+j1};
#replacement costs 2
j2<-X[,7];
while(j2<=30){globalcost<-globalcost+((X[,4]*((1/(1+((X[,2]-X[,1])/(1+X[,1]))))^j2)));j2<-j2+j2};
#replacement costs 3
j3<-X[,8];
while(j3<=30){globalcost<-globalcost+((X[,5]*((1/(1+((X[,2]-X[,1])/(1+X[,1]))))^j3)));j3<-j3+j3};
#energy costs
globalcost<-globalcost+((5375.81*0.0507*X[,12])*((1-(1+((X[,2]-X[,1])/(1+X[,1])))^-30)/((X[,2]-X[,1])/(1+X[,1]))));
#maintenance costs 1
globalcost<-globalcost+(X[,9]*((1-(1+((X[,2]-X[,1])/(1+X[,1])))^-30)/((X[,2]-X[,1])/(1+X[,1]))));
#maintenance costs 1
globalcost<-globalcost+(X[,10]*((1-(1+((X[,2]-X[,1])/(1+X[,1])))^-30)/((X[,2]-X[,1])/(1+X[,1]))));
#maintenance costs 3
globalcost<-globalcost+(X[,11]*((1-(1+((X[,2]-X[,1])/(1+X[,1])))^-30)/((X[,2]-X[,1])/(1+X[,1]))));
#result
return(globalcost)}
我试图创建一个这样的“for循环”
lcc<-function(X){
for (i in 1:2500){
#initial costs
globalcost<-(X[i,3]+X[i,4]+X[i,5]);
#replacement costs 1
j1<-X[i,6];
while(j1<30){globalcost<-globalcost+((X[i,3]*((1/(1+((X[i,2]-X[i,1])/(1+X[i,1]))))^j1)));j1<-j1+j1};
#replacement costs 2
j2<-X[i,7];
while(j2<=30){globalcost<-globalcost+((X[i,4]*((1/(1+((X[i,2]-X[i,1])/(1+X[i,1]))))^j2)));j2<-j2+j2};
#replacement costs 3
j3<-X[i,8];
while(j3<=30){globalcost<-globalcost+((X[i,5]*((1/(1+((X[i,2]-X[i,1])/(1+X[i,1]))))^j3)));j3<-j3+j3};
#energy costs
globalcost<-globalcost+((5375.81*0.0507*X[i,12])*((1-(1+((X[i,2]-X[i,1])/(1+X[i,1])))^-30)/((X[i,2]-X[i,1])/(1+X[i,1]))));
#maintenance costs 1
globalcost<-globalcost+(X[i,9]*((1-(1+((X[i,2]-X[i,1])/(1+X[i,1])))^-30)/((X[i,2]-X[i,1])/(1+X[i,1]))));
#maintenance costs 1
globalcost<-globalcost+(X[i,10]*((1-(1+((X[i,2]-X[i,1])/(1+X[i,1])))^-30)/((X[i,2]-X[i,1])/(1+X[i,1]))));
#maintenance costs 3
globalcost<-globalcost+(X[i,11]*((1-(1+((X[i,2]-X[i,1])/(1+X[i,1])))^-30)/((X[i,2]-X[i,1])/(1+X[i,1]))));}
#risultato
return(globalcost)}
但在这种情况下,函数返回“globalcost”仅针对最后一行!
然后我必须把这个函数放在sobolx <- sobol(model = lcc, X1 = X1, X2 = X2, order = 2, nboot = 100)中以获得敏感性分析
谢谢你..!
【问题讨论】:
-
您到底想用
while(j1<30)实现什么?您只想将条件应用于值低于30的j1?因为这不是你在这里实现的目标。 -
如果数字 (
j1=X[,6]) 小于 30 则应进行替换计算,并像这样重复: CALC^ j1 + CALC^ j1+j1 + CALC^ j1+j1+j1 如果 j1>30 则中断 -
啊,是的,我正在阅读第一个脚本,但它没有实现这一点(因为你提供了一个完整的向量),但它应该适用于第二个脚本。
标签: r function loops while-loop dataframe