R循环n次

时间:2017-11-18 01:05:56

标签: r for-loop loess

我试图写一个for循环来重复(c)和(d)100次。我想在for循环的每次迭代中打印TRS-TRS0的估计值。它应该停止算法,如果它很小(比如1/10000)。最后,我希望它创建一个图表,其中显示每个值。

我想我在这里拥有一切,但是当我运行它时,我看不到任何事情发生。我错过了什么吗?

for (i in 1:100){
  #c)
  fit1 = loess(res~x2, data=data.frame(res,x1,x2))
  f2=predict(fit1,newdata=data.frame(res,x1,x2))
  res=data$y-mean(data$y) -f2 
  #d)
  fit2 = loess(res~x1, data=data.frame(res,x1,x2))
  f1=predict(fit2,newdata=data.frame(res,x1,x2))
  res=data$y - mean(data$y)-f1

  TSR=sum((data$y-mean(data$y)-f1-f2)^2);TSR
  if (abs(TSR-TSR0) > delta) TSR0=TSR else break
  #continue 
  if (abs(TSR-TSR0) < delta) break
  TSR0=TSR
  val=TSR-TSR0;val
  x11(); plot(x1,f1); plot(x2,f2)
}

要重现,这是创建的数据:

set.seed(3)
x1=runif(300);x2=runif(300)
error=rnorm(300,mean=0,sd=3)
z1=-2+3*x1; z2=2*sin(2*pi*x2) 
data=data.frame(x1,x2,y=z1+z2+error) 
#fit the model
TSR0=0
f10=0;f20=0
res=data$y-mean(data$y) -f10 -f20;
delta=.0001

1 个答案:

答案 0 :(得分:6)

令人困惑的是,当您只将一个名称作为语句执行时(例如在语句print(TSR)中),它通常会将该对象的值输出到控制台。但是,在循环内部,此默认打印被抑制。您需要使用for (i in 1:100) i 明确打印它。

我们可以在一个更简单的例子中看到这种行为。首先尝试这个

for (i in 1:100) print(i)

然后尝试这个

break

这就解释了为什么你看不到任何印刷品。但为什么没有情节?因为循环在到达之前退出TSR0 = TSR。这将始终发生,因为您首先设置TSR - TSR0,然后如果TSR0 = TSR(现在根据定义等于零)小于delta,则中断。我认为您需要在测试它们之间的差异后才设置class EmployeeForm(forms.ModelForm): password = forms.CharField(widget=forms.PasswordInput) class Meta: model = models.Employee fields = ('name', 'designation', 'section', 'phone_number', 'mobile_number', 'email', 'gender', 'role', 'username', 'password', 'avatar',) def employee(request): form = EmployeeForm(request.POST or None) if request.method == "POST" and form.is_valid(): username = form.cleaned_data['username'] password = form.cleaned_data['password'] email = form.cleaned_data['email'] office_instance = OfficeSetup.objects.get(owner=request.user) form = form.save(commit=False) form.office = office_instance user = User.objects.create_user( username=username, password=password, email=email) user.save() form.save() messages.success(request, 'Thank you') return redirect('employee-list') messages.warning(request, 'Error') context = { 'form': form } return render(request, 'dashboard/hrm/employee.html', context) ,而不是之前。