Get Reading Forecast for Individuals
Overview
Given a prior student ability and uncertainty, this function forecasts the students performance on an assessment in the future. This calculation takes into consideration the number of days since the last student assessment and the future assessment. It also takes into consideration an uncertainty associated with the assessment.
Outputs include the students projected ability as measured by the assessment as well as an uncertainty measure associated with this forecast.
Also, this function takes as a parameter an array of cutLevels
.
These are in essence performance milestones, ranked from least to greatest. For each
of these cut levels, this function will provide the probability that a student’s
performance on the assessment will fall into that performance band.
URL
POST /api/forecast/reading
Request
Parameter | Type | Description |
---|---|---|
priorAbility |
Integer | The student’s prior ability estimate. |
priorUncertainty |
Integer | Uncertainty associated with the student’s prior ability estimate. |
testUncertainty |
Number | Uncertainty of the difficulty of the test that student performance is to be forecasted for. MetaMetrics sends this information in spreadsheet format. |
elapsedDays |
Integer | Number of days from the date of the priorAbility
to the date of the future test that is being forecasted. |
cutLevels |
Array | An array of performance levels based on expected future ability levels, measured in Lexile or Quantile. MetaMetrics sends this information in spreadsheet format. |
Response
Parameter | Type | Description |
---|---|---|
ability |
Integer | The student’s forecasted ability estimate. |
uncertainty |
Integer | Uncertainty associated with the student’s forecasted ability estimate. |
probabilities |
Array | The probabilities that the student will fall into each of the
performance bands, as defined by the
cutLevels . |
apiVersion |
String | The current version number for the API. |
framework |
String | Either Lexile or Quantile; framework used to produce the measure. |
Code Examples
The following show an example of the request followed by an example of the response. The Python example is written for use with Python 3 and above.
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.List; import java.util.ArrayList; import org.apache.http.HttpHeaders; import org.apache.http.HttpResponse; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpPost; import org.apache.http.entity.StringEntity; import org.apache.http.impl.client.HttpClientBuilder; import org.json.JSONObject; import org.json.JSONArray; public class ForecastReading { public static void main (String[] args) { try { // Authorization String baseURL = "https://forecast.lexile.com"; String clientId = "your_client_id"; String clientSecret = "your_client_secret"; HttpClient client = HttpClientBuilder.create().build(); HttpPost authPost = new HttpPost(baseURL + "/authToken"); JSONObject jsonInput = new JSONObject(); jsonInput.put("clientId", clientId); jsonInput.put("clientSecret", clientSecret); StringEntity input = new StringEntity(jsonInput.toString()); authPost.setEntity(input); authPost.setHeader(HttpHeaders.CONTENT_TYPE, "application/json"); HttpResponse response = client.execute(authPost); StringBuilder stringBuilder = new StringBuilder(); BufferedReader rd = new BufferedReader(new InputStreamReader(response.getEntity().getContent())); String line; while ((line = rd.readLine()) != null) { stringBuilder.append(line); } JSONObject json = new JSONObject(stringBuilder.toString()); String token = json.getString("accessToken"); Integer expires = json.getInt("expiresIn"); // Forecast Reading example HttpPost postForm = new HttpPost(baseURL + "/api/forecast/reading"); JSONObject postData = new JSONObject(); postData.put("priorAbility", 601); postData.put("priorUncertainty", 60); postData.put("elapsedDays", 45); postData.put("testUncertainty", 50.5); JSONArray cutLevels = new JSONArray(); cutLevels.put(367.5); cutLevels.put(785.5); postData.put("cutLevels", cutLevels); StringEntity formInput = new StringEntity(postData.toString()); postForm.setEntity(formInput); postForm.setHeader(HttpHeaders.AUTHORIZATION, "Bearer " + token); postForm.setHeader(HttpHeaders.CONTENT_TYPE, "application/json"); response = client.execute(postForm); stringBuilder = new StringBuilder(); rd = new BufferedReader(new InputStreamReader(response.getEntity().getContent())); while ((line = rd.readLine()) != null) { stringBuilder.append(line); } JSONObject output = new JSONObject(stringBuilder.toString()); Double ability = output.getDouble("ability"); Double uncertainty = output.getDouble("uncertainty"); List<Double> probabilities = new ArrayList<>(); JSONArray probabilitiesJSON = output.getJSONArray("probabilities"); for(int i = 0; i < probabilitiesJSON.length(); i++) { probabilities.add(probabilitiesJSON.getDouble(i)); } String framework = output.getString("framework"); String apiVersion = output.getString("apiVersion"); } catch(IOException e) { e.printStackTrace(); } } }
# /authToken import requests import json base_url = "https://forecast.lexile.com" client_id = "your_client_id" # replace with your provided client ID client_secret = "your_client_secret" # replace with your provided client secret response = requests.post( f"{base_url}/authToken", data={"clientId": client_id, "clientSecret": client_secret}, ) access_token = response.json()["accessToken"] # use in Authorization header # use these headers to make requests headers = { "Authorization": f"Bearer {access_token}", "Content-Type": "application/json", } # /api/forecast/reading data = { "priorAbility": 500, "priorUncertainty": 100, "elapsedDays": 15, "testUncertainty": 50.5, "cutLevels": [387.5, 785.5], } response = requests.post(f"{base_url}/api/forecast/reading", headers=headers, json=data) response.json() # returns # { # "ability": <float>, # "uncertainty": <float> # "probabilities": <list:float> # "framework": ["lexile" or "quantile"] # "apiVersion": <string> # }