You can use a stratified counting process model for recurrent events. This will treat the different levels as separate events that can only occur in their proper sequence. The data layout should be like this:
id level t0 t1 event x1 x2
1 1 0 4 1 0 43
1 2 4 6 1 0 43
1 3 6 12 1 0 43
1 4 12 15 1 0 43
2 1 0 3 1 1 37
2 2 3 12 1 1 37
2 3 12 14 1 1 37
2 4 14 16 0 1 37
3 1 0 12 1 0 21
3 2 12 16 0 0 21
id is the unique identifier for each subject. Level is a factor representing beginner/intermediate/advanced/proficient. t0 is the starting times and t1 end times. As you can see, when a new level is reached, a new row start with t0 as the time when the event occurred and t1 when the next level occurs, or when the study ends (at week 16 in this case). Event is when a level is reached. x1 is a binary independent variable and x2 is a continuous independent variable, both of which will be included in the analysis.
So subject 1 reached the beginner level at week 4, intermediate at week 6, advanced at week 12 and proficient at week 15. Since this is the last level, subject 1 is eliminated from the risk set after week 15. Subject 2 reaches beginner level at week 3, intermediate level at week 12 and advanced level at week 14. Subject 2 still hasn't reached proficient level at week 16 which is the last week of the study. Poor subject 3 reaches beginner level at week 12, and by the end of the study he/she still hasn't reached the next level and is censored at week 16.
The model, using R code, might look like this:
coxph(Surv(t0, t1, event) ~ strata(level) + x1 + x2 + cluster(id))
The cluster is a way to adjust the standard errors to take into account that there are multiple rows per subject.
Using this approach, you will assume that x1 and x2 have the same effects (hazard ratios) for all the events to occur, and this may or may not be a reasonable assumption. If you think there are different effects of the independent variables per level, I think you can either do separate analyses or you might be able to include interaction terms between the independent variables and the level variable (used as dummy variables). I haven't tried this, but I think it should work the way you want to. The code in R would then be something like this:
coxph(Surv(t0, t1, event) ~ strata(level) + x1*factor(level) +
x2*factor(level) + cluster(id))
As I said, I'm not entirely sure this would work, but I think so. But you will have an additional six parameters to estimate in this scenario (three per interaction), so sample size might become an issue depending on the size of your data.
Finally, one thing I haven't addressed is that you only measure individuals once per week and not daily. This is called interval censoring. I'm haven't worked with interval censored data so I may be wrong, but I think it's acceptable to assume that the test result marks the progress to the next level even though we don't know the exact date when the subject progressed. The alternative is to take the mean between the last test and the test when a new level is reached, but I can't see why that would be a preferable approach. But on a second thought, if a student misses one or more tests, and then progresses, it might be more reasonable to assume that progress happened midway between the tests. Anyway, I think you should choose one approach and then also do the other one as a sensitivity analysis to make sure that it doesn't affect your results.
I can recommend the books Survival Analysis: A Self-Learning Text by Kleinbaum and Klein as an accessible text to learn more about this.
I hope this helps!